如何将JSF区域设置传播到应用程序中的其他层
在Java Server Faces中,我们通常会使用UIViewRoot.getLocale()
方法获取当前请求的区域设置,该方法通常会返回浏览器中设置的区域设置。在分层应用程序中,如何在其他层中读取相同的语言环境,并且无法访问JSF对象?看起来Locale.getDefault()
不适合,因为它返回一个JVM范围的默认语言环境。我需要上下文语言环境,仅由来自浏览器的当前请求设置。我认为它需要具有某种线程亲和力,就像.NET的Thread.CurrentCulture
属性一样。如何将JSF区域设置传播到应用程序中的其他层
您可以将它作为参数传递给需要它的方法。我认为这是最好的方法。
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)
所以,三思包括前您的业务逻辑中的语言环境依赖关系。
有趣的滚动你自己的解决方案。但是我正在寻找一种官方的,框架内的方式,就像.NET一样。如果它不存在,我可能会跟你的想法。 – 2010-02-26 15:54:30
不是你可能期望的答案,但是在分层设计中,答案应该是:你不需要。
只有表示层应根据语言环境进行数据格式化。
业务层和数据层应该以独立于区域的方式保存和操作数据。
语言环境仅针对Web层;服务层和dao层应该使用自定义语言域对象。对于模板,电子邮件等将区域设置转换为语言或使用默认语言。
想一想:如果我调用一个将调用使用语言环境的服务的Web服务,会发生什么情况?区域设置将为空!
你到底需要什么?你有没有考虑过把它作为一个论点来传递? – BalusC 2010-02-26 16:34:56
这不应该是一个参数,它是一种上下文信息。 – 2010-02-26 18:20:35