如何从Java代码设置JSTL语言环境?

时间:2011-05-25 15:00:11

标签: java jstl locale setlocale

我想设置<fmt:formatNumber>和朋友使用的JSTL语言环境。我知道<fmt:setLocale>可以实现这一点,但我需要动态地执行它(取决于从我的数据库中检索的用户数据),并且更喜欢Java代码 - 一个过滤类,确切地说。

我认为将会话属性javax.servlet.jsp.jstl.fmt.locale设置为我想要的Locale实例会有效,但会被忽略:JSTL标记继续使用浏览器区域设置。

我确认没有相同名称的页面上下文或请求属性。

那么我做错了什么?或者我真的需要从JSP中做到吗?

读取JSTL代码,我找到了对LocalizationContext的引用,并认为我需要设置一个。然而,我无法确切地弄清楚它如何适合图片或如何设置图片。

5 个答案:

答案 0 :(得分:28)

你需要第二个:

设置JSTL区域设置的3种方法: /以及默认的应用程序资源包,时区和数据源/

  1. 通过JSTL操作设置 - 这允许通过范围属性指定范围。

    <fmt:setLocale value="en_US" scope="session"/>
    
  2. 以编程方式设置 - 允许通过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)
    
  3. 上下文设置初始化参数 - 指定在任何标准范围内找不到设置时使用的值。

    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
        <param-value>en_US</param-value>
    </context-param>
    
  4. jstl-quick-reference (PDF)

答案 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");