首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

SpringMVC 多 DispatcherServlet 配置與 WebApplicationInitializer 代碼化實戰

     編輯:Java 綜合教學

SpringMVC 多 DispatcherServlet 配置與 WebApplicationInitializer 代碼化實戰

傳統 web.xml 多 DispatcherServlet 配置


<!-- 主 MVC -->
<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>

<!-- 開發者專用 MVC -->
<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 -->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

關鍵避坑點

  1. 子 MVC 的 viewResolver prefix 不要包含映射前綴:
    若 url-pattern=/developer/*,prefix 配置 /WEB-INF/views/ 而非 /developer/WEB-INF/views/,否則報 404:No mapping found for HTTP request with URI [/developer/html/index.jsp]
  2. url-pattern 必須以 * 結尾:否則請求會被主 DispatcherServlet 攔截

代碼化配置:WebApplicationInitializer (Servlet 3.0+)

模塊化開發中,避免修改 web.xml,使用代碼自動註冊:


public class FrameDefaultInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // 靜態資源映射
        servletContext.getServletRegistration("default").addMapping("*.html");
        
        // 主 SpringMVC
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("classpath*:/spring-mvc.xml");
        
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("springMvc", 
            new DispatcherServlet(appContext));
        dispatcher.setLoadOnStartup(100);
        dispatcher.addMapping("/");
    }
}

原理機制

  1. 容器啟動掃描 ServletContainerInitializer 實現類
  2. Spring 提供 SpringServletContainerInitializer 實現
  3. 自動發現並調用所有 WebApplicationInitializer 實現類的 onStartup()

模塊化優勢

  • 每個模塊自帶 WebApplicationInitializer 實現
  • Maven 依賴引入即自動生效,無需修改主項目 web.xml
  • 支持條件裝配(如 @Profile、@ConditionalOnProperty)控制是否註冊

最佳實踐


// 模塊內部初始化器示例
@Order(100)  // 控制啟動順序
public class DeveloperModuleInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) {
        XmlWebApplicationContext ctx = new XmlWebApplicationContext();
        ctx.setConfigLocation("classpath*:/developer-spring-mvc.xml");
        
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("developerMvc", 
            new DispatcherServlet(ctx));
        dispatcher.setLoadOnStartup(200);
        dispatcher.addMapping("/developer/*");
    }
}

主項目只需依賴模塊 JAR,容器自動掃描啟動,實現真正的插拔式架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved