SpringMVC之原始碼分析–ThemeResolver(一)

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

概述

主題就是系統的整體樣式或風格,可通過Spring MVC框架提供的主題(theme)設定應用的整體樣式風格,提高使用者體驗。Spring MVC的主題就是一些靜態資源的集合,即包括樣式及圖片,用來控制應用的視覺風格。

Spring MVC主題包括兩部分內容,分別是Theme和ThemeResolver,下面是對兩部分內容的介紹:

Theme

應用中使用Theme主題時,必須實現org.springframework.ui.context.ThemeSource介面,web應用上下文WebApplicationContext介面繼承自ThemeSource,但是實現功能委派給具體的實現,預設的委派給org.springframework.ui.context.support.ResouceBundleThemeSource類實現,此類預設從classpath載入主題屬性檔案。無論是自定義ThemeSource介面的實現還是通過配置屬性檔案路勁的ResourceBundleThemeSource實現,都需要在Spring上下文中定義此bean,並且bean的id必須為themeSource,Spring會自動發現並使用。

ThemeResolver

在Spring上下文中定義了Theme後,DispatcherServlet會在Spring容器中查詢id為themeResolver的Bean並使用。ThemeResolver工作原理與LocaleResolver工作原理基本是一樣的,它在request中查詢theme主題並可以修改request的theme主題。Spring提供瞭如下的主題解析器:

  • FixedThemeResolver 預設主題解析器,使用固定的主題,通過defaultThemeName屬性設定,即此屬性指定主題屬性檔案的檔名。此解析器不能動態設定主題。
  • SessionThemeResolver 通過使用者會話來保持主題,每個會話(session)僅需要設定一次,所有請求共享主題,但是不能兩個會話共享。
  • CookieThemeResolver 使用客戶端cookie儲存的主題

Spring提供了ThemeChangeInterceptor攔截器,通過request引數控制改變使用者請求的主題。

FixedThemeResolver

預設的主題解析器(在DispatcherServlet.properties中配置預設策略),實現ThemeResolver介面,使用固定的主題,主題的名字(就是主題的屬性檔名)可通過defaultThemeName屬性指定,該值預設是theme,該類比較簡單,原始碼如下,做下注釋介紹:

public class FixedThemeResolver extends AbstractThemeResolver {
    // 解析主題檔名
    @Override
    public String resolveThemeName(HttpServletRequest request) {
        // 返回主題檔名,預設值為theme(在父類中定義)
        return getDefaultThemeName();
    }
    // 設定主題檔名,此解析器不能設定。
    @Override
    public void setThemeName(
            HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable String themeName) {
        throw new UnsupportedOperationException("Cannot change theme - use a different theme resolution strategy");
    }

}

實戰

  • 目標

練習使用FixedThemeResolver解析器,最終效果如下:

  • 專案結構

在resources下建立了主題資料夾及主題檔案,webapp下建立了靜態資原始檔。

  • 主題配置檔案(myTheme.properties)

指定了一張測試圖片,如下:


background=/img/wolf.jpg
  • Spring配置檔案

配置themeSource和themeResolver,如下:

<!-- 預設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>

<!-- 載入主題資原始檔 -->
<bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource">
    <!-- 指定檔案字首,即檔案所在目錄,如果放在classpath下,value為空(預設從classpath下載入) -->
    <property name="basenamePrefix" value="theme."/>
</bean>
<!-- 使用FixedThemeResolver -->
<bean id="themeResolver" class="org.springframework.web.servlet.theme.FixedThemeResolver">
    <!-- 定義theme檔案的名稱 -->
    <property name="defaultThemeName" value="myTheme"/>
</bean>

說明:

1、ResourceBundleThemeSource的屬性basenamePrefix即為主題屬性檔案所在目錄名稱,其後必須有”.”或”/”。

2、FixedThemeResolver是Spring預設的解析器,再此配置是為了自定義defaultThemeName屬性值,即屬性檔名稱。

  • 檢視

本例使用jsp檢視展示,程式碼如下:

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
    <title>Spring MVC Theme</title>
</head>
<body>

    <img src="<spring:theme code='background'/>" style="width: 500px;height: 300px;">

</body>
</html>
  • 控制器

為了測試,編寫Controller控制器,跳轉至jsp頁面,程式碼如下:

@RequestMapping("/theme")
public String theme(){
    return "theme";
}

至此,啟動程式並訪問/theme地址即可看到之前的效果圖。

總結

  • 本例主要分析了Spring MVC對Theme整體支援,並實戰了預設的ThemeResolver,後續繼續分析SessionThemeResolver和CookieThemeResolver。其實此解析器與LocaleResolver的實現原理基本相同。

相關文章

開發語言 最新文章