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

我想设置和朋友使用的JSTL语言环境。 我知道这可以通过 ,但我需要动态地执行它(取决于从我的数据库中检索的用户数据),并且更喜欢Java代码 – 精确的filter类。

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

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

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

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

你需要第二个:

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

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

      
  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. 上下文初始化参数设置 – 指定在任何标准范围中找不到设置时使用的值。

      javax.servlet.jsp.jstl.fmt.locale en_US  

jstl-quick-reference(PDF)

您可以在使用EL。 它不需要是硬编码的值或其他东西。

这是一个例子:

   

如果语言是作为带有名称language请求参数提供的,那么它将被设置。 否则,如果语言之前已经通过属性名称language在会话中设置了,那么请坚持使用它。 否则在请求标头中使用用户提供的区域设置。

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

也可以看看:

  • 如何国际化Java Web应用程序?

据我所知,’javax.servlet.jsp.jstl.fmt.locale’被浏览器的语言环境覆盖。 JSTL使用浏览器的语言环境,如果找不到,则使用回退语言环境。 因此,您可以设置请求属性以指定该区域设置。 将此行添加到控制器

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

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

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

希望这可以帮助

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

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