如何从Java代码设置JSTL语言环境?
我想设置和朋友使用的JSTL语言环境。 我知道这可以通过
,但我需要动态地执行它(取决于从我的数据库中检索的用户数据),并且更喜欢Java代码 – 精确的filter类。
我认为将会话属性javax.servlet.jsp.jstl.fmt.locale
设置为我想要的Locale
实例会起作用,但会被忽略:JSTL标记继续使用浏览器区域设置。
我确认没有相同名称的页面上下文或请求属性。
那么我做错了什么? 或者我真的需要从JSP中做到这一点吗?
阅读JSTL代码,我发现了对LocalizationContext
引用,并认为我需要设置一个。 然而,我无法确切地弄清楚它如何适合图片或如何设置图片。
你需要第二个:
3种设置JSTL语言环境的方法: /以及默认的应用程序资源包,时区和数据源/
-
通过JSTL操作设置 – 这允许通过scope属性指定范围。
-
以编程方式设置 – 允许通过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)
-
由上下文初始化参数设置 – 指定在任何标准范围中找不到设置时使用的值。
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");