Servlet如何处理请求及生命周期

来源:互联网 发布:python huey 编辑:程序博客网 时间:2024/05/01 23:03

一、servlet容器如何处理请求资源路径?

    比如,在浏览器地址栏输入
    http://ip:port/web04_2/abc.html
    浏览器会将请求资源路径("/web04_2/abc.html")放到请求数据包里面,发送给容器。容器收到之后,会依据应用名("/web04_2")找到应用所在的文件夹,然后,容器默认认为访问的是一个servlet,会依据<url-pattern>来查找有没有对应的servlet:
        方式一: 精确匹配
            <url-pattern>的值是"/abc.html"。
        方式二:  通配符匹配
            即使用"*"来匹配任意的0个或者多个字符,比如
            <url-pattern>/*</url-pattern>
        方式三:  后缀匹配
            即使用"*."开头,后接1个或者多个字符,比如
            <url-pattern>*.do</url-pattern>
            会匹配所有以".do"结尾的请求。
            http://ip:port/web04_2/aaaa.do  ok
            http://ip:port/web04_2/adfasdfa/asdfasfd.do ok
    如果容器找不到匹配的servlet,容器会认为访问的是一个html文件,然后查找该文件,找到了,就返回该文件的内容,找不到,返回404。
    

二、让一个servlet处理多个请求

    step1, 使用后缀匹配模式
            <url-pattern>*.do</url-pattern>
    step2,  分析请求资源路径,依据请求的不同,调用不同的分支来处理。
            request.getRequestURI();
    

三、servlet的生命周期

    (1)生命周期的含义
        servlet容器创建servlet对象、分配相应的资源给servlet对象、调用servlet对象的方法处理请求,以及销毁servlet对象的过程。
    (2)四个阶段
        1)实例化
            a,什么是实例化?
                容器调用servlet的构造器,创建servlet对象。
                注意:
                    容器只会创建一个servlet对象。
            b,什么时候创建servlet对象?
                情况1:容器收到请求之后,才会创建。
                情况2:  容器在启动的时候,会检查servlet的配置,如果某个servlet配置了<load-on-startup>参数,则会马上进行实例化操作。参数值是一个大于等于0的整数,越小,优先级越高(即先被容器创建)。
        2)初始化
            a,什么是初始化?
                容器在创建好servlet对象之后,会立即调用该对象的init方法。
            b,GenericServlet的init方法是如何实现的?
                将容器传递进来的ServletConfig对象保存下来,并且,提供了getServletConfig方法来获得ServletConfig对象。
            c,ServletConfig对象的作用
                访问servlet的初始化参数:
                    step1, 配置初始化参数,比如
                    <init-param>
                        <param-name>company</param-name>
                        <param-value>IBM</param-value>
                    </init-param>    
                    step2,调用
                        config.getInitParameter("company");
            d,如果GenericServlet提供的init方法不满足编程的要求,可以override init()方法。
            e,init方法只会执行一次。        
        3)就绪
            a,什么是就绪?
                容器调用servlet对象的service方法来处理请求。
            b,HttpServlet的service方法是如何实现的?
                依据请求方式分别调用doGet或者doPost方法。
                 HttpServlet提供了doGet,doPost方法的实现,但是,只是抛出了异常。
                 如果要实现业务处理,可以选择两个方式:
                     方式一:override HttpServlet的service方法。
                     方式二:override HttpServlet的doGet和doPost
                     方法。
        4)销毁
            a,什么是销毁?
                容器在删除servlet对象之前,会先调用该对象的destroy方法。
            b,容器会依据自身的算法来决定什么时候销毁servlet。

            c,destroy方法只会执行一次。

如上图所示,Servlet容器处理请求的步骤如下:

1、容器接收请求

2-3、依次创建request、response对象

4、创建Servlet对象,调用其init()方法

5、因为init()方法需要传一个config对象作为参数,故还要创建ServletConfig对象

6、调用servlet的init()初始化方法完成初始化

7、调用servlet的service()方法,并将创建的request、response对象作为参数传入,执行处理逻辑

8、调用servlet的destory()方法。

    (3)生命周期相关的几个接口与类
        Servlet接口
            init(ServletConfig config)
            service(ServletRequest req,ServletResponse res)
            destroy()
        GenericServlet抽象类
            实现了Servlet接口中的部分方法(init,destroy)
        HttpServlet抽象类
            继承GenericServlet,实现了service方法。
        ServletConfig接口
        ServletRequest接口是HttpServletRequest的父接口

        ServletResponse接口    是HttpServletResponse父接口


1 0
原创粉丝点击