【问题标题】:How to set JSTL locale from Java code?如何从 Java 代码设置 JSTL 语言环境?
【发布时间】:2011-05-25 15:00:11
【问题描述】:

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

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

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

那我做错了什么?还是我真的需要通过 JSP 来做?

阅读 JSTL 代码,我发现了对 LocalizationContext 的引用,并认为我需要设置一个。不过,我不太清楚它是如何融入图片或如何设置的。

【问题讨论】:

  • 您是否尝试通过 request.setAttribute() 将 java 值设置为请求? JSTL(也可以)读取请求范围。
  • 我只是试了一下,但它并没有改变任何东西。

标签: java jstl locale setlocale


【解决方案1】:

你需要第二个:

设置 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 设置初始化参数 - 指定在任何标准范围内均未找到设置时使用的值。

    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
        <param-value>en_US</param-value>
    </context-param>
    

jstl-quick-reference (PDF)

【讨论】:

    【解决方案2】:

    您可以在&lt;fmt:setLocale&gt; 中使用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),那么它将被使用 - 如果没有设置请求参数。

    另见:

    【讨论】:

    • 我知道我不需要 setLocale 的硬编码值。不过,我仍然更喜欢 Java 类中的“干净”解决方案。
    • 老实说,我看不出从控制器内部摆弄 view taglib 特定类是多么“干净”。
    • 这显然是一个品味问题。我自己宁愿不依赖 JSP(包含)来做正确的事情。另一方面,Java 代码被单元测试覆盖,可以通过工具支持等进行重构......
    • BalusC,可能 OP 想要的是避免在 DRY 传统中的每个 jsp 中调用 &lt;fmt:setLocale&gt; 的需要。
    • @Jens:只需在过滤器中设置必要的属性并在&lt;fmt:setLocale&gt; 中引用它?我看不出这会如何破坏单元测试或重构。 @Tahir:明智地使用模板/&lt;jsp:include&gt;
    【解决方案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

    【讨论】:

      【解决方案4】:

      如果您依赖数据库中的数据,可能有更好的方法将此逻辑插入您的'router''controller'(取决于您使用的框架)。只需使用参数?lang='en'扩展url

      希望对你有帮助

      【讨论】:

      • 我不明白这对 JSTL 有何帮助。我仍然需要将 标记添加到 JSP,对吗?这正是我想要避免的。
      【解决方案5】:

      还有另一种方法。在 servlet 中,您可以通过创建会话属性来设置语言环境,如下所示:

      request.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", "ko-KR");
      

      【讨论】:

        猜你喜欢
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-22
        • 2015-03-25
        • 2015-12-03
        • 1970-01-01
        • 2019-08-27
        相关资源
        最近更新 更多