java学习记录(11)
java web项目的部署描述文件–web.xml
提纲
- web.xml是什么
- java web项目的启动过程
- web.xml中的一些标签的含义
- 项目中的web.xml的解释
1 web.xml是什么
java web项目用部署描述文件来决定URLS与servlets的映射,哪些URLS需要进行验证等。这个部署描述文件是web.xml,它在java web项目打包war下面的WEB-INF目录下面,是java web项目中serverlet标准的一个部分。
2 java web项目的启动过程
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节点才会被加载实例化。
3 web.xml中的一些标签的含义
(1) XML文档有效性检查
不同的版本的web.xml文档书写有不同的格式。下面是3.1版本的部署描述符的书写格式。
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
(2)display-name
定义了web相应的名称,在把war文件放入到tomcat中在manager中就可以查看到对应的web名称。
<display-name>sshTest</display-name>
(3)context-param
1 context-param 定义了程序运行的上下文的一些参数,这里定义的是applicationContext.xml的文件路径。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
2 context-param值的获取,例如上例中的contextConfigLocation,可以在aciton中通过ServletActionContext来获取相关的参数。
String param_name=ServletActionContext.getServletContext().getInitParameter("contextConfigLocation");
System.out.println(param_name);
3 context-param的使用
什么情况下使用,为什么使用context-param:
比如:定义一个管理员email地址用来从程序发送错误,或者与你整个应用程序有关的其他设置。使用自己定义的设置文件需要额外的代码和管理;直接在你的程序中使用硬编码(Hard-coding)参数值会给你之后修改程序带来麻烦,更困难的是,要根据不同的部署使用不同的设置;通过这种办法,可以让其他开发人员更容易找到相关的参数,因为它是一个用于设置这种参数的标准位置。
4 spring的配置
配置Spring,必须需要listener,而context-param>可有可无,如果在web.xml中不写context-param>配置信息,默认的路径是/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:在param-value>里指定相应的xml文件名,如果有多个xml文件,可以写在一起并以“,”号分隔,比如在business-client工程中,我们采用了自定义配置方式,context-param配置如下:
<!-- spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
(4)listener
listener 为web应用程序定义监听器,监听器用来监听各种事件,比如:application和session事件,所有的监听器按照相同的方式定义,功能取决去它们各自实现的接口,常用的Web事件接口有如下几个:
1) ServletContextListener:用于监听Web应用的启动和关闭;
2) ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变;
3) ServletRequestListener:用于监听用户的请求;
ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变;
4) HttpSessionListener:用于监听用户session的开始和结束;
5) HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变。
listener主要用于监听Web应用事件,其中有两个比较重要的WEB应用事件:应用的启动和停止(starting up or shutting down)和Session的创建和失效(created or destroyed)。应用启动事件发生在应用第一次被Servlet容器装载和启动的时候;停止事件发生在Web应用停止的时候。Session创建事件发生在每次一个新的session创建的时候,类似地Session失效事件发生在每次一个Session失效的时候。为了使用这些Web应用事件做些有用的事情,我们必须创建和使用一些特殊的“监听类”。它们是实现了以下两个接口中任何一个接口的简单java类:javax.servlet.ServletContextListener或javax.servlet.http.HttpSessionListener,如果想让你的类监听应用的启动和停止事件,你就得实现ServletContextListener接口;想让你的类去监听Session的创建和失效事件,那你就得实现HttpSessionListener接口。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
(5)filter
<!-- struts2 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(6)welcome-file-list
初始页,包含多个以此尝试
<welcome-file-list>
<!-- /WEB-INF/jsp/login.jsp -->
<welcome-file>/index.html</welcome-file>
</welcome-file-list>