I18nInterceptor

该拦截器处理defaultStack第四的位置,是用来方便国际化的,如果说我们的一个Web项目要支持国际化的话,通常的做法是给定一个下拉框列出所支持的语言,当用户选择了一种语言后后面浏览的所有页面自动切换到所选择的语言版本,而该拦截器就是用来实现该功能的。要实现语言切换说白了就是动态改变Locale。

在该拦截器中定义了三个属性,分别是:parameterName,requestOnlyParameterName,attributeName,这三个属性都有默认值,相应地分别是:"request_locale","request_only_locale","WW_TRANS_I18N_LOCALE",当然可以手动地给该拦截器传递参数以改变这几个属性的值。第一个属性的指的是切换Locale时指定的request参数名称并且要把Locale存储到session中,第二个参数与第一个意思一样只不过不存储到session中,只对当前request有效,第三个参数指的是存储到session中的Locale的key。下面看一下该拦截器是如何实现该功能的:

@Override
public String intercept(ActionInvocation invocation) throws Exception {//省略...//获取请求参数Map<String, Object> params = invocation.getInvocationContext().getParameters();boolean storeInSession = true;//是否要把Locale存在session中的开关变量Object requested_locale = findLocaleParameter(params, parameterName);if (requested_locale == null) {//无request_locale参数requested_locale = findLocaleParameter(params, requestOnlyParameterName);if (requested_locale != null) {//有request_only_locale参数storeInSession = false;//是request_only_locale则不存储在session中}}//获取session MapMap<String, Object> session = invocation.getInvocationContext().getSession();Locale locale = null;if (requested_locale != null) {//请求参数中有request_locale或request_only_locale//将字符串转化为Locale对象locale = (requested_locale instanceof Locale) ?(Locale) requested_locale : LocalizedTextUtil.localeFromString(requested_locale.toString(), null);//省略...}if (session != null) {synchronized (session) {if (locale == null) {//如果请求参数中即没有request_locale也没有request_only_locale// check session for saved localeObject sessionLocale = session.get(attributeName);//如果session中已经有Locale对象if (sessionLocale != null && sessionLocale instanceof Locale) {locale = (Locale) sessionLocale;//把session中的Locale对象获取出来//省略...} else {//如果session中也没有Locale对象// no overriding locale definition found, stay with current invokation (=browser) localelocale = invocation.getInvocationContext().getLocale();//则获取ActionContext中的Locale//省略...storeInSession = false;//并且不存储到session中}}if (storeInSession) {//如果storeInSession为true则把Locale存储到Session中session.put(attributeName, locale);}}}saveLocale(invocation, locale);//将Locale存储到ActionContext中//省略...return result;
}
//从请求参数中获取Locale字符串值
private Object findLocaleParameter( Map<String, Object> params, String parameterName ) {Object requested_locale = params.remove(parameterName);if (requested_locale != null && requested_locale.getClass().isArray()&& ((Object[]) requested_locale).length == 1) {requested_locale = ((Object[]) requested_locale)[0];}return requested_locale;
}
//将Locale对象存储到ActionContext中
protected void saveLocale(ActionInvocation invocation, Locale locale) {invocation.getInvocationContext().setLocale(locale);
}

为了更集中于功能实现,上面的方法中省略了日志if判断,如果要看完整源码请参看struts2自带源码。
   sturts2是根据ActionContext中的Locale对象去找相应的国际化资源文件的,所以要动态切换语言版本就是要动态改变ActionContext中的Locale对象,intercept方法中的执行逻辑上面的注释已经写得清楚了,这里列举一下传递request参数时可能出现的情况:
1.只传递request_locale参数,该拦截器就会将该参数值转成一个Locale对象,然后以"WW_TRANS_I18N_LOCALE"为吸存储到session中,并且更新ActionContext中的Locale对象,这样如果在以后的请求参没有传递request_locale参数,这时session中已经有了Locale对象,那么该拦截器就会将session中的Locale对象更新到ActionContext中,这样就可以实现语言的切换了。
2.只传递request_only_locale对数,这种情况下Locale对象不会存储到session中,在该次请求能将传递的Locale更新到ActionContext中因为没有存储到session中,在以后的请求中如果没有传递request_only_locale或request_locale,那么被更新到ActionContext中Locale
还是ActionContext原先的Locale,这样又回到了原来的语言版本。
3.request_locale与request_only_locale都没有传递,这种情况不用解释。

