大家好,我是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教程
8.更多讨论
不使用web.xml的webapp是什么样的?
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统一是/,只一个就可以。
鸣谢
感谢大家观看
------------------------------------------------------------------------------------------------------------------------
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
网友评论