(2) service() 方法
service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。
(3)doGet()方法
当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。
(4)doPost()方法
当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。
(5) destroy() 方法
destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。
(6) GetServletConfig()方法
GetServletConfig()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关servlet 的环境信息。
(7) GetServletInfo()方法
GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如作者、版本、版权。(2)对doGet()或doPost()方法同步。如果必须在Servlet中使用同步代码,应尽量在最小的代码块范围上进行同步。同步代码越小,Servlet执行得才越好。
helloWord:
/**
* servlet中的生命周期
* @author Always
*
*/
public class Servlet_01 implements Servlet{
public void destroy() {
System.out.println("Servlet_01.destroy()");
}
public ServletConfig getServletConfig() {
System.out.println("Servlet_01.getServletConfig()");
return getServletConfig();
}
public String getServletInfo() {
System.out.println("Servlet_01.getServletInfo()");
return getServletInfo();
}
public void init(ServletConfig config) throws ServletException {
System.out.println("Servlet_01.init()");
}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("Servlet_01.service()");
}
}
Servlet_01
com.enterise.always.servlet.Servlet_01
Servlet_01
/servlet/Servlet_01
Servlet_01.init()
Servlet_01.service()
在当前浏览器上再次输入请求,后台的打印数据:
Servlet_01.service();
在其它浏览器上再次输入请求,后台的打印数据:
Servlet_01.service();
也就是说,init方法在整个生命周期中只执行一次。
每次浏览器发出请求,都会调用service()方法。
在开发中我们通常不会直接实现Servlet接口,而是通过继承Servlet的默认实现类GenericServlet来实现,此时只需要覆写我们感兴趣的方法即可,一般情况下,我们只需要覆写service方法
在web开发中,由于使用http协议,程序员在编写servlet时,一般都
是继承GenericServlet的子类HttpServlet
在HttpServlet中覆写了service方法,该方法体内的代码会自动判断
用户的请求方式,如为GET方式,则调用doGet方法,如为post方式,
则调用doPost方法。因此,在开发中,我们完全没有必要覆写service
方法,直接根据请求方式覆写对应的doGet和doPost方法即可
HttpServlet在调用doGet和doPost方法之前,会将ServletRequest
和ServletResponse对象强转成子类来传递
HttpServletRequest和HttpServletResponse
/**
* GenericServlet
* @author Always
*
*/
public class Servlet_02 extends GenericServlet{
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
}
}
public class Servlet_03 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/** 父类 子类
*ServletRequest HttpServletRequest
*ServletResponse HttpServletResponse
*/
}
}