Servlet详解
1、什么是servlet:Servlet是实现java语言实现到动态web资源的技术,本质上是一段java代码,可以放置道Servlet容器中运行。
2、入门案例
1、想要实现servlet就必须实现javax.Servlet接口,Servlet接口定义了一些开发servlet的一些方法
| void
|
destroy()
Called by the servlet container to indicate to a servlet that the servlet is being taken out of service. 销毁方法 |
| ServletConfig
|
getServletConfig()
Returns a ServletConfig object, which contains initialization and startup parameters for this servlet. |
| String
|
getServletInfo()
Returns information about the servlet, such as author, version, and copyright. |
| void
|
init(ServletConfig config)
Called by the servlet container to indicate to a servlet that the servlet is being placed into service. 初始化方法 |
| void
|
service(ServletRequest req, ServletResponse res)
Called by the servlet container to allow the servlet to respond to a request 服务方法,是Serlvet的核心方法,当访问Servlet时,此方法执行 |
2、由于直接实现Servlet接口开发比较麻烦(必须实现许多不必要的方法),所以选择Servlet接口的实现类GenericServlet,在这个开发过程中,默认实现了除service之外的其他方法,而降service方法定义为抽象方法,开发者只需要继承此类,事项service就可以开发出一个Servlet
3、HttpServlet类继承自GenericServlet类,HttpServlet在GenericServlet类上增加Http协议的相关方法和属性,,开发者只需继承HttpServlet类,并重写相关的do.Xxx()方法,就可以完成对不同请求方式的请求处理了
Servlet接口
|-GenericServlet抽象类
|-HttpServlet类
4、Servlet对外访问路径配置
1、一个<servlet>可以配置多个<servlet-mapping>,一个<servlet-mapping>可以配置多个<url-pattern>
2、通配符 * 的使用,配置<url-pattern>可以使用 * 号进行统配路径设置,表示0个或任意个字符:有 /*结尾的路径<url-pattern>/ThirdServlet/*</url-pattern> | 有以 *. 后缀结尾的路径
3、使用 * 带来了路径重复匹配问题
|
Servlet1 映射到 /abc/* Servlet2 映射到 /* Servlet3 映射到 /abc Servlet4 映射到 *.do
当请求URL为"/abc/a.html",哪个servlet响应 ?-Servlet1 当请求URL为“/abc”时,哪个servlet响应 ?-Serlvet3 当请求URL为“/abc/a.do”时,哪个servlet响应 ?-Servlet1 当请求URL为“/a.do”时,哪个servlet响应 ?-Servelt2 当请求URL为“/xxx/yyy/a.do”时,哪个servlet响应 ?-Servelt2 |
总结: 配置越精细,匹配度越高,优先级越高, *. 方式的优先级最低。
5、缺省Servlet
将<url-pattern>/</url-pattern>,则Servlet成为缺省Servlet,没有其他Servlet处理的请求都将由缺省Servlet处理,通用web.xml中自带一个Servlet,此Servlet会在被访问是先找静态资源,找到就返回,找不到就放回404页面。
<load-on-startup>:部分Servlet需要应用启动后立即存在,则在<servlet>标签中可以配置<load-on-startup>标签,可在其中设置大于0的数字,一旦配置此标签,Servlet会在服务器加载web应用时立即创建,数字越小,启动优先级越高,缺省Servlet就配置了此标签
6、Servlet多线程并发安全问题
Servlet默认机制下是单例的,存在多线程并发安全问题的风险。所以在Servlet中尽量避免使用普通成员变量和静态成员变量
3、Servlet的创建过程和生命周期
1、在浏览器输入网址时,需要将网址转换成IP地址,这个过程系统将会首先访问本机的Host文件,若在该网址在Host文件中不存在,则将会访问DNS服务器(DNS服务器储存所有网址的IP地址)
2、通过Host头,可以找到唯一的主机,通过资源地址可以找到web应用,此资源地址在<url-pattern>存在,并与其对应。
3、通过<url-pattern>找到Servlet处理类,该处理类会建立requset和respones对象,将请求信息封装在requset对象中,并在处理类做出相应时使用respoes对象
4、将respoes对象中的数据取出,组织成Htpp相应发送给客户端。
Servlet的生命周期:在Servlet第一次被访问时。创建出Servlet对象。创建出来后,立即调用Servlet的init方法执行初始化操作,之后存储在Servlet容器中为后续请求服务。之后所有对这份Servlet的访问都会触发此service方法进行处理。直到服务器关闭,后web应用移除出容器,Servlet随之销毁。

浙公网安备 33010602011771号