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

发布于 2024-11-09 19:35:58 字数 485 浏览 2 评论 0原文

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

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

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

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

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

I want to set the JSTL locale which is used by <fmt:formatNumber> and friends. I know this is possible with <fmt:setLocale>, but I need to do it dynamically (depending on user data retrieved from my DB) and would prefer Java code - a filter class, to be precise.

I thought setting the session attribute javax.servlet.jsp.jstl.fmt.locale to my desired Locale instance would do the trick, but it is ignored: The JSTL tags keep using the browser locale.

I verified there are no page context or request attributes of the same name.

So what am I doing wrong? Or do I really need to do it from a JSP?

Reading the JSTL code, I found references to a LocalizationContext and think I need to set one. I couldn't quite figure out exactly how it fits into the picture or how to set one, though.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

旧伤还要旧人安 2024-11-16 19:35:58

您需要第二种:

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

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

    
    
  2. 以编程方式设置 - 允许通过配置 API 指定范围。

    导入javax.servlet.jsp.jstl.core.Config;
    (...)
    Config.set( 会话, Config.FMT_LOCALE, new java.util.Locale("en", "US") )
    // 或 Locale.forLanguageTag("en-US")(java 1.7 及更高版本)
    
  3. 由上下文设置初始化参数 - 指定在任何标准范围中找不到设置时使用的值。

    <上下文参数>
        <参数名称>javax.servlet.jsp.jstl.fmt.locale
        <参数值>en_US
    
    

jstl-quick-reference (PDF)

you need the 2nd:

3 ways to set JSTL locale:
/as well as default application resource bundle, time zone, and data source/

  1. Set by a JSTL action – this allows specification of scope by the scope attribute.

    <fmt:setLocale value="en_US" scope="session"/>
    
  2. Set Programmatically – allows specification of scope via the 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. Set by Context Initialization Parameters – specifies value used if setting not found in any of the standard scopes.

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

jstl-quick-reference (PDF)

碍人泪离人颜 2024-11-16 19:35:58

您可以在 中使用 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),那么如果未设置请求参数,将会使用它。

另请参阅:

You can just use EL in <fmt:setLocale>. It doesn't need to be a hardcoded value or something.

Here's an example:

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

If the language was supplied as request parameter with name language, then it will be set. Else if the language was already previously set in the session by attribute name language, then stick to it instead. Else use the user supplied locale in the request header.

If you do a session.setAttribute("language", language) in your filter code, then it will be used -if no request parameter is been set.

See also:

丶视觉 2024-11-16 19:35:58

据我所知,“javax.servlet.jsp.jstl.fmt.locale”被浏览器的区域设置覆盖。 JSTL 使用浏览器的区域设置,如果未找到,它会使用后备区域设置。因此,您可以设置请求属性来指定该区域设置。将此行添加到您的控制器中

request.setAttribute("javax.servlet.jsp.jstl.fmt.fallbackLocale.request", "en-us");

使用此行将设置 JSTL 将使用的区域设置。请注意属性名称中的 .request,如果将此属性设置为其他范围,则必须使用不同的后缀。对于 HttpSession,后缀是 .session,对于 ServletContext,后缀是 .application

As far as I know, 'javax.servlet.jsp.jstl.fmt.locale' is overridden by the browser's locale. JSTL uses the browser's locale and if that's not found, it uses a fallback locale. So you can set a request attribute to specify that locale. Add this line to your controller

request.setAttribute("javax.servlet.jsp.jstl.fmt.fallbackLocale.request", "en-us");

Using this will set the locale which JSTL will use. Note the .request in the attribute name, if you set this attribute to some other scope, you'll have to use different suffix. For HttpSession the suffix is .session, for ServletContext the suffix is .application

你列表最软的妹 2024-11-16 19:35:58

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

希望这会有所帮助

If you are dependent on data from DB, may be there is better way to insert this logic into your 'router' or 'controller' (depends on which framework are you using). Just extend url with parameter ?lang='en'

Hope this helps

衣神在巴黎 2024-11-16 19:35:58

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

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

There is another way. In the servlet, you can set the locale by creating a session attribute, like so:

request.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", "ko-KR");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文