SpringMVC 配置多个dispatcher 及WebApplicationInitializer的使用
<!-- spring mvc start --> <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> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet> <servlet-name>SytDeveloper</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/developer-spring-mvc.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SytDeveloper</servlet-name> <url-pattern>/developer/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <!-- spring mvc end -->
注意:
1.在developer-spring-mvc.xml中配置viewResolver时,<property name="prefix">中不要在以/developer/开头,不然会出现“404 Problem accessing“问题:
No mapping found for HTTP request with URI [/developer/html/index.jsp] in DispatcherServlet with name 'developerMvc'
因为DispatcherServlet会把页面路径当做URI处理,而不是进行视图解析
2.SytDeveloper的 url-pattern 后面要代*,如果不带,会使用名称为SpringMVC 的DispatcherServlet进行处理
另外,在多模块的开发过程中,如果需要多个DispatcherServlet,可能需要修改web.xml,比较繁琐,还降低了模块随意组合性,开始考虑思路是web.xml是否可以include其他xml文件,但是web.xml好像不允许include,所以可以使用WebApplicationInitializer来进行配置,注意只有配合 Servlet 3.0+才可以实现。关于WebApplicationInitializer的详细介绍,网上有许多详细介绍,主要原理是容器会自动扫面ServletContainerInitializer接口的实现类 ,然后调用onStartup方法,Spring为我们提供了一个实现类SpringServletContainerInitializer,而只要是WebApplicationInitializer的实现类就都可以被SpringServletContainerInitializer自动识别处理,想详细了解可以查看这几个类的源代码。
例子:
将上面web.xml中的SpringMVC配置在代码中进行,就变成了如下:
/** * @title: FrameDefaultInitializer.java * @package com.shuyuntu.initializer * @description: TODO 对Frame进行初始化配置,可以初始化配置filter、listener、servlet等 * @copyright: shuyuntu.com * @author 张世民 * @date 2016年8月17日 上午9:28:03 * @version 1.0 */ public class FrameDefaultInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { // TODO 运行初始化 servletContext.getServletRegistration("default").addMapping("*.html"); // 添加Spring mvc 配置 XmlWebApplicationContext appContext = new XmlWebApplicationContext(); appContext.setConfigLocation("classpath*:/spring-mvc.xml"); ServletRegistration.Dynamic dispatcher = servletContext.addServlet("springMvc", new DispatcherServlet(appContext)); dispatcher.setLoadOnStartup(100); dispatcher.addMapping("/"); } }
附:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/WebApplicationInitializer.html
使用代码进行配置,感觉模块与模块之间更加灵活,一个平台需要哪些模块就可以直接在maven中配置随意引用