如何从 Java 代码设置 JSTL 语言环境?
我想设置
和朋友使用的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您需要第二种:
设置 JSTL 语言环境的 3 种方法:
/以及默认应用程序资源包、时区和数据源/
通过 JSTL 操作设置 - 这允许通过范围属性指定范围。
以编程方式设置 - 允许通过配置 API 指定范围。
由上下文设置初始化参数 - 指定在任何标准范围中找不到设置时使用的值。
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/
Set by a JSTL action – this allows specification of scope by the scope attribute.
Set Programmatically – allows specification of scope via the Config API.
Set by Context Initialization Parameters – specifies value used if setting not found in any of the standard scopes.
jstl-quick-reference (PDF)
您可以在
中使用 EL。它不需要是硬编码值或其他东西。下面是一个示例:
如果语言作为请求参数提供,名称为
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:
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 namelanguage
, 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:
据我所知,“javax.servlet.jsp.jstl.fmt.locale”被浏览器的区域设置覆盖。 JSTL 使用浏览器的区域设置,如果未找到,它会使用后备区域设置。因此,您可以设置请求属性来指定该区域设置。将此行添加到您的控制器中
使用此行将设置 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
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
如果您依赖于数据库中的数据,可能有更好的方法将此逻辑插入您的
'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
还有另一种方法。在 servlet 中,您可以通过创建会话属性来设置区域设置,如下所示:
There is another way. In the servlet, you can set the locale by creating a session attribute, like so: