SpringMVC之源碼分析--LocaleResolver和ThemeResolver應用

概述

以上分析了Spring MVC的LocaleResolver和ThemeResolver兩個策略解析器,在實際項目中不多使用,尤爲是ThemeResolver,花精力去分析他們,主要是爲了系統的學習,更多的瞭解Spring爲咱們提供的功能組件,經過這個過程,我本人也有了更多的體會,就像上篇文章(http://www.javashuo.com/article/p-pzvxaksi-mn.html)最後提出的小需求,需求自己不是具備實際意義,其實就是讓本身去思考,加深已學知識的理解,不知道小夥伴們有沒有思考呢?廢話很少說,如今就去實現它。html

需求

根據客戶端環境,界面顯示不一樣的國旗圖案。前端

分析

在接到一個需求時,首先要理解需求,實際工做中可能需求跟產品進行屢次溝通,其目的就是準確的理解,理解了需求就能夠選擇相應的技術方案去解決。就咱們這個功能來講,需求就是可定製不一樣的國旗圖案。選擇的技術方案可利用Spring MVC提供的國際化和主題定製來解決。java

實現

  • 項目結構

  • 源碼分析git

    • pom.xml文件github

      引入Spring MVC依賴以及JSP依賴,代碼以下:web

      <!-- Spring MVC依賴 -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.0.5.RELEASE</version>
      </dependency>
      <dependency>
      <!-- Servlet支持 -->
      <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
      </dependency>
      <!-- jsp支持-->
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
      </dependency>
    • spring-servlet.xml文件spring

      在classpath下新建Spring MVC配置文件,代碼以下:segmentfault

      <!-- 啓動註解掃描 -->
      <mvc:annotation-driven/>
      
       <!-- mvc controller -->
      <context:component-scan base-package="com.github.dalianghe.controller" />
      
      <!-- 默認Servlet處理靜態資源 -->
      <mvc:default-servlet-handler />
      
      <!-- jsp視圖映射與視圖解析 -->
      <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
          <property name="prefix" value="/WEB-INF/jsp/"/>
          <property name="suffix" value=".jsp"/>
      </bean>
      
      <mvc:interceptors>
          <!-- 該攔截器經過參數名爲」locale」的參數來攔截HTTP請求,設置LocaleResolver -->
          <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
              <property name="paramName" value="locale"/>
          </bean>
      </mvc:interceptors>
      
      <!-- 國際化資源文件 -->
      <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
          <!-- 若是資源文件放在classpath下,basename的value必須有classpath:前綴,不然報錯:No message found under code... -->
          <property name="basename" value="classpath:i18n/messages" />
          <!-- 若是在國際化資源文件中找不到對應代碼的信息,就用這個代碼做爲名稱返回  -->
          <property name="useCodeAsDefaultMessage" value="true" />
      </bean>
      
       <!--CookieLocaleResolver解析器 -->
      <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
          <!-- 設置默認爲中國,即從客戶端cookie中未找到cookieName時,使用默認locale -->
          <property name="defaultLocale" value="zh_CN"/>
          <!-- 設置cookieName,默認爲:org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE -->
          <property name="cookieName" value="locale"/>
      </bean>
      
      <!-- 加載主題資源文件 -->
      <bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource">
          <!-- 指定文件前綴,即文件所在目錄,若是放在classpath下,value爲空(默認從classpath下加載) -->
          <property name="basenamePrefix" value="theme."/>
      </bean>
      
      <!-- 主題解析器 -->
      <bean id="themeResolver" class="org.springframework.web.servlet.theme.CookieThemeResolver">
          <!-- 主題文件名稱,若是有多個相同前綴(theme)時,
                 查找最終的文件名爲: defaultThemeName+國際化標識,如:theme_zh_CN.properties-->
          <property name="defaultThemeName" value="theme"/>
          <!-- 設置theme的客戶端cookie名 -->
          <property name="cookieName" value="theme"/>
      </bean>
    • web.xml文件api

      配置Spring MVC 前端控制器,即DispatcherServlet,負責攔截用戶請求,代碼以下:cookie

      <servlet>
          <!-- Servlet名稱,可任意定義,但必須與servlet-mapping中對應 -->
          <servlet-name>dispatcher</servlet-name>
          <!-- 指定Spring MVC核心控制類,即J2EE規範中的前端控制器(Front Controller) -->
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!-- 指定Spring MVC配置文件,默認在WEB-INF目錄下,
              切名字爲[servlet-name]-servlet.xml,此文件中配置web相關內容,
              好比:指定掃描Controller路徑、配置邏輯視圖前綴後綴、上傳文件等等 -->
          <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath:spring-servlet.xml</param-value>
          </init-param>
          <!-- 此配置的值爲正整數時,表示容器啓動時初始化,即調用Servlet的init方法 -->
          <load-on-startup>1</load-on-startup>
          <async-supported>true</async-supported>
      </servlet>
      <!-- 定義servlet映射 -->
      <servlet-mapping>
          <!-- 與servlet中servlet-name對應 -->
          <servlet-name>dispatcher</servlet-name>
          <!-- 映射全部的url -->
          <url-pattern>/</url-pattern>
      </servlet-mapping>
    • 國際化屬性文件

      本例中建立了中國、美國及芬蘭的國際化支持,配置文件以下:

      messages_zh _CN.properties

      message.locale=中國

      messages_en _US.properties

      message.locale=美國

      messages_sv _FI.properties

      message.locale=芬蘭
    • 主題屬性文件

      根據國際化配置,主題定義了中國、美國及芬蘭的國旗圖片,配置以下:

      theme_ zh_CN.properties

      background=/img/China.jpg

      theme_ en_US.properties

      background=/img/America.jpg

      theme_ sv_FI.properties

      background=/img/Finland.jpg
    • 視圖及控制器

      Controller控制器代碼以下:

      @RequestMapping("/demo")
      public String demo(HttpServletRequest request , Model model){
      
          Locale locale = RequestContextUtils.getLocale(request);
      
          model.addAttribute("locale",locale);
      
          return "demo";
      }

      JSP視圖代碼以下:

      <%@ page contentType="text/html;charset=UTF-8" %>
      <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
      <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
      <html>
          <head>
          <title>Spring MVC Theme</title>
          </head>
          <body>
              <fmt:message key="message.name"/> : <fmt:message key="message.locale"/>
              <br/><br/>
              <img src="<spring:theme code='background'/>" style="width: 500px;height: 300px;">
          </body>
      </html>
  • 功能測試

本例以Firefox爲客戶端測試工具,測試步驟以下:

一、啓動項目後,訪問界面,在地址欄輸入http://localhost:8088/demo,結果以下:

由圖可知,此時系統使用的是默認的國際化屬性文件及顯示默認的國旗圖案,與咱們設想的一致。注意此時返回的cookie中沒有國際化及主題相關的信息。

二、經過請求參數locale設置地區環境,在地址欄輸入localhost:8088/demo?locale=en_US,併發起請求,結果以下:

由上圖可知結果,與咱們的設想一致,而且服務端經過攔截器把國際化寫入了客戶端cookie中。

三、修改請求參數locale的值爲荷蘭,即locale=sv_FI後再發起請求,結果以下:

與預期一致,測試經過。

總結

本例使用CookieLocaleResolver和CookieThemeResolver結合實現了國際化與主題定製需求,Spring MVC爲咱們提供了不通實現方式的LocaleResolver和ThemeResolver,可自由組合使用,這兩個策略解析器主要定製前端信息或樣式,經過以前的源碼分析及此案例,這塊內容就分析完了,但願對你們有所幫助。

最後建立了qq羣方便你們交流,可掃描加入,同時也可加我qq:276420284,共同窗習、共同進步,謝謝!

相關文章
相關標籤/搜索