一、Servlet生命周期
Servlet运行在Servlet容器中,其生命周期由容器全盘控制。容器会创建请求和响应对象、为Servlet分配一个线程、调用servlet的service()方法,并传递请求和响应对象的引用作为参数。
当应用加载并使用一个Servlet时,从初始化到销毁这个Servlet期间会发生一系列的事件,这些事件叫做Servlet的生命周期事件(或方法)。Servlet 生命周期可以归纳为:Servlet 加载--->实例化--->服务--->销毁。
上图体现了servlet生命周期的三大重要时刻:
- 容器调用Servlet的init()方法,对Servlet进行初始化。在Servlet实例化之后,Servlet容器会调用init()方法,来初始化该对象,主要是为了让Servlet对象在处理客户请求前可以完成一些初始化的工作,例如,建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只能被调用一次。
-
Servlet初始化之后,将一直存在于容器中。当第一个客户请求到来时,容器会从线程池分配一个线程,并调用servlet的service()方法。该方法会查看Http请求,确定请求方法(GET或Post),并在Servlet调用对应的方法(doGet()或doPost());
service()是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,要注意的是,在service()方法被容器调用之前,必须确保init()方法正确完成。容器会构造一个表示客户端请求信息的请求对象(类型为ServletRequest)和一个用于对客户端进行响应的响应对象(类型为ServletResponse)作为参数传递给service()方法。在service()方法中,Servlet对象通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。
-
WEB容器决定销毁Servlet时,先调用Servlet的destroy()方法,通常在关闭web应用之前销毁Servlet。destroy()仅执行一次,在服务器端停止且卸载Servlet时执行该方法。
每个请求都在一个单独的线程中运行
每个请求都在一个单独的线程中运行,service()方法总是在其自己的栈中调用,这其中的关系如下图所示:
二、请求和响应
前文讨论了Servlet,其中service()方法是Servlet的核心。负责响应客户的请求。当客户端请求来临时,容器创建一个线程,调用Servlet的service()方法,并且,容器会创见两个参数,请求ServletRequest和响应ServletResponse,作为service()方法的参数。
三、重定向和转发
在实际的开发中,页面的跳转非常常见,Servlet中的页面跳转可以通过转发或者重定向来实现。
3.1 重定向
servlet重定向,通过调用sendRedirect()方法,可以将网页重定向到另一个页面。sendRedirect()可使用相对URL或者绝对URL。
如下图所示,在浏览器中输入如下地址:
Servlet在接收到请求之后,重定向为“form.html”,操作如下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
response.sendRedirect("form.html");
}
重定向之后,客户会发现浏览器地址发生了变化 :
不能子响应已经提交之后才调用sendRedirect,也就是说,如果已经向流中写了东西,再想重定向就太晚了 。
3.2 转发
不同于重定向,转发是在服务器端做工作,即转发是服务器行为,是不经过浏览器的。重定向是让客户来完成工作,而转发是要求服务器上的某某来完成工作。因此,重定向对应客户,转发对应服务器。
转发操作如下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html");
RequestDispatcher view = request.getRequestDispatcher("cookieresult.jsp");
view.forward(request,response);
}
以上转发代码和重定向实现了同样的页面跳转的功能,但是我们会发现,浏览器地址并没有发生变化。