- 浏览: 338157 次
文章分类
最新评论
-
luokery:
你把正常的代码放到try里面不就好了, 异常的时候就catch ...
巧用while循环避免执行除了异常处理的的另一个处理机制 -
java_doom:
这个行号根据什么来的 为什么不是连续的?
别拿Hadoop map key当id使 -
mixer_b:
...
写博客的那些事儿 -
flyfx:
谢谢谢谢
java break,continue,return 使用。【借鉴与改编】 -
andilyliao:
比起青鸟 我更鄙视大学。
北大青鸟就让你们这么鄙视吗.
相信很多朋友在做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() {
- }
- }
- <filter>
- <filter-name>I18NFilter</filter-name>
- <filter-class>com.rsi.uif.filter.I18NFilter</filter-class>
- </filter>
- <filter>
- <filter-mapping>
- <filter-name>I18NFilter</filter-name>
- <url-pattern>/route/*</url-pattern>
- </filter-mapping>
这种方案是可行的,但是它有一个明显的问题:当用户第一层登陆进来的时候,由于初次访问server,session中的locale还没有设置(及可能是filter拦截的locale的时候,要访问的页面还没有还是执行,session中没有locale),这时候会出现整个架构使用了浏览器的lcoale。
根据我自己的具体应用,做了如下修改:
- 抛开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;
- }
- }
- LocaleRequestWrapper lrw = new LocaleRequestWrapper((HttpServletRequest)request,context.getUserContext().getUser().getLocale());//封装
- dispatcher.forward(lrw, response);//转发给view
后记--值得改进一下的地方:
其实不应该把request的getLocales()给简单的重写掉,保留browser的locale在某些情况下是非常有用的。
发表评论
-
java如何终止线程
2012-04-24 21:38 1086对于线程的终止或者中断,由于java中Thread.stop方 ... -
ubuntu-11.10-server-i386学习笔记-网络基本配置
2012-04-23 22:11 10501. 静态IP地址配置 配置文件路径:/etc/networ ... -
ubuntu-11.10-server-i386学习笔记-Apache安装
2012-04-23 22:11 844第一步:先更新安装包缓存 1.1 sudo apt-get ... -
ubuntu-11.10-server-i386学习笔记-SVN版本服务器安装
2012-04-23 22:10 1141在安装SVN前,假设你的Apache已经安装好了。 ... -
ubuntu-11.10-server-i386学习笔记-SVN版本服务器-客户端测试
2012-04-23 22:10 756进入客户端测试之前,您应该确保svn服务器已经正确安装,如果您 ... -
svn服务器搭建经验总结
2012-04-23 22:09 1035从最近几天的实验来看,svn(Subversion versi ... -
Java根据word模板生成word文档之后台解析和实现及部分代码(二)
2012-04-18 13:59 1957上一节贴出了web应用访问生成报告的action ... -
Java根据word模板生成word文档之后台解析和实现及部分代码(一)
2012-04-18 13:59 2139后台主要工作是解析XML定义的标签文件,并 ... -
单例类、final、抽象类
2012-04-15 23:53 1675前些日子一直没写博客,因为病了,所以就耽误了,现在好点了 ... -
一个Java时间工具类
2012-04-14 21:50 1045主要包含了对时间操作的一些工具方法,仅供参考吧! ... -
POI Excel导出,我的又一个模板方法
2012-04-14 21:49 2867下面有源码,下载就可以用,如果因为包的问题,就拷贝我 ... -
Poi 读写Excel 合并ExcelSheet Struts2实现
2012-04-14 21:48 1543网上有许多人在找这样的例子,有多个Excel,要把他们合 ... -
POI读取Excel浅谈
2012-04-14 21:48 936先看代码,挨句解释: 一般遍历使用两种方式,1:得到总 ... -
struts2项目中静态html在firefox下乱码的解决
2012-04-13 00:03 1031struts2 项目,通常开 ... -
黑马程序员——Java开发前奏
2012-04-12 23:59 829对于Java,我的一 ... -
《JAVA与模式》之单例模式
2012-04-12 23:58 796在阎宏博士的《JAVA与模式》一书中开头是这样描述单例模 ... -
Java中的String不再纠结
2012-04-12 23:58 1462又是新的一月,又是各种总结,先分享一下java中st ... -
swing绘制了一只直升机
2012-04-12 23:56 3564周末用swing绘制了一只直升机 对swing的的绘制技 ...
相关推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
铅酸电池失效仿真comsol
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
springboot124中药实验管理系统设计与实现,含有完整的源码和报告文档
解除劳动合同协议书
快速过滤图像融合Matlab代码.rar
强调图像中内核形状(例如直线)的过滤器Matlab代码.rar
在内网linux服务器安装redis 在Linux环境中离线安装Redis是常见的需求,尤其是在内网服务器上,由于无法直接访问公网,我们需要提前下载Redis的源码包并手动安装。下面将详细解释如何进行这一过程。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
微信小程序StartKitw_xapp-startkit
座位选择微信小程序版本
机械臂代码_Mechanical_arm
图像分割测试视频river-light.mp4
前端分析-2023071100789
labview源码参考示例,可供参考学习使用
MPC跟踪轨迹圆形(以后轴为基准)
MATLAB代码:基于主从博弈的智能小区代理商定价策略及电动汽车充电管理 关键词:电动汽车 主从博弈 动态定价 智能小区 充放电优化 参考文档:《基于主从博弈的智能小区代理商定价策略及电动汽车充电管理》基本复现 仿真平台:MATLAB+CPLEX gurobi平台 优势:代码具有一定的深度和创新性,注释清晰,非烂大街的代码,非常精品 主要内容:代码主要做的是一个电动汽车充电管理和智能小区代理商动态定价的问题,将代理商和车主各自追求利益最大化建模为主从博弈,上层以代理商的充电电价作为优化变量,下层以电动汽车的充电策略作为优化变量,通过优化得出最优电价策略以及动态充电策略,代码出图效果非常好,店主已经对代码进行了深入的加工和处理,出图效果非常好,代码质量非常高,保姆级的注释以及人性化的模块子程序,所有数据均有可靠来源,联系后会直接发您资料,保证您学得会,用的起来,简直是萌新福利
springboot154基于Spring Boot智能无人仓库管理,含有完整的源码和报告文档
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作