Web.xml配置

大家好,我是IT修真院深圳分院第1期学员,一枚正直纯洁善良的web程序员。今天给大家分享一下,修真院官网JAVA(职业)任务2的知识点——web.xml配置。

1.背景介绍

当我们去启动一个WEB项目时,容器包括(Jetty、Tomcat等)首先会读取项目web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。

2.知识剖析

2.1 web启动加载过程

web项目启动时,容器首先在web.xml中读取context-param和listener,然后创建一个ServletContext,作为全局共享信息存储,将context-param中的name和value存入。然后创建listener实例,listener继承了ContextLoader类,由ContextLoader加载上下文(父子),然后容器继续读取filter,实例化过滤器。然后读取servlet,根据load-on-startup的值(整数值)来决定是即时实例化还是第一次请求时实例化。

2.2 web.xml标签

2.2.1 web-app

部署描述符的根元素是web-app。DTD文件规定web-app元素的子元素的语法如下:web-app (icon?, display-name?, description?, distributable?, context-param*, filter*, filter-mapping*, listener*, servlet*, servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?, error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*, login-config?, security-role*,env-entry*, ejb-ref*, ejb-local-ref*)

问号(?)表示子元素是可选的,而且只能出现一次。星号(*)表示子元素可在部署描述符中出现零次或多次。

2.2.2 display-name

web应用的名称,可以在容器的管理系统中查看

2.2.3 distributable

告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行。

2.2.4 context-param

含有一对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的,在web应用的整个生命周期中上下文初始化参数都存在,任意的Servlet和jsp都可以随时随地访问它。

2.2.5 session-config

用于设置容器的session参数。

2.2.6 listener

为web应用程序定义监听器,监听器用来监听各种事件。常用的Web事件接口有如下几个:

ServletContextListener:用于监听Web应用的启动和关闭;

ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变;

ServletRequestListener:用于监听用户的请求;

ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变;

HttpSessionListener:用于监听用户session的开始和结束;

HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变。

2.2.7 filter

filter可认为是Servlet的一种“加强版”,主要用于对用户请求request进行预处理,也可以对response进行后处理,是个典型的处理链。使用filter的完整流程是:filter对用户请求HttpServletRequest进行预处理,接着将请求交给Servlet进行处理并生成响应,最后filter再对服务器响应HttpServletResponse进行后处理。filter与Servlet具有完全相同的生命周期,且filter也可以通过init-param来配置初始化参数,获取filter的初始化参数则使用filterConfig的getInitParameter()。

filter在web.xml中配置,可包含filter-name、filter-class、init-param等子元素.

2.2.8 filter-mapping

用来声明Web应用中的过滤器映射,过滤器被映射到一个servlet或一个URL模式。这个过滤器的filter和filter-mapping必须具有相同的filter-name,指定该filter所拦截的URL。过滤是按照部署描述符的filter-mapping出现的顺序执行的。

2.2.9 servlet

运行在服务器端的程序,用于处理及响应客户的请求。

2.2.10 servlet-mapping

将URL模式映射到某个Servlet,即该Servlet处理的URL。

2.2.11 error-page

设置系统错误时返回的页面,包括error-code和location。

2.2.12 welcome-file

用来指定首页文件名称。welcome-file-list元素可以包含一个或多个welcome-file子元素。如果在第一个welcome-file元素中没有找到指定的文件,Web容器就会尝试显示第二个,以此类推。

3.常见问题

容器加载过程

4.解决方案

5.编码实战

6.扩展思考

Servlet 3.0开始支持用@WebServlet注解来代替web.xml里的配置servlet的作用

7.参考文献

参考一:spring mvc教程

参考二:ServletContext作用功能

8.更多讨论

不使用web.xml的webapp是什么样的?

PPT



web.xml配置

问:url-pattern为什么不能写成 /** 的形式?如果写成 /*,会不会报错?

答:/**匹配的是静态资源的路径。/*是一种正常的url-pattern,会匹配所有的url:路径型的和后缀型的url(包括/springmvc,.jsp,.js和*.html等)。另外/是rest的匹配风格,会匹配到/springmvc这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url。web.xml中写成/**会报错。

问:listener、filter、servlet不按这个顺序放会出现问题吗?

答:这个与容器有关,我在本地随便改顺序启动运行没有问题。但是最好按顺序来写,避免迁移的时候出错。

问:为什么一般只在web.xml中配置一个servlet?

答:web.xml中的servlet扮演的角色是前段请求分发器,会根据请求的url分配到对应的controller中处理,在内部就对应一个子容器上下文,多个servlet就对应多个容器上下文,这样代价开销很大。我们做项目都是rest风格,url-pattern统一是/,只一个就可以。

鸣谢

感谢大家观看

------------------------------------------------------------------------------------------------------------------------

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

你可能感兴趣的