SpringMVC 配置多个dispatcher 及WebApplicationInitializer的使用

SpringMVC 在配置多个dispatcher时,一般可以如下配置:
<!-- 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中配置随意引用

 

 

posted on 2016-08-17 10:30  张世民  阅读(4757)  评论(0编辑  收藏  举报