Java之旅–Web.xml解析

最后更新于:2022-04-01 20:11:50

Windows的IIS,是用UI界面进行站点的配置;Linux下面的几乎所有系统,都是使用配置文件来进行配置,Java容器(JBoss/Tomcat/Jetty/WebSphere/WebLogic等等)也不例外,它们使用一个部署在WEB-INFO目录下面的web.xml来作为站点配置文件。 本文参考互联网文章,学习并记录web.xml的加载顺序及配置详解。 # web.xml加载顺序 应用服务器启动时web.xml的加载过程,和这些节点在xml文件中的前后顺序没有关系,不过有些应用服务器,比如WebSphere,就严格要求web.xml的节点顺序,否则部署不成功,所以最好还是按照web.xml的标准格式写,即:context-param --> listener --> filter --> servlet 。 或者根据IDE的提示,比如,如果顺序不对,IDE可能有如下提示: The content of element type "web-app" must match "(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 *)". 1. 启动WEB项目的时候,应用服务器会去读它的配置文件web.xml,读两个节点:    1. 紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文 1. 容器将转化为键值对,并交给ServletContext 1. 容器创建中的类实例,即创建监听 1. 在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得:  ServletContext = ServletContextEvent.getServletContext();  context-param的值 = ServletContext.getInitParameter("context-param的键");  1. 得到这个context-param的值之后,就可以做一些操作了。注意,这个时候WEB项目还没有完全启动完成,这个动作会比所有的Servlet都要早。换句话说,这个时候,你对中的键值做的操作,将在你的WEB项目完全启动之前被执行,如果想在项目启动之前就打开数据库,那么就可以在中设置数据库的连接方式,在监听类中初始化数据库的连接,这个监听是自己写的一个类,除了初始化方法,它还有销毁方法,用于关闭应用前释放资源,比如说数据库连接的关闭。 对于某类配置节而言,与它们出现的顺序是有关的。 以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。 web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。  servlet 同 filter 类似,此处不再赘述。 比如filter 需要用到 bean ,但加载顺序是: 先加载filter 后加载spring,则filter中初始化操作中的bean为null;所以,如果过滤器中要使用到 bean,可以将spring 的加载 改成 Listener的方式: ~~~ org.springframework.web.context.ContextLoaderListener ~~~ # web.xml节点解析 ### 用来设定web站点的环境参数 它包含两个子元素: 用来指定参数的名称; 用来设定参数值 在此设定的参数,可以在servlet中用 getServletContext().getInitParameter("my_param") 来取得 例子: ~~~ webAppRootKey privilege.root contextConfigLocation classpath*:/applicationContext*.xml classpath*:/cas-authority.xml log4jConfigLocation /WEB-INF/classes/log4j.xml spring.profiles.default dev ~~~ ### 用来设定Listener接口 它的主要子元素为  ,用来定义Listener的类名称 例子: ~~~ org.springframework.web.context.ContextLoaderListener ~~~ ### 用来声明filter的相关设定 指定filter的名字 用来定义filter的类的名称 用来定义参数,它有两个子元素: 用来指定参数的名称, 用来设定参数值 与一起使用的是 用来定义filter所对应的URL,包含两个子元素: 指定filter的名称 指定filter所对应的URL  例子: ~~~ encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter *.do ~~~ ###   用来声明一个servlet的数据,主要有以下子元素: 指定servlet的名称 指定servlet的类名称 指定web站台中的某个JSP网页的完整路径 用来定义参数 与一起使用的是 用来定义servlet所对应的URL,包含两个子元素: 指定servlet的名称 指定servlet所对应的URL 例子: ~~~ springmvc org.springframework.web.servlet.DispatcherServlet 1 springmvc *.do dubbo com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet 1 dubbo /hessian/* ~~~ ### 基本节点 1、 是对站点的描述 例子:传道、授业、解惑  2、 定义站点的名称 例子:我的站点 3、  icon元素包含small-icon和large-icon两个子元素,用来指定web站点中小图标和大图标的路径。 /路径/smallicon.gif small-icon元素应指向web站台中某个小图标的路径,大小为16 X 16 pixel,但是图象文件必须为GIF或JPEG格式,扩展名必须为:.gif或.jpg。 /路径/largeicon-jpg large-icon元素应指向web站台中某个大图表路径,大小为32 X 32 pixel,但是图象文件必须为GIF或JPEG的格式,扩展名必须为: gif或jpg。 例子:    /images/small.gif   /images/large.gir  4、 是指定该站点是否可分布式处理 5、 用来定义web站台中的session参数 包含一个子元素: 用来定义这个web站台所有session的有效期限,单位为 分钟 6、 定义某一个扩展名和某一个MIME Type做对应,它包含两个子元素: 扩展名的名称 MIME格式 例子: ~~~ csv application/octet-stream ~~~ 7、 通过错误码来配置error-page ~~~ 404 /message.jsp ~~~ 通过异常类来配置error-page ~~~ java.lang.NullException /error.jsp ~~~ 8、 ~~~ index.html index.jsp ~~~ 9、 定义利用JNDI取得站台可利用的资源 有五个子元素: 资源说明 资源名称 资源种类 资源经由Application或Container来许可 资源是否可以共享,有Shareable和Unshareable两个值,默认为Shareable 比如,配置数据库连接池就可在此配置 JNDI JDBC DataSource of shop jdbc/sample_db javax.sql.DataSource Container
';