SpringMVCによるtheme選択のサポート


詳細
theme選択
1つのトピックのセットは、通常、サイトナビゲーションサイトでよく見られる色で区別されたトピックなど、CSSとピクチャのセットです.SpringMVCは、org.springframework.ui.context.Themeによって表されるトピックのサポートを提供しています.ThemeはThemeResourceによってtheme名に基づいて解析され,その定義は以下の通りである.
public interface ThemeSource {

	Theme getTheme(String themeName);

}

Springが提供するインプリメンテーションは、java.util.ResourceBundleに基づいて実装されたResourceBundleThemeSourceです.使用する場合はbasenamePrefixで接頭辞を指定し、接頭辞が指定されていない場合はクラスのルートパスからトピックファイルを取得する必要があります.接頭辞を指定すると、クラスパスの下の指定されたパスの下から検索されます.たとえば、接頭辞がa/bの場合、クラスパスの下のa/bのパスの下から指定されたトピックファイルが検索されます.ResourceBundleThemeSource解析のテーマファイルはpropertiesファイルが必要です.Springはトピックを解析する必要がある場合、beanコンテナからidがthemeSourceのThemeSourceを探します.以下はResourceBundleThemeSourceの定義です.
<bean id="themeSource"
    class="org.springframework.ui.context.support.ResourceBundleThemeSource"
    p:basenamePrefix="META-INF/theme/" />

ThemeSourceがThemeを解析するときのトピック名はThemeResolverによって解析され、3つの実装があります.
FixedThemeResolver:固定されたトピック名を指定します.
SessionThemeResolver:Sessionからトピック名を解析します.
CookieThemeResolver:Cookieからトピック名を解析します.
これら3つはsetDefaultThemeNameでデフォルトのtheme名を指定できます.つまり、SessionまたはCookieからトピック名を取得できなかった場合、setDefaultThemeNameで指定したデフォルトのトピック名が使用されます.setDefaultThemeNameでデフォルトのトピック名が指定されていない場合、デフォルトのトピック名はthemeです.以下に、SessionベースのThemeResolverを定義します.必要に応じてカスタマイズも可能です.

<bean id="themeResolver"
    class="org.springframework.web.servlet.theme.SessionThemeResolver"
    p:defaultThemeName="default" />

ThemeSourceとThemeResolverを定義してから、Themeを適用することができます.まずjspページにspringのtaglibを導入する必要があります.
taglib prefix="spring" uri="http://www.springframework.org/tags"%>

その後、の形式で現在のtheme定義のstylezhegekeyに対応するリソースを参照することができます.その用法と役割は国際化されたと似ている.例えば、次の例のは、現在のthemeのstyleというkeyに対応するリソースを探してcssファイルのパスとして導入する.
page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="">

<title>Test Theme Functiontitle>
head>
<body>

    <div style="width: 200px;height: 150px; margin-top: 100px; margin-left: 100px; border-width: 1px; border-style: solid;">
        Test Theme;
    div>

body>
html>

この場合、themeが指定されていなければ、上記の構成に従ってデフォルトではdefaultというthemeと名付けられ、クラスパスのMETA-INF/themeパスの下にdefaultが探す.propertiesファイル.もしdefault.propertiesファイルの内容は以下の通りであり、この場合keyがstyleの値に対応するのが/static/style/theme/default.cssであり、この場合に対応するのがである.
style=/static/style/theme/default.css

解析したthemeの名前がgreenである場合、クラスパスの下のMETA-INF/themeパスの下からgreenが探す.propertiesファイルのkeyはstyleの値です.
各themeに対応するkeyは同じであるべきであり、現在のthemeで存在しないkeyを探している場合、デフォルトのthemeに対応するファイルではなく、直接例外が投げ出されます.これは国際化とは違うところです.
切り替えtheme
themeの切り替えに応答する必要がある場合は、SpringMVCに内蔵されたinterceptorであるThemeChangeInterceptorをブロッキングで定義する必要があります.このinterceptorを定義すると、現在使用するthemeを指定するためにURLにthemeというパラメータを渡すことができ、どのURLをブロックしてthemeの切り替えに応答する必要があるかは完全にあなたが決めることができます.筆者は以下のようにすべてのURLをブロックします.デフォルトのパラメータを使用しない場合は、ThemeChangeInterceptorのsetParamName()メソッドで指定できます.デフォルトのスイッチングパラメータを使用すると、http://localhost/xxx?theme=greenで現在のthemeをgreenに切り替えることができます.
<mvc:interceptors>
    <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" />
mvc:interceptors>

(注:Spring 4.1.0に基づいて記載されています)