我最近在IDEA上构建了一个maven+SSM项目,但是启动tomcat后报错,错误很直接,重点就一句话,即Could not open ServletContext resource [/WEB-INF/applicationContext.xml],异常也很明显,FileNotException,无法打开ServletContext的资源文件。
下面是我的web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>XVSDemo</display-name>
<!--字符集过滤器,必须放在所有过滤器之前 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<!-- request -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- response -->
<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>
<!-- Spring监听器 -->
<listener>
<!-- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> -->
<listener-class>com.xu.common.listener.CommonListener</listener-class>
</listener>
<!-- 防止Spring内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- Spring和mybatis的配置文件 -->
<!--<context-param>-->
<!--<param-name>contextConfigLocation</param-name>-->
<!--<param-value>classpath:spring-mybatis.xml</param-value>-->
<!--</context-param>-->
<!--Spring MVC servlet-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- druid -->
<!--<servlet>-->
<!--<servlet-name>DruidStatView</servlet-name>-->
<!--<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>-->
<!--<init-param>-->
<!--<!– 用户名 –>-->
<!--<param-name>loginUsername</param-name>-->
<!--<param-value>admin</param-value>-->
<!--</init-param>-->
<!--<init-param>-->
<!--<!– 密码 –>-->
<!--<param-name>loginPassword</param-name>-->
<!--<param-value>admin!@#</param-value>-->
<!--</init-param>-->
<!--</servlet>-->
<!--<servlet-mapping>-->
<!--<servlet-name>DruidStatView</servlet-name>-->
<!--<url-pattern>/druid/*</url-pattern>-->
<!--</servlet-mapping>-->
<!-- 如果需要监控uri,设置Web关联监控配置 -->
<!--<filter>-->
<!--<filter-name>DruidWebStatFilter</filter-name>-->
<!--<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>-->
<!--<init-param>-->
<!--<param-name>exclusions</param-name>-->
<!--<!– 排除统计干扰 –>-->
<!--<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>-->
<!--</init-param>-->
<!--</filter>-->
<!--<filter-mapping>-->
<!--<filter-name>DruidWebStatFilter</filter-name>-->
<!--<url-pattern>/*</url-pattern>-->
<!--</filter-mapping>-->
<!-- 系统入口文件 -->
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<!-- 错误页面配置 -->
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
</web-app>
在Maven项目中,我的配置文件自然应该放在src下的resources文件夹下,那么在web.xml中我自然将<init-param>中contextConfigLocation的参数值由WEB-INF/applicationContext.xml修改为classpath:spring-mvc.xml了,但是启动tomcat之后报错,而从报错信息中可以看出容器依然是在WEB-INF下去找applicationContext.xml,很明显这个文件的位置已经被我们改变了,而且我们也修改了web.xml的配置为何还要从这里去加载呢?原因是我们缺少另一个重要的配置。
如果不特意指定参数名为contextConfigLoction的<context-parameter>元素,那么spring的ContextLoderListener监听器就会在/WEB-INF/下去寻找并加载该目录下的名为applicationContext.xml这个文件。So,我们应该在web.xml中添加<context-param>标签并再次指定spring核心文件的位置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</context-param>
这样就OK了,注意这段配置尽量写在靠前的位置,因为在tomcat启动后web项目会先初始化上下文,我们这段配置正是指定了上下文配置的文件位置,在上下文初始化完成之后才应当继续加载其余各种配置,而我们的springMVC的servlet仅仅是springMVC框架的相关配置,项目整体还是由spring去管理的。下面是修改之后的web.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>XVSDemo</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</context-param>
<!--字符集过滤器,必须放在所有过滤器之前 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<!-- request -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- response -->
<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>
<!-- Spring监听器 -->
<listener>
<!-- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> -->
<listener-class>com.xu.common.listener.CommonListener</listener-class>
</listener>
<!-- 防止Spring内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- Spring和mybatis的配置文件 -->
<!--<context-param>-->
<!--<param-name>contextConfigLocation</param-name>-->
<!--<param-value>classpath:spring-mybatis.xml</param-value>-->
<!--</context-param>-->
<!--Spring MVC servlet-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- druid -->
<!--<servlet>-->
<!--<servlet-name>DruidStatView</servlet-name>-->
<!--<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>-->
<!--<init-param>-->
<!--<!– 用户名 –>-->
<!--<param-name>loginUsername</param-name>-->
<!--<param-value>admin</param-value>-->
<!--</init-param>-->
<!--<init-param>-->
<!--<!– 密码 –>-->
<!--<param-name>loginPassword</param-name>-->
<!--<param-value>admin!@#</param-value>-->
<!--</init-param>-->
<!--</servlet>-->
<!--<servlet-mapping>-->
<!--<servlet-name>DruidStatView</servlet-name>-->
<!--<url-pattern>/druid/*</url-pattern>-->
<!--</servlet-mapping>-->
<!-- 如果需要监控uri,设置Web关联监控配置 -->
<!--<filter>-->
<!--<filter-name>DruidWebStatFilter</filter-name>-->
<!--<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>-->
<!--<init-param>-->
<!--<param-name>exclusions</param-name>-->
<!--<!– 排除统计干扰 –>-->
<!--<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>-->
<!--</init-param>-->
<!--</filter>-->
<!--<filter-mapping>-->
<!--<filter-name>DruidWebStatFilter</filter-name>-->
<!--<url-pattern>/*</url-pattern>-->
<!--</filter-mapping>-->
<!-- 系统入口文件 -->
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<!-- 错误页面配置 -->
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
</web-app>
问题解决