什么是web.xml
web.xml是web项目的配置文件,一般的web工程都会用到web.xml来配置,方便大型开发。web.xml主要用来配置Filter,Listener,Servlet等。但是web.xml并不是必须的,一个web工程可以没有web.xml文件。
web工程加载web.xml过程
web容器的加载顺序ServletContext -> context-param -> listener -> filter -> servlet。并且这些元素可以配置在文件中的任意位置,不会因为filter在web.xml文件中写在listener前面就先加载filter。
加载过程顺序如下
启动一个web项目,web容器会读取它的配置文件web.xml,读取
创建一个ServletContext(Servlet上下文),这个web项目的所有部分都将共享这个上下文
容器将
容器创建
web.xml配置详解
1、schema
web.xml的模式文件是由Sun公司定义的,每个web.xml文件的根元素
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
web-app>
2、
用于标记这个特定的Web应用的名称
<display-name>Tomcat Exampledisplay-name>
3、
<disciption>Tomcat Example servlets and JSP pages.disciption>
4、
声明应用范围内的初始化参数。用于向Servlet+Context提供键值对,即应用程序上下文信息。后续的listener,filter在初始化时会用到这些上下文信息。在servlet里面可以通过getServletContext().getInitParameter(“context/param”)得到
<context-param>
<param-name>log4jConfigurationparam-name>
<param-value>/WEB-INF/log4j2.xmlparam-value>
context-param>
5、
filter可以认为是servlet的一种加强版,主要用于对用户请求request进行预处理,也可以对response进行后处理,是个典型的处理链。使用filter的完整流程是,filter对用户请求进行预处理,接着将请求HttpServletRequest交给Servlet处理并生成响应。最后Filter再对服务器响应HttpServletResponse进行后处理。Servlet与Servlet具有完全相同的生命周期,而Filter也可以通过进行初始化参数的配置,并通过FilterConfig传送给filter
Filter的配置就是将此项目与一个实现javax.servlet.Filter接口的类相关联
<filter>
<filter-name>setCharacterEncodingfilter-name>
<filter-class>com.myTest.setCharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>setCharacterEncodingfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
6、监听器
<listener>
<listerner-class>com.listener.SessionListenerlistener-class>
listener>
7、
servlet老生常谈啦,是运行在服务器端的程序。传送门
<servlet>
<servlet-name>snoopservlet-name>
<servlet-class>SnoopServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>snoopservlet-name>
<url-pattern>/snoopurl-pattern>
servlet-mapping>
<servlet>
<servlet-name>snoopservlet-name>
<servlet-class>SnoopServletservlet-class>
<init-param>
<param-name>fooparam-name>
<param-value>barparam-value>
init-param>
<run-as>
<description>Security role for anonymous accessdescription>
<role-name>tomcatrole-name>
run-as>
servlet>
<servlet-mapping>
<servlet-name>snoopservlet-name>
<url-pattern>/snoopurl-pattern>
servlet-mapping>
8、
单位为秒
<session-config>
<session-timeout>120session-timeout>
session-config>
9、
<welcome-file-list>
<welcome-file>index.jspwelcome-file>
<welcome-file>index.htmlwelcome-file>
<welcome-file>index.htmwelcome-file>
welcome-file-list>
关于欢迎页面:
访问一个网站时,默认看到的第一个页面就叫欢迎页,一般情况下是由首页来充当欢迎页的。一般情况下,我们会在web.xml中指定欢迎页。但web.xml并不是一个Web的必要文件,没有web.xml,网站仍然是可以正常工作的。只不过网站的功能复杂起来后,web.xml的确有非常大用处,所以,默认创建的动态web工程在WEB-INF文件夹下面都有一个web.xml文件。
当你只指定一个web的根名,没有指定具体页面,去访问时一个web时, 如果web.xml文件中配置了欢迎页,那么就返回指定的那个页面作为欢迎页,而在文中没有web.xml文件,或虽然有web.xml,但web.xml也没指定欢迎页的情况下,那么不同的应用服务器可能会有不同的行为,对于tomcat来说,它默认先查找index.html文件,如果找到了,就把index.html作为欢迎页还回给浏览器。如果没找到index.html,tomcat就去找index.jsp。找到index.jsp就把它作为欢迎页面返回。而如果index.html和index.jsp都没找到,又没有用web.xml文件指定欢迎页面,那此时tomcat就不知道该返回哪个文件了,它就显示The requested resource (/XXX) is not available的页面。其中XXX表示web的根名。但如果你指定了具体页面,是可以正常访问的。(如果web根名下存在index.html和index.jsp,而某些应用服务器在web.xml中没指定欢迎页的情况下默认先查找index.jsp的话,其行为跟tomcat就不一样了,因此可能造成没配置web.xml欢迎页的项目,部署到不同的应用服务器看到不一样的首页的现象)。
10、
<description>:设定的说明
<display-name>:设定名称
<url-pattern>:设定值所影响的范围,如: /CH2 或 /*.jsp
<el-ignored>:若为 true,表示不支持 EL 语法
<scripting-invalid>:若为 true,表示不支持 <% scripting %>语法
<page-encoding>:设定 JSP 网页的编码
<include-prelude>:设置 JSP 网页的抬头,扩展名为 .jspf
<include-coda>:设置 JSP 网页的结尾,扩展名为 .jspf
<jsp-config>
<taglib>
<taglib-uri>Taglibtaglib-uri>
<taglib-location>/WEB-INF/tlds/MyTaglib.tldtaglib-location>
taglib>
<jsp-property-group>
<description>Special property group for JSP Configuration JSP example.description>
<display-name>JSPConfigurationdisplay-name>
<url-pattern>/jsp/* url-pattern>
<el-ignored>trueel-ignored>
<page-encoding>GB2312page-encoding>
<scripting-invalid>truescripting-invalid>
<include-prelude>/include/prelude.jspfinclude-prelude>
<include-coda>/include/coda.jspfinclude-coda>
jsp-property-group>
jsp-config>
对于Web 应用程式来说,Scriptlet 是个不乐意被见到的东西,因为它会使得HTML 与Java 程式码交相混杂,对于程式的维护来说相当的麻烦,必要的时候,可以在web.xml 中加上 标签,设定所有的JSP 网页都不可以使用Scriptlet。
11、指定错误处理页面,可以通过“异常类型”或“错误码”来指定错误处理页面。
<error-page>
<error-code>404error-code>
<location>/error404.jsplocation>
error-page>
<error-page>
<exception-type>java.lang.Exception<exception-type>
<location>/exception.jsp<location>
error-page>
12、Web应用图标:指出IDE和GUI工具用来表示Web应用的大图标和小图标
<icon>
<small-icon>/images/app_small.gifsmall-icon>
<large-icon>/images/app_large.giflarge-icon>
icon>
13、MIME类型配置
<mime-mapping>
<extension>htmextension>
<mime-type>text/htmlmime-type>
mime-mapping>
14、TLD配置
<taglib>
<taglib-uri>http://jakarta.apache.org/tomcat/debug-taglibtaglib-uri>
<taglib-location>/WEB-INF/jsp/debug-taglib.tldtaglib-location>
taglib>
如果MyEclipse一直在报错,应该把<taglib> 放到 <jsp-config>中
<jsp-config>
<taglib>
<taglib-uri>http://jakarta.apache.org/tomcat/debug-taglibtaglib-uri>
<taglib-location>/WEB-INF/pager-taglib.tldtaglib-location>
taglib>
jsp-config>
15、资源管理对象配置
<resource-env-ref>
<resource-env-ref-name>jms/StockQueueresource-env-ref-name>
resource-env-ref>
16、资源工厂配置
<resource-ref>
<res-ref-name>mail/Sessionres-ref-name>
<res-type>javax.mail.Sessionres-type>
<res-auth>Containerres-auth>
resource-ref>
配置数据库连接池就可在此配置:
<resource-ref>
<description>JNDI JDBC DataSource of shopdescription>
<res-ref-name>jdbc/sample_dbres-ref-name>
<res-type>javax.sql.DataSourceres-type>
<res-auth>Containerres-auth>
resource-ref>
17、安全限制配置
<security-constraint>
<display-name>Example Security Constraintdisplay-name>
<web-resource-collection>
<web-resource-name>Protected Areaweb-resource-name>
<url-pattern>/jsp/security/protected/*url-pattern>
<http-method>DELETEhttp-method>
<http-method>GEThttp-method>
<http-method>POSThttp-method>
<http-method>PUThttp-method>
web-resource-collection>
<auth-constraint>
<role-name>tomcatrole-name>
<role-name>role1role-name>
auth-constraint>
security-constraint>
18、登陆验证配置
<login-config>
<auth-method>FORMauth-method>
<realm-name>Example-Based Authentiation Arearealm-name>
<form-login-config>
<form-login-page>/jsp/security/protected/login.jspform-login-page>
<form-error-page>/jsp/security/protected/error.jspform-error-page>
form-login-config>
login-config>
19、安全角色:security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。
分别地声明角色可使高级IDE处理安全信息更为容易。
<security-role>
<role-name>tomcatrole-name>
security-role>
20、配置DWR
<servlet>
<servlet-name>dwr-invokerservlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>dwr-invokerservlet-name>
<url-pattern>/dwr/*url-pattern>
servlet-mapping>