通常情况下会有这么几个配置文件:web.xml, applicationContext.xml,
xxxx-servlet.xml,
在web.xml中通常会这么配置DispatcherServlet:
- <servlet>
- <servlet-name>mvc</servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <!--init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/other-name.xml</param-value>
- </init-param-->
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>mvc</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
这个servlet默认会以<servlet-name>-servlet.xml为当前servlet的spring容器的配置文件,比如本例应该是mvc-servlet.xml,但是如果你不想这么命名,则要给这个servlet添加启动参数contextConfigLocation,
像上面被注释掉的一样。
web.xml中通常还有这样的配置:
- <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>
context-param是global参数,会被整个应用程序共享;spring
mvc中配置的ContextLoaderListener正是通过读取contextConfigLocation这个全局参数,找到全局的spring容器配置文件。然后构建全局的WebApplicationContext,具体的过程由ContextLoader来操作,ContextLoader中initWebApplicationContext方法非常清晰地描述了这个过程.
这个全局的WebApplicationContext可以被所有的DispatcherServlet的spring容器访问,因为所有DispatcherServlet的spring容器都把这个全局的容器作为parent.这个过程描述在FrameworkServlet中;
不清楚的可以看一下源码。这样的父子容器的设计非常有好处:
业务层, 持久层的bean放在父容器中,
这样可以被所有展现层共享;配置文件也可以拆分得更清晰:XXXDao.xml, XXXService.xml
.....
展现层的bean放在各自servlet的spring容器中。
读了好多次代码,才总算把这个问题搞清楚了。
spring学习笔记:spring mvc不得不说的几处配置(转自:http://blog.csdn.net/sunxing007/article/details/4584300)