Servlet生命周期及请求、响应

一、Servlet生命周期

        Servlet运行在Servlet容器中,其生命周期由容器全盘控制。容器创建请求和响应对象为Servlet分配一个线程调用servlet的service()方法,并传递请求和响应对象的引用作为参数

当应用加载并使用一个Servlet时,从初始化到销毁这个Servlet期间会发生一系列的事件,这些事件叫做Servlet的生命周期事件(或方法)。Servlet 生命周期可以归纳为Servlet 加载--->实例化--->服务--->销毁。

上图体现了servlet生命周期的三大重要时刻:

  1. 容器调用Servlet的init()方法,对Servlet进行初始化。在Servlet实例化之后,Servlet容器会调用init()方法,来初始化该对象,主要是为了让Servlet对象在处理客户请求前可以完成一些初始化的工作,例如,建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只能被调用一次
  2. Servlet初始化之后,将一直存在于容器中。当第一个客户请求到来时容器会从线程池分配一个线程,并调用servlet的service()方法。该方法会查看Http请求,确定请求方法(GET或Post),并在Servlet调用对应的方法(doGet()或doPost());

            service()是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,要注意的是,在service()方法被容器调用之前,必须确保init()方法正确完成。容器会构造一个表示客户端请求信息的请求对象(类型为ServletRequest)和一个用于对客户端进行响应的响应对象(类型为ServletResponse)作为参数传递给service()方法在service()方法中,Servlet对象通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息

  3. 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);
    }

        以上转发代码和重定向实现了同样的页面跳转的功能,但是我们会发现,浏览器地址并没有发生变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值