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

2022-09-02 19:43:05

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

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

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

那么我做错了什么呢?或者我真的需要从JSP中执行此操作吗?

阅读JSTL代码,我发现了对a的引用,并认为我需要设置一个。不过,我无法完全弄清楚它如何适合图片或如何设置一个。LocalizationContext


答案 1

你需要第二个:

设置 JSTL 语言环境的 3 种方法:/以及默认的应用程序资源包、时区和数据源/

  1. 由 JSTL 操作设置 – 这允许通过 scope 属性指定 scope。

    <fmt:setLocale value="en_US" scope="session"/>
    
  2. 以编程方式设置 – 允许通过配置 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>
    

jstl-quick-reference (PDF)


答案 2

您可以在 中使用 EL。它不需要是硬编码的值或其他什么东西。<fmt:setLocale>

下面是一个示例:

<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />

如果语言是作为带有 name 的请求参数提供的,则将对其进行设置。否则,如果该语言之前已在会话中按属性名称设置,则改为坚持使用它。否则,在请求标头中使用用户提供的区域设置。languagelanguage

如果在筛选器代码中执行 a,则将使用它 - 如果未设置任何请求参数。session.setAttribute("language", language)

另请参阅:


推荐