如何将JSF语言环境传播到应用程序中的其他层

时间:2010-02-26 15:21:31

标签: java jsf locale

在Java Server Faces中,我们通常使用UIViewRoot.getLocale()方法获取当前请求的语言环境,该方法通常会返回浏览器中设置的语言环境。在分层应用程序中,如何在其他层中读取相同的区域设置,而无法访问JSF对象?似乎Locale.getDefault()不合适,因为它返回JVM范围的默认语言环境。我需要上下文区域设置,仅由来自浏览器的当前请求设置。我认为它需要具有某种线程亲和性,例如.NET的Thread.CurrentCulture属性。

3 个答案:

答案 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。我能想到的两个例子:

  • 发送电子邮件(应选择相应的模板)
  • 以适当的语言生成文档(如pdf)

因此,在业务逻辑中包含区域设置依赖项之前,请三思而后行。

答案 2 :(得分:1)

Locale仅面向Web层;服务层和dao层应使用自定义语言域对象。对于模板,电子邮件等,将Locale转换为Language或使用默认语言。

想一想:如果我调用一个将调用使用区域设置的服务的Web服务会发生什么? Locale将为null!