diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JspAwareRequestContext.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JspAwareRequestContext.java index 69d5cefe803..40ec592158d 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JspAwareRequestContext.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JspAwareRequestContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package org.springframework.web.servlet.support; import java.util.Locale; import java.util.Map; +import java.util.TimeZone; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.PageContext; @@ -85,9 +86,9 @@ public class JspAwareRequestContext extends RequestContext { } /** - * This implementation checks for a JSTL locale attribute - * in page, request, session or application scope; if not found, - * returns the {@code HttpServletRequest.getLocale()}. + * This implementation checks for a JSTL locale attribute in page, + * request, session or application scope; if not found, returns the + * {@code HttpServletRequest.getLocale()}. */ @Override protected Locale getFallbackLocale() { @@ -100,6 +101,21 @@ public class JspAwareRequestContext extends RequestContext { return getRequest().getLocale(); } + /** + * This implementation checks for a JSTL time zone attribute in page, + * request, session or application scope; if not found, returns {@code null}. + */ + @Override + protected TimeZone getFallbackTimeZone() { + if (jstlPresent) { + TimeZone timeZone = JstlPageLocaleResolver.getJstlTimeZone(getPageContext()); + if (timeZone != null) { + return timeZone; + } + } + return null; + } + /** * Inner class that isolates the JSTL dependency. @@ -111,6 +127,11 @@ public class JspAwareRequestContext extends RequestContext { Object localeObject = Config.find(pageContext, Config.FMT_LOCALE); return (localeObject instanceof Locale ? (Locale) localeObject : null); } + + public static TimeZone getJstlTimeZone(PageContext pageContext) { + Object timeZoneObject = Config.find(pageContext, Config.FMT_TIME_ZONE); + return (timeZoneObject instanceof TimeZone ? (TimeZone) timeZoneObject : null); + } } } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java index df008b774b4..243808438d8 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,7 +72,6 @@ import org.springframework.web.util.WebUtils; * @see org.springframework.web.servlet.DispatcherServlet * @see org.springframework.web.servlet.view.AbstractView#setRequestContextAttribute * @see org.springframework.web.servlet.view.UrlBasedViewResolver#setRequestContextAttribute - * @see #getFallbackLocale() */ public class RequestContext { @@ -91,8 +90,8 @@ public class RequestContext { public static final String WEB_APPLICATION_CONTEXT_ATTRIBUTE = RequestContext.class.getName() + ".CONTEXT"; - protected static final boolean jstlPresent = ClassUtils.isPresent("javax.servlet.jsp.jstl.core.Config", - RequestContext.class.getClassLoader()); + protected static final boolean jstlPresent = ClassUtils.isPresent( + "javax.servlet.jsp.jstl.core.Config", RequestContext.class.getClassLoader()); private HttpServletRequest request; @@ -276,56 +275,6 @@ public class RequestContext { } } - /** - * Determine the fallback locale for this context. - *
The default implementation checks for a JSTL locale attribute in request, session - * or application scope; if not found, returns the {@code HttpServletRequest.getLocale()}. - * @return the fallback locale (never {@code null}) - * @see javax.servlet.http.HttpServletRequest#getLocale() - */ - protected Locale getFallbackLocale() { - if (jstlPresent) { - Locale locale = JstlLocaleResolver.getJstlLocale(getRequest(), getServletContext()); - if (locale != null) { - return locale; - } - } - return getRequest().getLocale(); - } - - /** - * Determine the fallback time zone for this context. - *
The default implementation checks for a JSTL time zone attribute in request, - * session or application scope; returns {@code null} if not found. - * @return the fallback time zone (or {@code null} if none derivable from the request) - */ - protected TimeZone getFallbackTimeZone() { - if (jstlPresent) { - TimeZone timeZone = JstlLocaleResolver.getJstlTimeZone(getRequest(), getServletContext()); - if (timeZone != null) { - return timeZone; - } - } - return null; - } - - /** - * Determine the fallback theme for this context. - *
The default implementation returns the default theme (with name "theme"). - * @return the fallback theme (never {@code null}) - */ - protected Theme getFallbackTheme() { - ThemeSource themeSource = RequestContextUtils.getThemeSource(getRequest()); - if (themeSource == null) { - themeSource = new ResourceBundleThemeSource(); - } - Theme theme = themeSource.getTheme(DEFAULT_THEME_NAME); - if (theme == null) { - throw new IllegalStateException("No theme defined and no fallback theme found"); - } - return theme; - } - /** * Return the underlying HttpServletRequest. Only intended for cooperating classes in this package. @@ -383,6 +332,39 @@ public class RequestContext { return this.timeZone; } + /** + * Determine the fallback locale for this context. + *
The default implementation checks for a JSTL locale attribute in request, session + * or application scope; if not found, returns the {@code HttpServletRequest.getLocale()}. + * @return the fallback locale (never {@code null}) + * @see javax.servlet.http.HttpServletRequest#getLocale() + */ + protected Locale getFallbackLocale() { + if (jstlPresent) { + Locale locale = JstlLocaleResolver.getJstlLocale(getRequest(), getServletContext()); + if (locale != null) { + return locale; + } + } + return getRequest().getLocale(); + } + + /** + * Determine the fallback time zone for this context. + *
The default implementation checks for a JSTL time zone attribute in request, + * session or application scope; returns {@code null} if not found. + * @return the fallback time zone (or {@code null} if none derivable from the request) + */ + protected TimeZone getFallbackTimeZone() { + if (jstlPresent) { + TimeZone timeZone = JstlLocaleResolver.getJstlTimeZone(getRequest(), getServletContext()); + if (timeZone != null) { + return timeZone; + } + } + return null; + } + /** * Change the current locale to the specified one, * storing the new locale through the configured {@link LocaleResolver}. @@ -434,6 +416,23 @@ public class RequestContext { return this.theme; } + /** + * Determine the fallback theme for this context. + *
The default implementation returns the default theme (with name "theme"). + * @return the fallback theme (never {@code null}) + */ + protected Theme getFallbackTheme() { + ThemeSource themeSource = RequestContextUtils.getThemeSource(getRequest()); + if (themeSource == null) { + themeSource = new ResourceBundleThemeSource(); + } + Theme theme = themeSource.getTheme(DEFAULT_THEME_NAME); + if (theme == null) { + throw new IllegalStateException("No theme defined and no fallback theme found"); + } + return theme; + } + /** * Change the current theme to the specified one, * storing the new theme name through the configured {@link ThemeResolver}. @@ -870,7 +869,8 @@ public class RequestContext { } /** - * Retrieve the model object for the given model name, either from the model or from the request attributes. + * Retrieve the model object for the given model name, either from the model + * or from the request attributes. * @param modelName the name of the model object * @return the model object */