怎样在架构中合理的设置request中的Lcoale
来源:互联网 发布:综合国力排名2017数据 编辑:程序博客网 时间:2024/05/21 12:45
相信很多朋友在做J2EE国际化的时候,很可能遇到这个问题。因为request中的Locale是非常重要的,它代表着用户浏览器的设置,同时,很多应用都是在这里读取用户Locale然后进行国际化的。
但是问题就在于,如果我们的应用中很多地方都适应request.getLocale()来获取Locale,但是我们希望使用自己的Locale,比如说是User信息中包含了一个叫Locale的字段。那么我们怎样使用比较方便呢?有人说把Locale存在Session中比较合适。其实这个要视情况而定,我们应用中很多使用request.getLocale(),如果我们放在Session中,那么要去改很多getLocale的方法,很不合算。
如果不需要浏览器的Locale或者说,需要让request的getLocale返回一个Locale是我们设置的User.getLcoale()字段的话,怎么解决这一问题,request没有setLocale()这一方法。
- 在web.xml中使用filter,给request包装,重写getLocale()方法
1.使用HttpServletRequestWrapper包装用户的request,在这里可以构造自己想要的方法:
public class LocaleRequestWrapper extends HttpServletRequestWrapper{ public LocaleRequestWrapper(HttpServletRequest request) { super(request); } public Enumeration getLocales() { Vector v = new Vector(1); v.add(getLocale()); return v.elements(); } public Locale getLocale() { String localeStr = ((HttpServletRequest) getRequest()).getSession().getAttribute("locale").toString(); Locale locale = new Locale(localeStr); return locale; }}
这里,locale变量被设置在了Session中,在request中提取,并包装了改Locale并向下传递。
getLocales()返回的是browser中用户所选的所有languages的一个list。而默认情况下,getLocale()返回的是第一个,对该方法进行重写之后,返回的就是我们放在Session中的locale了。
2.在I18NFilter 中提取用户的request并包装为LocaleRequestWrapper,向下传递:public class I18NFilter implements Filter { transient static protected MessageLogger LOG = MessageLogger.getLogger(I18NFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if (servletRequest instanceof HttpServletRequest && ((HttpServletRequest) servletRequest).getSession().getAttribute("locale") != null) { LOG.debug("I18N filter processing..."); HttpServletRequest req = (HttpServletRequest)servletRequest; LocaleRequestWrapper wrapper = new LocaleRequestWrapper(req); filterChain.doFilter(wrapper, servletResponse); } else { filterChain.doFilter(servletRequest, servletResponse); } } @Override public void destroy() { }}3.在web.xml中配置该filter
<filter> <filter-name>I18NFilter</filter-name> <filter-class>com.rsi.uif.filter.I18NFilter</filter-class> </filter><filter>别忘了配置filter-mapping:
<filter-mapping> <filter-name>I18NFilter</filter-name> <url-pattern>/route/*</url-pattern></filter-mapping>
根据我自己的具体应用,做了如下修改:
- 抛开filter,在核心的servlet中的适当位置,对request进行wrap:
好了,再按照刚才的第一个方案中使用的wrapper,对locale封装。这样user Locale 就进入我们的系统啦,融合默契。
public class LocaleRequestWrapper extends HttpServletRequestWrapper{ private Locale locale; public LocaleRequestWrapper(HttpServletRequest request,Locale locale) { super(request); this.locale = locale; } public Enumeration getLocales() { Vector v = new Vector(1); v.add(getLocale()); return v.elements(); } public Locale getLocale() { return this.locale; }}这里可以看到,我们新添加了一个字段,叫做locale,在wrap用户的Lcoale的时候要进行初始化:
LocaleRequestWrapper lrw = new LocaleRequestWrapper((HttpServletRequest)request,context.getUserContext().getUser().getLocale());//封装dispatcher.forward(lrw, response);//转发给view
其实不应该把request的getLocales()给简单的重写掉,保留browser的locale在某些情况下是非常有用的。
- 怎样在架构中合理的设置request中的Lcoale
- 在opengl编程中怎样把初始图形合理的显示在窗口
- 一个架构合理的UITableView应该是怎样的?
- 一个架构合理的UITableView应该是怎样的?
- JSP的Request session的有效时间应合理设置
- 怎样合理的饮用水
- 解决Jsp乱码----在Jsp页面中合理的设置pageEncoding、contentType属性
- 在注册表中怎样解禁Win7的桌面背景设置
- 在对话框中怎样设置文字的颜色和大小
- 在pads2007中怎样设置走线的宽度
- 怎样在PADS中设置阻焊层的大小
- 怎样在ios开发中设置tableview的cell颜色
- 怎样在Android Studio中进行注释模板的设置
- 怎样在struts2的Action中获取request、response、session对象。
- 在zkcli中怎样操作才会触发com.101tec.ZKClient实现中的subscribeDataChanges设置的监听器
- mysql中key_buffer_size,query_cache_size,table_cache的合理设置
- 在solaris 10 中怎样设置上网?
- 怎样在eclipse中设置字体大小
- SVN的安装以及配置,包括myeclipse的SVN插件安装
- java集合框架学习笔记
- printf的输出顺序
- 字符设备驱动之按键中断(阻塞机制)——FS2410
- Objective-C 队列实现
- 怎样在架构中合理的设置request中的Lcoale
- @property(...)copy还是retain
- C语言学习
- XNA在Silverlight 中的应用
- hadoop 各类key value分隔符参数
- @property(..,..)
- 串口程序设计——struct termios结构体
- FFServer源码分析
- 时间管理,没那么简单!!!