我想设置<fmt:formatNumber>
和朋友使用的JSTL语言环境。我知道<fmt:setLocale>
可以实现这一点,但我需要动态地执行它(取决于从我的数据库中检索的用户数据),并且更喜欢Java代码 - 一个过滤类,确切地说。
我认为将会话属性javax.servlet.jsp.jstl.fmt.locale
设置为我想要的Locale
实例会有效,但会被忽略:JSTL标记继续使用浏览器区域设置。
我确认没有相同名称的页面上下文或请求属性。
那么我做错了什么?或者我真的需要从JSP中做到吗?
读取JSTL代码,我找到了对LocalizationContext
的引用,并认为我需要设置一个。然而,我无法确切地弄清楚它如何适合图片或如何设置图片。
答案 0 :(得分:28)
你需要第二个:
设置JSTL区域设置的3种方法: /以及默认的应用程序资源包,时区和数据源/
通过JSTL操作设置 - 这允许通过范围属性指定范围。
<fmt:setLocale value="en_US" scope="session"/>
以编程方式设置 - 允许通过Config API指定范围。
import javax.servlet.jsp.jstl.core.Config;
(...)
Config.set( session, Config.FMT_LOCALE, new java.util.Locale("en", "US") )
// or Locale.forLanguageTag("en-US") (java 1.7 and later)
由上下文设置初始化参数 - 指定在任何标准范围内找不到设置时使用的值。
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>en_US</param-value>
</context-param>
答案 1 :(得分:12)
您可以在<fmt:setLocale>
中使用EL。它不需要是硬编码值或其他东西。
以下是一个例子:
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
如果语言是作为名称为language
的请求参数提供的,那么它将被设置。否则,如果语言之前已经按属性名称language
在会话中设置了,那么请坚持使用它。否则,请在请求标头中使用用户提供的区域设置。
如果您在过滤器代码中执行了session.setAttribute("language", language)
,那么将使用它 - 如果没有设置请求参数。
答案 2 :(得分:3)
据我所知,'javax.servlet.jsp.jstl.fmt.locale'被浏览器的语言环境覆盖。 JSTL使用浏览器的语言环境,如果找不到,则使用回退语言环境。因此,您可以设置请求属性以指定该区域设置。将此行添加到控制器
request.setAttribute("javax.servlet.jsp.jstl.fmt.fallbackLocale.request", "en-us");
使用它将设置JSTL将使用的语言环境。请注意属性名称中的 .request ,如果将此属性设置为其他范围,则必须使用不同的后缀。对于HttpSession,后缀为 .session ,对于ServletContext,后缀为 .application
答案 3 :(得分:0)
如果您依赖于来自数据库的数据,可能有更好的方法将此逻辑插入'router'
或'controller'
(取决于您使用的是哪个框架)。只需使用参数?lang='en'
希望这有帮助
答案 4 :(得分:0)
还有另一种方式。在servlet中,您可以通过创建会话属性来设置区域设置,如下所示:
request.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", "ko-KR");