以上分析了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,共同窗習、共同進步,謝謝!