如何将JSF区域设置传播到应用程序中的其他层

问题描述:

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

+1

你到底需要什么?你有没有考虑过把它作为一个论点来传递? – BalusC 2010-02-26 16:34:56

+0

这不应该是一个参数,它是一种上下文信息。 – 2010-02-26 18:20:35

您可以将它作为参数传递给需要它的方法。我认为这是最好的方法。

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)

所以,三思包括前您的业​​务逻辑中的语言环境依赖关系。

+0

有趣的滚动你自己的解决方案。但是我正在寻找一种官方的,框架内的方式,就像.NET一样。如果它不存在,我可能会跟你的想法。 – 2010-02-26 15:54:30

不是你可能期望的答案,但是在分层设计中,答案应该是:你不需要。

只有表示层应根据语言环境进行数据格式化。

业务层和数据层应该以独立于区域的方式保存和操作数据。

+0

在极少数情况下,它需要语言环境(请参阅我的回答) – Bozho 2010-02-26 15:33:51

+0

我认为,如果您引入一个客户实体具有客户的所有偏好(如默认语言),那么与客户沟通有关的这些情况会得到更好的支持,电子邮件地址等,然后您将客户实体一起传递。大多数时候,我不想用法语进行通信,而我的浏览器是英文:)但是我明白你的观点。 – ewernli 2010-02-26 15:48:21

+0

语言环境还可用于例如从数据访问层获取用户语言的产品名称。这不是从低层访问用户的区域设置的有效点吗? – 2010-02-26 15:51:10

语言环境仅针对Web层;服务层和dao层应该使用自定义语言域对象。对于模板,电子邮件等将区域设置转换为语言或使用默认语言。

想一想:如果我调用一个将调用使用语言环境的服务的Web服务,会发生什么情况?区域设置将为空!