web.xml里的主要配置都包括什么,都代表什么含义,比如怎么加载Spring 配置的?

Java小课堂

分享人:韩要贺

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

当我们去启动一个WEB项目时,Tomcat首先会读取项目web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的Application。在web.xml的模式(Schema)文件中定义了多少种标签元素,web.xml中就可以出现它的模式文件所定义的标签元素,它就能拥有定义出来的那些功能。而且web.xml的模式文件中定义的标签并不是定死的,模式文件也是可以改变的。

2.知识剖析

web启动加载过程

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

表头文件

1.跟所有的配置文件xml一样,必须要有一个xml头开始,这个头声明可以使用的XML版本并给出文件的字符编码。DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本。 所有部署描述符文件的顶层(根)元素为web-app。web-app必须用小写

命名和定制URL

在web.xml中完成的一个最常见的任务是对servlet或JSP页面给出名称和定制的URL,命名必须在定制URL前,。用servlet元素分配名称,使用servlet-mapping元素将定制的URL与刚分配的名称相关联。为了提供初始化参数,对servlet或JSP页面定义一个定制URL或分配一个安全角色,必须首先给servlet或JSP页面一个名称。可通过 servlet元素分配一个名称。最常见的格式包括servlet-name和servlet-class子元素

定制初始化参数

定制servlet、JSP、Context的初始化参数,然后可以在servlet、JSP、Context中获取这些参数值

设置过滤器

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁

设置监听器

Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等

3.常见问题

1.url-pattern配置为"/"和"/*"的区别

2.web.xml 文件中一般包括 servlet, spring, filter, listener的配置。那么他们是按照一个什么顺序加载呢?

4.解决方案

1.< url-pattern > /   不会匹配到*.jsp,即:*.jsp不会进入spring的 DispatcherServlet类 。 < url-pattern > /* 会匹配*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。

2..加载顺序为: listener >> filter >> servlet >> spring 加载顺序会影响对spring bean 的调用。 比如filter 需要用到 bean ,但是加载顺序是 先加载filter 后加载spring,则filter中初始化操作中的bean为null; 但加载顺序与他们在web.xml文件中的先后顺序无关。

5.编码实战

6.扩展思考

7.参考文献

3.张庆东师兄的ppt

8.更多讨论

今天的分享就到这里啦,欢迎大家提问和探讨!