更新完ActionContext中的Locale对象后,调用下一个拦截器......

转载于:https://www.cnblogs.com/pangblog/p/3400265.html

struts2 18拦截器详解(五)相关推荐

  1. java参数action_Struts2之Action接收请求参数和拦截器详解

    技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API 需求:提供JSP的表单页面的数据,在Action中使用Servlet的A ...

  2. 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.   ...

  3. 第五章 处理器拦截器详解

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

  4. structs2拦截器详解

    Struts2(XWork)提供的拦截器的功能说明: 拦截器 名字 说明 Alias Interceptor alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变 Chaining In ...

  5. springMVC教程--拦截器详解

    3 拦截器 3.1 定义 Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理. 3.2 拦截器定义 实现HandlerInte ...

  6. AspectCore动态代理中的拦截器详解(一)

    前言 在上一篇文章使用AspectCore动态代理中,简单说明了AspectCore.DynamicProxy的使用方式,由于介绍的比较浅显,也有不少同学留言询问拦截器的配置,那么在这篇文章中,我们来 ...

  7. 一文贯通→过滤器与拦截器详解

    一.过滤器Filter 过滤器英文叫 Filter,是 JavaEE 的标准,依赖于 Servlet 容器,可以按照指定顺序配置多个.常用来配置请求编码以及过滤一些非法参数,垃圾信息或者是网站登录验证 ...

  8. ​​​​​​过滤器和拦截器详解

    过滤器 和 拦截器的 6个区别,别再傻傻分不清了_程序员小富的博客-CSDN博客_过滤器和拦截器 若依登陆过程及过滤器拦截器的使用: 用户登陆接口:1.把用户信息通过uuid即token作为key,存 ...

  9. Flutter 网络请求 Dio 拦截器详解

    老王的烦恼 昔日的小王凭借这他的小心谨慎和借助漂亮能干的女友 Dio 的辅助,终于干下了一番事业,成为中华大地响当当的人物,小王也变成老王.如今,老王已经年近花甲,看似迈上了人生巅峰,却也遇到了人生的 ...

最新文章

  1. C语言编译全过程剖析
  2. 6. Qt 信号与信号槽 (5)-QObjectPrivate
  3. 资源文件(.RES)的应用
  4. 再见 Typora,这款 Markdown 编辑器开源又免费!
  5. jira-enterprise-3.6.4-standalone + confluence-2.2.8 + MySQL5.0 安装破解全过程
  6. 2022-2-20stream流的复习
  7. Django 项目试炼blog(5) -- 个人站点的搭建
  8. Ubuntu配置——SS浏览器和终端代理、主题美化
  9. 记阿里电话面试失败过程
  10. 论文笔记之Understanding and Diagnosing Visual Tracking Systems
  11. file:/usr/local/hive/iotmp/89de7dfe-8f26-4a6e-87b4-bacd16c2b2c8/hive_2021-11-05_05-06-07_555_3392062
  12. Rabbitmq- 消费者ack机制与发布者消息确认
  13. 1 error and 0 warnings potentially fixable with the `--fix` option.
  14. r语言kmeans聚类(真实案例完整流程)
  15. Android底部弹出选择框PickerView的使用
  16. twemproxy配置详解
  17. 小苏的Shell编程笔记之五--Shell的控制结构
  18. 电压源的电路分析知识分享
  19. html+css复习(三)
  20. Python基本用法介绍

热门文章

  1. 基于Winsock API的VC网络编程实战
  2. Terminal Services将改名为RDS
  3. 阿里云Elasticsearch 智能化运维实践
  4. 比特币是什么,看这篇就懂了
  5. Noriben沙箱:分分钟搞定恶意软件
  6. 传智播客视频学习 ---- 字符串含义( C 语言中)
  7. 从字符串指定位置删除指定个数的字符
  8. Linux 的性能进行监测
  9. ROS学习笔记_创建工作空间(一)
  10. 微信 WEUI 的 switch button 精简提取