一、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方法只会执行一次。
(3)生命周期相关的几个接口与类如上图所示,Servlet容器处理请求的步骤如下:
1、容器接收请求
2-3、依次创建request、response对象
4、创建Servlet对象,调用其init()方法
5、因为init()方法需要传一个config对象作为参数,故还要创建ServletConfig对象
6、调用servlet的init()初始化方法完成初始化
7、调用servlet的service()方法,并将创建的request、response对象作为参数传入,执行处理逻辑
8、调用servlet的destory()方法。
Servlet接口
init(ServletConfig config)
service(ServletRequest req,ServletResponse res)
destroy()
GenericServlet抽象类
实现了Servlet接口中的部分方法(init,destroy)
HttpServlet抽象类
继承GenericServlet,实现了service方法。
ServletConfig接口
ServletRequest接口是HttpServletRequest的父接口
ServletResponse接口 是HttpServletResponse父接口