配置spring mvc 时自定义文件名时要命名为
{servlet-name}-servlet.xml,并且配置<init-param>:
如命名为spring-servlet.xml,则
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value
>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
否则会报错:
严重: Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [spring-mvc.xml]; nested exception is java.io.FileNotFoundException: class path resource [spring-mvc.xml] cannot be opened because it does not exist
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:613)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:514)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1183)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1099)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:989)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4913)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5223)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1107)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1841)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.FileNotFoundException: class path resource [spring-mvc.xml] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330)
... 32 more
工作流程:
- Web中,无非是请求和响应;
- 在SpringMVC中,请求的第一站是DispatcherServlet,充当前端控制器角色;
- DispatcherServlet会查询一个或多个处理器映射(handler mapping)并根据请求所携带的URL信息进行决策,将请求发送给哪个SpringMVC控制器(controller);
- 控制器做两件事:一是将数据打包,二是定义逻辑视图名,然后返回给DispatcherServlet;
- DispatcherServlet通过视图解析器(view resolver)来将逻辑视图名匹配为一个特定的视图实现,它可能是也可能不是JSP;
- 交付数据模型,以视图形式响应给客户,整个请求流程完成。
web.xml
- <welcome-file-list>[欢迎页面,可定义多个,会依次查找可用视图]
- <listener>
- <listener-class>基本配置包含Log4jConfigListener和ContextLoaderListener,且log4j监听器在前,
目前已废除log4j监听器,原因还在努力追问
- <context-param>指定上下文配置文件路径,基本配置包含log4j和Spring配置文件
- <param-name>指定上下文名称,一般为:名称+ConfigLocation后缀,如:contextConfigLocation,不可随意定义,否则指定的配置文件无法加载成功,实际上它是org.springframework.web.servlet.FrameworkServlet中的一个成员变量,而FrameworkServlet是DispatcherServlet的父类,log4jConfigLocation目前不得而知
- <param-value>指定上下文路径,如:classpath:applicationContext.xml
- <servlet>
- <servlet-name>Servlet名称,可以自定义,但是需要遵守规则:比如指定为Spring,那么最好在classpath路径中配置Spring-servlet.xml,否则需要在子元素<init-param>特别指出
- <servlet-class>因为要配置MVC,所以指定为:org.springframework.web.servlet.DispatcherServlet
- <init-param>[定义容器启动时初始化的配置文件,作用主要是指定自定义配置文件的路径,貌似可以指定多个]
- <param-name>[contextConfigLocation,不可更改,原因见3.1]
- <param-value>[可以自定义,如:classpath:spring-servlet.xml,如果不定义,那么默认为:classpath:${servlet-name}-servlet.xml,见4.1]
- <load-on-startup>[定义为1,表示启动等级,参考文章]
- <servlet-mapping>
- <servlet-name>与4.1保持一致
- <url-pattern>一般定义为“/”,表示所有请求都通过DispatcherServlet来处理
- <filter>[以字符集为例]
- <filter-name>[自行指定]
- <filter-class>[org.springframework.web.filter.CharacterEncodingFilter]
- <init-param>
- <param-name>[encoding,不可更改,它是CharacterEncodingFilter中定义的一个成员变量]
- <param-value>[UTF-8]
- <filter-mapping>
- <filter-name>[与6.1保持一致]
- <url-pattern>[/*表示所有请求都经过此过滤器过滤]
示例:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app version="3.0"
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
7 <display-name></display-name>
8 <welcome-file-list>
9 <welcome-file>/WEB-INF/views/home.jsp</welcome-file>
10 </welcome-file-list>
11 <!-- 加载指定位置的上下文配置文件 -->
12 <context-param>
13 <param-name>contextConfigLocation</param-name>
14 <param-value>classpath:applicationContext.xml</param-value>
15 </context-param>
16 <context-param>
17 <param-name>log4jConfigLocation</param-name>
18 <param-value>classpath:log4j.properties</param-value>
19 </context-param>
20 <!-- 定义LOG4J监听器 -->
21 <listener>
22 <listener-class>
23 org.springframework.web.util.Log4jConfigListener
24 </listener-class>
25 </listener>
26 <listener>
27 <listener-class>
28 org.springframework.web.context.ContextLoaderListener
29 </listener-class>
30 </listener>
31 <servlet>
32 <servlet-name>Spring</servlet-name>
33 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
34 <!-- 表示启动容器时初始化该servlet -->
35 <init-param>
36 <param-name>contextConfigLocation</param-name>
37 <param-value>classpath:Spring-servlet.xml</param-value>
38 </init-param>
39 <load-on-startup>1</load-on-startup>
40 </servlet>
41 <servlet-mapping>
42 <servlet-name>Spring</servlet-name>
43 <!-- 表示哪些请求需要交给Spring Web MVC处理,/是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求 -->
44 <url-pattern>/</url-pattern>
45 </servlet-mapping>
46 <!-- 使用spring解决中文乱码 -->
47 <filter>
48 <filter-name>CharacterEncodingFilter</filter-name>
49 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
50 <init-param>
51 <param-name>encoding</param-name>
52 <param-value>utf-8</param-value>
53 </init-param>
54 </filter>
55
56 <filter-mapping>
57 <filter-name>CharacterEncodingFilter</filter-name>
58 <url-pattern>/*</url-pattern>
59 </filter-mapping>
60 </web-app>