Java之旅--Web.xml解析
Windows的IIS,是用UI界面进行网站的配置。Linux以下的差点儿全部系统,都是使用配置文件来进行配置,Java容器(JBoss/Tomcat/Jetty/WebSphere/WebLogic等等)也不例外,它们使用一个部署在WEB-INFO文件夹以下的web.xml来作为网站配置文件。
本文參考互联网文章,学习并记录web.xml的载入顺序及配置具体解释。
web.xml载入顺序
应用server启动时web.xml的载入过程。和这些节点在xml文件里的前后顺序没有关系,只是有些应用server。比方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*)".
- 启动WEB项目的时候,应用server会去读它的配置文件web.xml,读两个节点:<listener></listener> 和 <context-param></context-param>
- 紧接着。容器创建一个ServletContext(上下文)。这个WEB项目全部部分都将共享这个上下文
- 容器将<context-param></context-param>转化为键值对。并交给ServletContext
- 容器创建<listener></listener>中的类实例,即创建监听
- 在监听中会有contextInitialized(ServletContextEvent args)初始化方法。在这种方法中获得:
ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的键"); - 得到这个context-param的值之后,就能够做一些操作了。
注意,这个时候WEB项目还没有全然启动完毕,这个动作会比全部的Servlet都要早。换句话说。这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目全然启动之前被运行。假设想在项目启动之前就打开数据库,那么就能够在<context-param>中设置数据库的连接方式。在监听类中初始化数据库的连接,这个监听是自己写的一个类,除了初始化方法。它还有销毁方法,用于关闭应用前释放资源,比方说数据库连接的关闭。
对于某类配置节而言,与它们出现的顺序是有关的。
以 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的方式:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
web.xml节点解析
<context-param />
用来设定web网站的环境參数
它包括两个子元素:<param-name></param-name> 用来指定參数的名称;<param-value></param-value> 用来设定參数值
在此设定的參数,能够在servlet中用 getServletContext().getInitParameter("my_param") 来取得
样例:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>privilege.root</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext*.xml
classpath*:/cas-authority.xml
</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.xml</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
<listener />
用来设定Listener接口
它的主要子元素为 <listener-class></listener-class> ,用来定义Listener的类名称
样例:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter />
用来声明filter的相关设定
<filter-name></filter-name> 指定filter的名字
<filter-class></filter-class> 用来定义filter的类的名称
<init-param></init-param> 用来定义參数,它有两个子元素: <param-name></param-name> 用来指定參数的名称, <param-value></param-value> 用来设定參数值
与<filter></filter>一起使用的是
<filter-mapping></filter-mapping> 用来定义filter所相应的URL,包括两个子元素:
<filter-name></filter-name> 指定filter的名称
<url-pattern></url-pattern> 指定filter所相应的URL
样例:
<!-- 解决中文乱码问题 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<servlet />
用来声明一个servlet的数据,主要有下面子元素:
<servlet-name></servlet-name> 指定servlet的名称
<servlet-class></servlet-class> 指定servlet的类名称
<jsp-file></jsp-file> 指定web站台中的某个JSP网页的完整路径
<init-param></init-param> 用来定义參数
与<servlet></servlet>一起使用的是
<servlet-mapping></servlet-mapping> 用来定义servlet所相应的URL。包括两个子元素:
<servlet-name></servlet-name> 指定servlet的名称
<url-pattern></url-pattern> 指定servlet所相应的URL
样例:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> <!-- 用dubbo提供hessian服务 -->
<servlet>
<servlet-name>dubbo</servlet-name>
<servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dubbo</servlet-name>
<url-pattern>/hessian/*</url-pattern>
</servlet-mapping>
基本节点
1、<description/> 是对网站的描写叙述
样例:<description>传道、授业、解惑</description>
2、<display-name/> 定义网站的名称
样例:<display-name>我的网站</display-name>
3、<icon>
icon元素包括small-icon和large-icon两个子元素。用来指定web网站中小图标和大图标的路径。
<small-icon>/路径/smallicon.gif</small-icon>
small-icon元素应指向web站台中某个小图标的路径,大小为16 X 16 pixel,可是图象文件必须为GIF或JPEG格式,扩展名必须为:.gif或.jpg。
<large-icon>/路径/largeicon-jpg</large-icon>
large-icon元素应指向web站台中某个大图表路径,大小为32 X 32 pixel。可是图象文件必须为GIF或JPEG的格式,扩展名必须为: gif或jpg。
样例:
<icon>
<small-icon>/images/small.gif</small-icon>
<large-icon>/images/large.gir</large-icon>
</icon>
4、 <distributable/> 是指定该网站是否可分布式处理
5、 <session-config/> 用来定义web站台中的session參数
包括一个子元素:
<session-timeout></session-timeout> 用来定义这个web站台全部session的有效期限。单位为 分钟
6、 <mime-mapping /> 定义某一个扩展名和某一个MIME Type做相应。它包括两个子元素:
<extension></extension> 扩展名的名称
<mime-type></mime-type> MIME格式
样例:
<mime-mapping>
<extension>csv</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
7、 <error-page>
通过错误码来配置error-page
<error-page>
<error-code>404</error-code>
<location>/message.jsp</location>
</error-page>
通过异常类来配置error-page
<error-page>
<exception-type>java.lang.NullException</exception-type>
<location>/error.jsp</location>
</error-page>
8、 <welcome-file-list/>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
9、 <resource-ref></resource-ref> 定义利用JNDI取得站台可利用的资源
有五个子元素:
<description></description> 资源说明
<rec-ref-name></rec-ref-name> 资源名称
<res-type></res-type> 资源种类
<res-auth></res-auth> 资源经由Application或Container来许可
<res-sharing-scope></res-sharing-scope> 资源能否够共享。有Shareable和Unshareable两个值,默觉得Shareable
比方,配置数据库连接池就可在此配置
<resource-ref>
<description>JNDI JDBC DataSource of shop</description>
<res-ref-name>jdbc/sample_db</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
WebApplicationInitializer
也不是说web.xml是100%须要的,假设使用了Spring,也能够用纯代码的方式来取代web.xml。
http://www.java-allandsundry.com/2014/09/spring-webapplicationinitializer-and.html
假设既配置了web.xml。又有一个实现了WebApplicationInitializer的类,则可能会报错呢,例如以下:
java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml!
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:277) ~[spring-web-4.1.1.RELEASE.jar:4.1.1.RELEASE]
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) ~[spring-web-4.1.1.RELEASE.jar:4.1.1.RELEASE]
at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:775) ~[jetty-server-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:424) ~[jetty-servlet-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:767) ~[jetty-server-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:249) ~[jetty-servlet-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1252) ~[jetty-webapp-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:710) ~[jetty-server-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:494) ~[jetty-webapp-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) [jetty-util-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:229) [jetty-server-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) [jetty-util-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:95) [jetty-server-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.server.Server.doStart(Server.java:280) [jetty-server-8.1.10.v20130312.jar:8.1.10.v20130312]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) [jetty-util-8.1.10.v20130312.jar:8.1.10.v20130312]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_79]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_79]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_79]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_79]
推荐web.xml的配置方式,这样的方式是最经常使用和通用的。
Java之旅--Web.xml解析的更多相关文章
- 关于Java Webproject中web.xml文件
提及Java Webproject中web.xml文件无人不知,无人不识,呵呵呵:系统首页.servlet.filter.listener和设置session过期时限.张口就来,但是你见过该文件里的e ...
- 使用java自带的xml解析器解析xml
使用java自带的xml解析器解析xml,其实我不推荐,可以用Dom解析,或其他的方式,因为Java自带的解析器使用不但麻烦,且还有bug出现. 它要求,针对不同的xml(结构不同),必须写对应的ha ...
- Java数据库编程、XML解析技术
数据库编程 JDBC概述 是Java Database Connecive,即数据库连接技术的简称,它提供了连接各种常用数据库的能力. 是一种用于执行SQL语句的Java API,可以为多种关系数据库 ...
- web.xml解析
常用元素及含义 <!-- standalone 定义了外部定义的 DTD 文件的存在性,有效值是 yes和 no --> <?xml version="1.0" ...
- java基础---->java自带的xml解析
在查看公司框架的源码的时候,发现框架用的是jdk自带的xml解析.今天,想着对它总结一下.从未放弃过爱你,只是从浓烈变得悄无声气. 利用jdk自带的xml创建文档 一. CreateXmlFile类如 ...
- hello1的web.xml解析
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" ...
- java自带的xml解析工具类
public class JaxbUtil { /** * java对象转换为xml文件 * * @param xmlPath xml文件路径 * @param load java对象.Class * ...
- Spring使用java代码配置Web.xml进行访问service
方式一:继承WebMvcConfigurerAdapter类 1.使用一个类来继承 package com.wbg.springJavaConfig.spring; import org.spring ...
- xml解析----java中4中xml解析方法(转载)
转载:https://www.cnblogs.com/longqingyang/p/5577937.html 描述 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与 ...
随机推荐
- php navigat备份
点击查询->新建查询->写sql查询出更新的数据部分(根据时间等条件) -> 点击上方工具菜单栏的导出向导 ,然后就可以根据选择导出文件了可以导出sql脚本excel等很多,绝对有你 ...
- javascript设计模式-掺元类
有一种重用代码的方法不需要用到严格的继承.如果想把一个函数用到多个类中,可以通过扩充的方式让这些类共享该函数.其实际做法大大体为:先创建一个包含各种通用方法的类,然后再用它扩充其他的类.这种方式就叫做 ...
- Windows下配置SVN服务器
2013-09-03 21:40:34 1. 下载安装svn软件 1.1 服务端svn 下载地址:http://subversion.apache.org/packages.html 默认安装路径:D ...
- JavaScript DOM 总结
一.DOM基础1.节点(node)层次Document--最顶层的节点,所有的其他节点都是附属于它的.DocumentType--DTD引用(使用<!DOCTYPE>语法)的对象表现形式, ...
- 大白话理解this
日常开发中,我们经常用到this.一开始常会用一种感觉去判断this的指向,当遇到复杂的函数调用时,就分不清this的指向. 今天我们来由浅入深来学习下. function family1(){ va ...
- redis启动出错 Creating Server TCP listening socket 127.0.0.1:6379: bind: No error解决办法
windows下安装Redis第一次启动报错: [2368] 21 Apr 02:57:05.611 # Creating Server TCP listening socket 127.0.0.1: ...
- 04--深入探讨C++中的引用
深入探讨C++中的引用 引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确.灵活地使用引用,可以使程序简洁.高效.我在工作中发现,许多人使用它仅仅是想当然,在某些微 ...
- iPhone Mach-O文件格式与代码签名
错误现象1) 直接运行/Applications/MobileFonex.app/MobileFonexKilled: 9 2)gdb调试Program received signal EXC_BAD ...
- CF div2 499 A. Stages
Code: #include<cstdio> #include<algorithm> #include<iostream> using namespace std; ...
- 推荐一款能支持国密SM2浏览器——密信浏览器
密信浏览器( MeSince Browser )是基于Chromium开源项目开发的国密安全浏览器,支持国密算法和国密SSL证书,同时也支持国际算法及全球信任SSL证书:密信浏览器使用界面清新,干净. ...