zoukankan      html  css  js  c++  java
  • 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中配置随意引用

  • 相关阅读:
    类方法代码重构寻找坏味道
    迭代二分查找二分查找
    系统牛逼[置顶] 使用RAMP理解内在动机 Understanding Intrinsic Motivation with RAMP
    对象服务器Webservices获取天气
    手机服务器Android消息推送(二)基于MQTT协议实现的推送功能
    概率小数2013年阿里巴巴暑期实习招聘笔试题目(不完整,笔试时间:2013.5.5)
    像素颜色JavaFX示例简易图片处理工具
    算法队列SPFA算法详解
    选择文件Eclipse制作jar包
    nullnull推箱子
  • 原文地址:https://www.cnblogs.com/zsmhhfy/p/5778933.html
Copyright © 2011-2022 走看看