springMVC原始碼分析--動態樣式ThemeResolver(二)
阿新 • • 發佈:2019-01-07
ThemeResolver的體系結構如下:
1、介面ThemeResolver中定義的介面是比較簡單的,提供兩個介面:
(1)resolveThemeName獲取樣式名
(2)setThemeName設定樣式名
2、抽象類AbstractThemeResolver,提供兩個方法:public interface ThemeResolver { /** * Resolve the current theme name via the given request. * Should return a default theme as fallback in any case. * @param request request to be used for resolution * @return the current theme name */ String resolveThemeName(HttpServletRequest request); /** * Set the current theme name to the given one. * @param request request to be used for theme name modification * @param response response to be used for theme name modification * @param themeName the new theme name * @throws UnsupportedOperationException if the ThemeResolver implementation * does not support dynamic changing of the theme */ void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName); }
(1)setDefaultThemeName 設定預設的樣式名
(2)getDefaultThemeName 獲取預設的樣式名
3、實現類CookieThemeResolver,其實現原理其實是比較簡單的,就是在Cookie中設定樣式名public abstract class AbstractThemeResolver implements ThemeResolver { public final static String ORIGINAL_DEFAULT_THEME_NAME = "theme"; private String defaultThemeName = ORIGINAL_DEFAULT_THEME_NAME; public void setDefaultThemeName(String defaultThemeName) { this.defaultThemeName = defaultThemeName; } public String getDefaultThemeName() { return this.defaultThemeName; } }
(1)在setThemeName函式中中將theme設定到cookie中
3、實現類SessionThemeResolver的實現也是比較簡單的,就是將themeName儲存到session中就可以了。public class CookieThemeResolver extends CookieGenerator implements ThemeResolver { public final static String ORIGINAL_DEFAULT_THEME_NAME = "theme"; /** * Name of the request attribute that holds the theme name. Only used * for overriding a cookie value if the theme has been changed in the * course of the current request! Use RequestContext.getTheme() to * retrieve the current theme in controllers or views. * @see org.springframework.web.servlet.support.RequestContext#getTheme */ public static final String THEME_REQUEST_ATTRIBUTE_NAME = CookieThemeResolver.class.getName() + ".THEME"; public static final String DEFAULT_COOKIE_NAME = CookieThemeResolver.class.getName() + ".THEME"; private String defaultThemeName = ORIGINAL_DEFAULT_THEME_NAME; public CookieThemeResolver() { setCookieName(DEFAULT_COOKIE_NAME); } /** * Set the name of the default theme. */ public void setDefaultThemeName(String defaultThemeName) { this.defaultThemeName = defaultThemeName; } /** * Return the name of the default theme. */ public String getDefaultThemeName() { return defaultThemeName; } @Override public String resolveThemeName(HttpServletRequest request) { // Check request for preparsed or preset theme. String themeName = (String) request.getAttribute(THEME_REQUEST_ATTRIBUTE_NAME); if (themeName != null) { return themeName; } // Retrieve cookie value from request. Cookie cookie = WebUtils.getCookie(request, getCookieName()); if (cookie != null) { String value = cookie.getValue(); if (StringUtils.hasText(value)) { themeName = value; } } // Fall back to default theme. if (themeName == null) { themeName = getDefaultThemeName(); } request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName); return themeName; } @Override public void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName) { if (StringUtils.hasText(themeName)) { // Set request attribute and add cookie. request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName); addCookie(response, themeName); } else { // Set request attribute to fallback theme and remove cookie. request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, getDefaultThemeName()); removeCookie(response); } } }
public class SessionThemeResolver extends AbstractThemeResolver {
/**
* Name of the session attribute that holds the theme name.
* Only used internally by this implementation.
* Use {@code RequestContext(Utils).getTheme()}
* to retrieve the current theme in controllers or views.
* @see org.springframework.web.servlet.support.RequestContext#getTheme
* @see org.springframework.web.servlet.support.RequestContextUtils#getTheme
*/
public static final String THEME_SESSION_ATTRIBUTE_NAME = SessionThemeResolver.class.getName() + ".THEME";
@Override
public String resolveThemeName(HttpServletRequest request) {
String themeName = (String) WebUtils.getSessionAttribute(request, THEME_SESSION_ATTRIBUTE_NAME);
// A specific theme indicated, or do we need to fallback to the default?
return (themeName != null ? themeName : getDefaultThemeName());
}
@Override
public void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName) {
WebUtils.setSessionAttribute(request, THEME_SESSION_ATTRIBUTE_NAME,
(StringUtils.hasText(themeName) ? themeName : null));
}
}
4、FixedThemeResolver中沒有具體的實現操作public class FixedThemeResolver extends AbstractThemeResolver {
@Override
public String resolveThemeName(HttpServletRequest request) {
return getDefaultThemeName();
}
@Override
public void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName) {
throw new UnsupportedOperationException("Cannot change theme - use a different theme resolution strategy");
}
}