读取客户端(浏览器)发送的数据,接收数据并处理过后将数据返回给客户端(浏览器),即用于实现服务端业务逻辑。
Servlet主要提供5个方法,而通常需要我们实现的方法只有两个:doGet()和doPost()方法。
只能被调用一次。在第一次创建Servlet时被调用,在后续每次用户请求时不再调用。
一般Servlet在用户第一次调用对应于该Servlet的URL时创建,但也可以指定Servlet在服务器第一次启动的时候加载。
多个用户请求同一个URL时,不会创建多个Servlet,每一用户的请求都会创建一个新的线程,适当的时候移交给doGet()和doPost()方法。
service()方法是执行实际任务的主要方法。Servlet容器(Web服务器)调用service()方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
service()方法不需要程序员来写,它由容器调用,并在适当的时候调用doGet()、doPost()、doPut()、doDelete()等方法。程序员只需要写doGet()和doPost()方法即可。
注意:Servlet采用多线程来处理多个请求的访问,默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间。
destroy()方法同样只会被调用一次,在Servlet生命周期结束时调用。可以在destroy()中处理关闭数据库连接、停止后台线程、把数据写入磁盘等操作。destroy()之后Servlet对象将被垃圾回收机制回收。
用来处理客户端请求,根据客户端请求类型的不同调用不同的方法。详细情况如下。
例如有一个URL请求:http://localhost:8080/TomcatTest/HelloServlet?key1=value1&key2=velue2
这时Servlet会调用doGet()方法处理:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 处理中文
String value1 =new String(request.getParameter("key1").getBytes("ISO8859-1"),"UTF-8");
out.println("<!DOCTYPE html> \n" +
"<html>\n" +
"<body>\n" +
"<ul>\n" +
" <li><b>key1</b>:" + value1 + "\n" +
" <li><b>key2</b>:" + request.getParameter("key2") + "\n" +
"</ul>\n" +
"</body></html>");
}
如果上面的请求指定的提交方式为POST(URL中不再拼接key-value对),那么Servlet会调用doPost()方法来处理。当然,业务逻辑一摸一样,所以doPost()方法完全可以如下:
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
doGet(request, response);
}
注意:Servlet提供了三个方法来获取数据:
HTTP请求中一些信息保存在http请求头中。这些信息不能直接被读取,需要通过HttpServletRequest 对象的特定方法来获取。
具体的HTTP头信息和HttpServletRequest获取方法可以查看相关文档,下面是一个实例:
// 处理 GET 方法请求的方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html> \n"+
"<html>\n" +"<body>\n" +"<table>\n");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
out.println("</table>\n</body></html>");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
通过 HttpServletResponse 对象相关方法可以设置返回时的HTTP头信息。相应的方法可以查看相关文档,下面是一个实例:
// 处理 GET 方法请求的方法
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException{
// 设置刷新自动加载时间
response.setIntHeader("Refresh", 5);
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
//获得一个日历
Calendar cale = Calendar.getInstance();
//将Calendar类型转换成Date类型
Date tasktime=cale.getTime();
//设置日期输出的格式
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//格式化输出
String nowTime = df.format(tasktime);
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>\n" +
"<html>\n" +"<body\n" +
"<p>当前时间是:" + nowTime + "</p>\n"+"</body></html>");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
HTTP有几十个状态码,如常见的400和404。Servlet可以设置状态码。通过HttpServletResponse 对象提供的一些方法来实现。
一个示例:
//处理 GET 方法请求的方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
// 设置错误代码和原因
response.sendError(407, "需要认证!" );
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}