web.xml加载详细过程(步骤)
转载自:http://blog.csdn.net/believejava/article/details/43229361这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论。 ---题记Web.xml详解:1.web.xml加载过程(步骤)首先简单讲一下,web.xml的加载过程。当启动一个WEB项目时,容器包括(JBoss、Tomc...
转载自:http://blog.csdn.net/believejava/article/details/43229361
这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论。 ---题记
Web.xml详解:
1.web.xml加载过程(步骤)
首先简单讲一下,web.xml的加载过程。当启动一个WEB项目时,容器包括(JBoss、Tomcat等)首先会读取项目web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。
1. 启动WEB项目的时候,容器首先会去它的配置文件web.xml读取两个节点: <listener></listener>和<context-param></context-param>。
2. 紧接着,容器创建一个ServletContext(application),这个WEB项目所有部分都将共享这个上下文。
3. 容器以<context-param></context-param>的name作为键,value作为值,将其转化为键值对,存入ServletContext。
4. 容器创建<listener></listener>中的类实例,根据配置的class类路径<listener-class>来创建监听,在监听中会有contextInitialized(ServletContextEvent args)初始化方法,启动Web应用时,系统调用Listener的该方法,在这个方法中获得:
- <span style="font-family:Times New Roman;">ServletContextapplication=ServletContextEvent.getServletContext();</span>
5. 举例:你可能想在项目启动之前就打开数据库,那么这里就可以在<context-param>中设置数据库的连接方式(驱动、url、user、password),在监听类中初始化数据库的连接。这个监听是自己写的一个类,除了初始化方法,它还有销毁方法,用于关闭应用前释放资源。比如:说数据库连接的关闭,此时,调用contextDestroyed(ServletContextEvent args),关闭Web应用时,系统调用Listener的该方法。
6. 接着,容器会读取<filter></filter>,根据指定的类路径来实例化过滤器。
7. 以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。所以,Servlet的初始化都要比上面提到的那几个要迟。
8. 总的来说,web.xml的加载顺序是:<context-param>-><listener>-><filter>-><servlet>。其中,如果web.xml中出现了相同的元素,则按照在配置文件中出现的先后顺序来加载。
9. 对于某类元素而言,与它们出现的顺序是有关的。以<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>类似,此处不再赘述。
2.web.xml标签详解
1. XML文档有效性检查
- <span style="font-family:Times New Roman;"><!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ></span>
- web-app定义该文档(部署描述符,不是DTD文件)的根元素
- PUBLIC意味着DTD文件可以被公开使用
- -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”意味着DTD由Sun Microsystems, Inc.维护。该信息也表示它描述的文档类型是DTD Web Application 2.3,而且DTD是用英文书写的。
- URL"http://java.sun.com/dtd/web-app_2_3.dtd"表示D文件的位置。
2. <web-app></web-app>
部署描述符的根元素是<web-app>。DTD文件规定<web-app>元素的子元素的语法如下:
- <span style="font-family:Times New Roman;"><!ELEMENT web-app (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*)> </span>
正如您所看到的,这个元素含有23个子元素,而且子元素都是可选的。问号(?)表示子元素是可选的,而且只能出现一次。星号(*)表示子元素可在部署描述符中出现零次或多次。有些子元素还可以有它们自己的子元素。web.xml文件中<web-app>元素声明的是下面每个子元素的声明。下面讲述部署描述符中可能包含的所有子元素。
注意:在Servlet 2.3中,子元素必须按照DTD文件语法描述中指定的顺序出现。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>两个子元素,则<servlet>子元素必须出现在<servlet-mapping>子元素之前。在Servlet2.4中,顺序并不重要。
3. <display-name></display-name>
<display-name>test-hwp-web-application</display-name>定义了web应用的名称,可以在http://localhost:8080/manager/html中显示。如下所示:
4. <distributable/>
<distributable/>可以使用distributable元素来告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行。
5. <context-param></context-param>
<!--****************************上下文初始化参数***************************-->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>business.root</param-value>
</context-param>
<!-- spring config -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-configuration/*.xml</param-value>
</context-param>
5.1<context-param>解释:
5.2 什么情况下使用,为什么使用<context-param>:
5.3 Spring配置文件:
<!-- spring config -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-configuration/*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 应用路径 -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>webapp.root</param-value>
</context-param>
<!—business-client应用路径 -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value> business.root </param-value>
</context-param>
<!—public-base应用路径 -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value> pubbase.root</param-value>
</context-param>
5.4 多个配置文件交叉引用处理:
<context-param>
<param-name>contextConfigLocation </param-name>
<param-value> applicationContext-database.xml,applicationContext.xml</param-value>
<context-param>
<bean id="userService" class="domain.user.service.impl.UserServiceImpl">
<property name="dbbean">
<ref bean="dbBean"/>
</property>
</bean>
5.5 在不同环境下如何获取:范例:
<context-param>
<param-name>param_name</param-name>
<param-value>param_value</param-value>
</context-param>
6. <session-config></session-config>
<!-- Set timeout to 120 minutes -->
<session-config>
<session-timeout>120</session-timeout>
</session-config>
7. <listener></listener>
<!--****************************监听器配置*********************************-->
<!-- Spring的log4j监听器 -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 与CAS Single Sign Out Filter配合,注销登录信息 -->
<listener>
<listener-class>com.yonyou.mcloud.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
7.1 Listener介绍:
(1). ServletContextListener:用于监听Web应用的启动和关闭;
(2). ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变;
(3). ServletRequestListener:用于监听用户的请求;
(4). ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变;
(5). HttpSessionListener:用于监听用户session的开始和结束;
(6). 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接口。
7.2 Listener配置:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-narne>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
8. <filter></filter>
<!--****************************过滤器配置*********************************-->
<!-- 字符集过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</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>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>com.yonyou.mcloud.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<!-- 认证过滤器 -->
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<filter-class>com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://dev.yonyou.com:443/sso-server/login</param-value>
</init-param>
<init-param>
<!--这里的server是服务端的IP -->
<param-name>serverName</param-name>
<param-value>http://10.1.215.40:80</param-value>
</init-param>
</filter>
<!-- 验证ST/PT过滤器 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://dev.yonyou.com:443/sso-server</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://10.1.215.40:80</param-value>
</init-param>
<init-param>
<param-name>proxyCallbackUrl</param-name>
<param-value>https://dev.yonyou.com:443/business/proxyCallback</param-value>
</init-param>
<init-param>
<param-name>proxyReceptorUrl</param-name>
<param-value>/proxyCallback</param-value>
</init-param>
<init-param>
<param-name>proxyGrantingTicketStorageClass</param-name>
<param-value>com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl</param-value>
</init-param>
<!-- 解决中文问题 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter>
<filter-name>NoCache Filter</filter-name>
<filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class>
</filter>
<!--****************************映射关系配置********************************-->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>NoCache Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/proxyCallback</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Authentication Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8.1 Filter介绍:
(1) 创建Filter处理类
(2) Web.xml文件中配置Filter
Filter必须实现javax.servlet.Filter接口,在该接口中定义了三个方法:
(1) void init(FilterConfig config):用于完成Filter的初始化。FilteConfig用于访问Filter的配置信息。
(2) void destroy():用于Filter销毁前,完成某些资源的回收。
(3) void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):实现过滤功能的核心方法,该方法就是对每个请求及响应增加额外的处理。该方法实现对用户请求request进行预处理,也可以实现对服务器响应response进行后处理---它们的分界线为是否调用了chain.doFilter(request,response),执行该方法之前,即对用户请求request进行预处理,执行该方法之后,即对服务器响应response进行后处理。
8.2 Filter配置:
Filter可认为是Servlet的“增强版”,因此Filter配置与Servlet的配置非常相似,需要配置两部分:配置Filter名称和Filter拦截器URL模式。区别在于Servlet通常只配置一个URL,而Filter可以同时配置多个请求的URL。配置Filter有两种方式:(1). 在Filter类中通过Annotation进行配置。
我们使用的是web.xml这种配置方式,下面重点介绍<filter>内包含的一些元素。
<filter>用于指定Web容器中的过滤器,可包含<filter-name>、<filter-class>、<init-param>、<icon>、<display-name>、<description>。
8.21 字符集过滤器
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8.22 缓存控制
<filter>
<filter-name>NoCache Filter</filter-name>
<filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCache Filter</filter-name>
<!—表示对URL全部过滤-->
<url-pattern>/*</url-pattern>
</filter-mapping>
8.23 登录认证
<!-- 认证过滤器 -->
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<filter-class>com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://dev.yonyou.com:443/sso-server/login</param-value>
</init-param>
<init-param>
<!--这里的server是服务端的IP -->
<param-name>serverName</param-name>
<param-value>http://10.1.215.40:80</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Authentication Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8.24 单点登出
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
8.25 封装request
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8.26 存放Assertion到ThreadLocal中
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8.27 禁用浏览器缓存
<filter>
<filter-name>NoCache Filter</filter-name>
<filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCache Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8.28 CAS Client向CAS Server进行ticket验证
<!-- 验证ST/PT过滤器 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://dev.yonyou.com:443/sso-server</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://10.1.215.40:80</param-value>
</init-param>
<init-param>
<param-name>proxyCallbackUrl</param-name>
<param-value>https://dev.yonyou.com:443/business/proxyCallback</param-value>
</init-param>
<init-param>
<param-name>proxyReceptorUrl</param-name>
<param-value>/proxyCallback</param-value>
</init-param>
<init-param>
<param-name>proxyGrantingTicketStorageClass</param-name>
<param-value>com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl</param-value>
</init-param>
<!-- 解决中文问题 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/proxyCallback</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
9. <servlet></servlet>
<!--****************************servlet</span><span style="font-family:SimSun;">配置</span><span style="font-family:Times New Roman;">******************************-->
<!-- Spring view</span><span style="font-family:SimSun;">分发器 对所有的请求都由business对应的类来控制转发</span><span style="font-family:Times New Roman;"> -->
<servlet>
<servlet-name>business</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>publishContext</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- </span><span style="font-family:SimSun;">用户登出</span><span style="font-family:Times New Roman;"> -->
<servlet>
<servlet-name>LogOutServlet</servlet-name>
<servlet-class>com.yonyou.mcloud.cas.web.servlet.LogOutServlet</servlet-class>
<init-param>
<param-name>serverLogoutUrl</param-name>
<param-value>https://dev.yonyou.com:443/sso-server/logout</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://10.1.215.40:80/business/</param-value>
</init-param>
</servlet>
<!--****************************servlet</span><span style="font-family:SimSun;">映射关系配置</span><span style="font-family:Times New Roman;">*************************-->
<servlet-mapping>
<servlet-name>LogOutServlet</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>business</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
9.1 Servlet介绍:
Servlet通常称为服务器端小程序,是运行在服务器端的程序,用于处理及响应客户的请求。Servlet是个特殊的java类,继承于HttpServlet。客户端通常只有GET和POST两种请求方式,Servlet为了响应则两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写service()方法即可响应客户端的所有请求。9.2 Servlet配置:
为了让Servlet能响应用户请求,还必须将Servlet配置在web应用中,配置Servlet需要修改web.xml文件。从Servlet3.0开始,配置Servlet有两种方式:9.3DispatcherServlet在web.xml中的配置:
<!-- Spring view分发器 对所有的请求都由business对应的类来控制转发 -->
<servlet>
<servlet-name>business</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>publishContext</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
(2).在public-base-server工程中,通过第2种方式进行配置,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml,则需要在配置DispatcherServlet时指定<init-param>标签。具体代码如下:
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>publishContext</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
工程目录结构如下:
9.4 ContextLoaderListener和DispatcherServlet初始化上下文关系和区别:
10. <welcome-file-list></welcome-file-list>
<!-- welcome page -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<welcome-file-list>包含一个子元素<welcome-file>,<welcome-file>用来指定首页文件名称。<welcome-file-list>元素可以包含一个或多个<welcome-file>子元素。如果在第一个<welcome-file>元素中没有找到指定的文件,Web容器就会尝试显示第二个,以此类推。
11. 参考文献:
http://wiki.metawerx.net/wiki/Web.xmlhttp://www.cnblogs.com/konbluesky/articles/1925295.html
http://blog.csdn.net/sapphire_aling/article/details/6069764
http://blog.csdn.net/zndxlxm/article/details/8711626
http://blog.csdn.net/zhangliao613/article/details/6289114
http://www.cnblogs.com/bukudekong/archive/2011/12/26/2302081.html
http://blog.sina.com.cn/s/blog_92b93d6f0100ypp9.html
http://blog.csdn.net/heidan2006/article/details/3075730
http://zhidao.baidu.com/link?url=vBOBj5f2D1Zx3wSUJo-XphWrG6f7QPmfzk0UtS9Xk7p1SG_OdeCkiH6dT6eyHO-Pa6p4hLTEfvY7O9d_OM0Gua
http://www.blogjava.net/dashi99/archive/2008/12/30/249207.html
http://uule.iteye.com/blog/2051817
http://blog.csdn.net/javaer617/article/details/6432654
http://blog.csdn.net/seng3018/article/details/6758860
http://groups.tianya.cn/tribe/showArticle.jsp?groupId=185385&articleId=2704257273118260804105385
http://blog.csdn.net/qfs_v/article/details/2557128
http://www.blogjava.net/fancydeepin/archive/2013/03/30/java-ee_web-xml.html
http://wenku.baidu.com/link?url=P30DokIynD5zzRU2dtdkQhEwsHi-REKuBiHa_dK60bA6pQwggvX2mo9y9Mbb1tkYcsiRCaHBf-c
4ZgIG5POmbbcRO_OxDJUaW15n300xJrq
http://fyq891014.blog.163.com/blog/static/200740191201233052531278/
http://blog.163.com/sir_876/blog/static/11705223201111544523333/
http://www.guoweiwei.com/archives/797
http://www.open-open.com/lib/view/open1402751642806.html
http://sishuok.com/forum/blogPost/list/5188.html;jsessionid=EBC2151611BEB99BDF390C5CADBA693A
http://www.micmiu.com/j2ee/spring/spring-classpath-start/
http://elf8848.iteye.com/blog/2008595
http://blog.csdn.net/arvin_qx/article/details/6829873
轻量级javaEE企业应用实战(第3版) ---李刚
更多推荐
所有评论(0)