从任何类中都能获取request中的属性,只能用线程局部变量吗?

web应用中实现国际化,基于request.getLocale获取请求者的国家语言,所以很多类中都会用到:
ResourceBundle messages = ResourceBundle.getBundle("message",locale);
来获取适当的资源文件,因此需要在所有类中都能取到request中的locale属性。

我可以创建一个线程局部变量来存放它,如:
public class I18nUnit {
private static final ThreadLocal locale = new ThreadLocal();
......
public static String getLocale() {
if (locale.get() == null) {
return "";
}
return (String) locale.get();
}
}
在servlet的doService方法开头设置这个变量,然后在任意类中用I18nUnit.getLocale()获取,能够实现。

但我觉得这个办法挺另类挺绕的,应该有更容易的获取方式吧?
[b]问题补充:[/b]
lovewhzlq:那么在任意类中如何获取session呢?我原来都是request.getSession(),任意类中如果取不到request,session也得不到啊
[b]问题补充:[/b]
bohemia:
有些普通类中要抛出异常,异常消息需要是国际化的,抛出后是要展示给用户看的,您认为有其它方法可以解决吗?

5个回答

[quote]有些普通类中要抛出异常,异常消息需要是国际化的,抛出后是要展示给用户看的,您认为有其它方法可以解决吗? [/quote]
如jansel所说.
及时有异常,也只是在Exception对象中包含了要国际化资源的Key.
到了错误页面,或者Action部分,一样可以国际化.

应该不一定要把异常中的信息,直接写成国际化处理后的明文吧?

直接放在用户session里嘛,这就是用户线程安全的了,每个用户都对应他们自己的session

搞个监听器,实现HttpSessionListener接口,它用于得到当前绑定的session
给这个监听器写一个static方法,用于得到session,这样就行了

[quote]所以很多类中都会用到:
ResourceBundle messages = ResourceBundle.getBundle("message",locale);
来获取适当的资源文件,因此需要在所有类中都能取到request中的locale属性。[/quote]
我的理解,国际化,应该是针对页面展示部分的国际化,只有在WEB层才做到国际化.
没必要,也不能把所有的request,locale传递到所有类. 这样的影响会更大.

spring,struts的国际化,也是只限定在WEB层.

异常应该统一在Action处理,在Action中抓取异常,根据异常获取国际化的资源Key值。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