在Java Server Faces中,我们通常使用UIViewRoot.getLocale()
方法获取当前请求的语言环境,该方法通常会返回浏览器中设置的语言环境。在分层应用程序中,如何在其他层中读取相同的区域设置,而无法访问JSF对象?似乎Locale.getDefault()
不合适,因为它返回JVM范围的默认语言环境。我需要上下文区域设置,仅由来自浏览器的当前请求设置。我认为它需要具有某种线程亲和性,例如.NET的Thread.CurrentCulture
属性。
答案 0 :(得分:3)
不是你想要的答案,但在分层设计中,答案应该是:你没有。
只有表示层才能根据语言环境进行数据格式化。
业务层和数据层应以与语言环境无关的方式保存和操作数据。
答案 1 :(得分:2)
您可以将其作为参数传递给需要它的方法。我认为这是最好的方法。
public void businessMethod(String someArg, int otherArg, Locale locale) {
..
}
然而,它需要修改您的方法签名。您可以通过以下方式实现.NET中的某些功能:
public final class LocaleProvider {
private static ThreadLoca<Locale> currentLocale;
//static setters and getters for the threadLocal
}
但这基本上是FacesContext.get....getLocale()
正在做的事情。所以除了在服务层中摆脱JSF的依赖关系之外,你没有做更多的事情。
也就是说,业务运营中很少需要当前的Locale
。我能想到的两个例子:
因此,在业务逻辑中包含区域设置依赖项之前,请三思而后行。
答案 2 :(得分:1)
Locale仅面向Web层;服务层和dao层应使用自定义语言域对象。对于模板,电子邮件等,将Locale转换为Language或使用默认语言。
想一想:如果我调用一个将调用使用区域设置的服务的Web服务会发生什么? Locale将为null!