1. 程式人生 > >Spring MVC的學習筆記

Spring MVC的學習筆記

基於註解形式配置Spring MVC

一、註冊並初始化DispatcherServlet,由Servlet容器自動檢測並啟動

註解形式

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletCxt) {

        // Load Spring web application configuration
        AnnotationConfigWebApplicationContext ac = new
AnnotationConfigWebApplicationContext(); ac.register(AppConfig.class); ac.setServletContext(servletCxt); ac.refresh(); // Create and register the DispatcherServlet DispatcherServlet servlet = new DispatcherServlet(ac); ServletRegistration.Dynamic registration
= servletCxt.addServlet("app", servlet); registration.setLoadOnStartup(1); registration.addMapping("/app/*"); } }

XML形式

<web-app>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </
listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/app-context.xml</param-value> </context-param> <servlet> <servlet-name>app</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>app</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping> </web-app>

2.WebApplicationContext層次結構配置SpringMVC

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { App1Config.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/app1/*" };
    }
}

等同於XML配置

<web-app>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/root-context.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>app1</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/app1-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>app1</servlet-name>
        <url-pattern>/app1/*</url-pattern>
    </servlet-mapping>

</web-app>

如果不需要應用程式上下文層次結構,則應用程式可以僅配置“根”上下文,並將contextConfigLocationServlet引數保留為空。

3.特殊Bean類

 

HandlerMapping

將請求對映到處理程式以及用於預處理和後處理攔截器列表 對映基於某些標準,其細節因HandlerMapping 實施而異

兩個主要HandlerMapping實現RequestMappingHandlerMapping(支援帶@RequestMapping註釋的方法)和SimpleUrlHandlerMapping(維護URI路徑模式到處理程式的顯式註冊)。

HandlerAdapter

DispatcherServlet無論實際呼叫處理程式如何,都可以幫助呼叫對映到請求的處理程式。例如,呼叫帶註釋的控制器需要解析註釋。一個主要目的HandlerAdapter是保護DispatcherServlet這些細節。

HandlerExceptionResolver

解決異常的策略,可能將它們對映到處理程式,HTML錯誤檢視或其他目標。請參閱例外

ViewResolver

String將從處理程式返回的基於邏輯的檢視名稱解析View 用於呈現給響應的實際檢視請參閱檢視解析度檢視技術

LocaleResolverLocaleContextResolver

解決Locale客戶正在使用的問題以及可能的時區問題,以便能夠提供國際化的檢視。請參閱區域設定

ThemeResolver

解決Web應用程式可以使用的主題 - 例如,提供個性化佈局。主題

MultipartResolver

在一些多部分解析庫的幫助下,解析多部分請求(例如,瀏覽器表單檔案上載)的抽象。請參閱Multipart Resolver

FlashMapManager

儲存和檢索“輸入”和“輸出” FlashMap,可用於將屬性從一個請求傳遞到另一個請求,通常是通過重定向。請參閱Flash屬性

說明:應用程式可以宣告 處理請求所需的特殊Bean型別中列出的基礎結構bean 。該DispatcherServlet檢查 WebApplicationContext對每個特殊的豆。如果沒有匹配的bean型別,它將回退到列出的預設型別 DispatcherServlet.properties

4.註冊SpringMVC與XML檔案組合進行配置

import org.springframework.web.WebApplicationInitializer;

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }
}

5.基於Java類進行配置SpringMVC

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { MyWebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

6.基於XML的Spring配置

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    @Override
    protected WebApplicationContext createServletApplicationContext() {
        XmlWebApplicationContext cxt = new XmlWebApplicationContext();
        cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        return cxt;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

也可以重寫並註冊多個Filter過濾器

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    /**
    * 每個過濾器都會根據其具體型別新增一個預設名稱,並自動對映到
    * DispatcherServlet
    */
    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] {
            new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
    }
}