您的位置:首页 > 其它

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

2016-04-07 17:59 316 查看

一、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父接口

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  servlet