一、web.xml简介
当要启动某个j2ee项目时,服务器软件或容器如(tomcat)会第一步加载项目中的web.xml文件,通过其中的各种配置来启动项目,只有其中配置的各项均无误时,项目才能正确启动。web.xml有多项标签,在其加载的过程中顺序依次为:context-param >> listener >> fileter >> servlet。(同类多个节点以出现顺序依次加载)
1、web.xml先读取context-param和listener这两种节点;
2、然后容器创建一个ServletContext(上下文),应用于整个项目;
3、容器会将读取到的context-param转化为键值对并存入servletContext;
4、根据listener创建监听;
5、容器会读取,根据指定的类路径来实例化过滤器;
6、此时项目初始化完成;
7、在发起第一次请求是,servlet节点才会被加载实例化。
二、context-param节点说明
context-param节点是web.xml中用于配置应用于整个web项目的上下文。包括两个子节点,其中param-name 设定上下文的参数名称。必须是唯一名称;param-value 设定的参数名称的值。
读取节点的方法如下:
页面中
${initParam.参数名}
Servlet中String paramValue=getServletContext().getInitParameter("参数名")
应用举例:Spring配置
web.xml中配置spring必须使用listener节点,但context-param节点可有可无,如果缺省则默认contextConfigLocation路径为“/WEB-INF/applicationContext.xml”;如果有多个xml文件,使用”,“分隔(我也不知道为什么图中的例子没有分隔,例子是shopizer开源项目)
三、listener节点说明:
为web应用程序定义监听器,监听器用来监听各种事件,比如:application和session事件,所有的监听器按照相同的方式定义,功能取决去它们各自实现的接口,常用的Web事件接口有如下几个:
ServletContextListener:用于监听Web应用的启动和关闭;
ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变;
ServletRequestListener:用于监听用户的请求;
ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变;
HttpSessionListener:用于监听用户session的开始和结束;
HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变。
配置Listener只要向Web应用注册Listener实现类即可,无序配置参数之类的东西,因为Listener获取的是Web应用ServletContext(application)的配置参数。为Web应用配置Listener的两种方式:
l 使用@WebListener修饰Listener实现类即可。
2 在web.xml文档中使用进行配置。
应用举例:
spring的加载有ServletContextListener和load-on-startup Servlet 两种方式,
方式一:
方式二:
因为有时候filter会用到bean,但filter的加载在servlet前面,此时便只是使用listener方法来加载spring
四、servlet节点说明:
servlet即配置所需用的servlet,用于处理及响应客户的请求。容器的Context对象对请求路径(URL)做出处理,去掉请求URL的上下文路径后,按路径映射规则和Servlet映射路径()做匹配,如果匹配成功,则调用这个Servlet处理请求。
不过如果配合structs框架,则客户请求被包装成action由structs配置文件处理。
创建Servlet实例有两个时机:
1、客户端第一次请求某个Servlet时,系统创建该Servlet的实例,大部分Servlet都是这种Servlet。
2、Web应用启动时立即创建Servlet实例,即load-on-start Servlet;
说明:的内容可以为空,或者是一个整数。这个值表示由Web容器载入内存的顺序。举个例子:如果有两个Servlet元素都含有子元素,则子元素值较小的Servlet将先被加载。如果子元素值为空或负值,则由Web容器决定什么时候加载Servlet。如果两个Servlet的子元素值相同,则由Web容器决定先加载哪一个Servlet。 1表示启动容器时,初始化Servlet。
servlet包括以下子节点:
1、:为Servlet指定一个文本描述。
2、:为Servlet提供一个简短的名字被某些工具显示。
3、:为Servlet指定一个图标,在图形管理工具中表示该Servlet。
4、:用来定义servlet的名称,该名称在整个应用中必须是惟一的(必须有)
5、用来指定servlet的完全限定的名称。(必须有)
6、用于初始化传递给servlet的参数,类似于局部化的context-param节点,访问Servlet配置参数通过ServletConfig对象来完成,ServletConfig提供如下方法:java.lang.String.getInitParameter(java.lang.String name):用于获取初始化参数ServletConfig获取配置参数的方法和ServletContext获取配置参数的方法完全一样,只是ServletConfig是取得当前Servlet的配置参数,而ServletContext是获取整个Web应用的配置参数。
举例说明:
servlet-mapping节点和servlet节点配套出现,含有两个子节点:
:Servlet的名字,唯一性和一致性,与元素中声明的名字一致。
:指定相对于Servlet的URL的路径。该路径相对于web应用程序上下文的根路径。
将URL模式映射到某个Servlet,即该Servlet处理的URL。
五、filter说明:
filter节点配置过滤器,主要用于对用户请求request进行预处理,也可以对Response进行后处理,是个典型的处理链。
使用Filter的完整流程是:Filter对用户请求进行预处理,接着将请求HttpServletRequest交给Servlet进行处理并生成响应,最后Filter再对服务器响应HttpServletResponse进行后处理。Filter与Servlet具有完全相同的生命周期,且Filter也可以通过来配置初始化参数,获取Filter的初始化参数则使用FilterConfig的getInitParameter()。
filter配置方法:
1、使用注解:
2、在web.xml文件中通过配置文件进行配置:
web.xml配置时可能使用的子节点:
-name>用来定义过滤器的名称,该名称在整个程序中都必须唯一。
元素指定过滤器类的完全限定的名称,即Filter的实现类。
为Filter配置参数,与具有相同的元素描述符和。
filter-mapping节点,和filter节点配套出现,用于声明Web应用中的过滤器映射,过滤器被映射到一个servlet或一个URL 模式。这个过滤器的和必须具有相同的,指定该Filter所拦截的URL。过滤是按照部署描述符的出现的顺序执行的。
六、节点说明:
包含一个子元素,用来指定首页文件名称。元素可以包含一个或多个子元素。如果在第一个元素中没有找到指定的文件,Web容器就会尝试显示第二个,以此类推。
参考资料:http://blog.csdn.net/believejava/article/details/43229361