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 Map
Map<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 locale
Object 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) locale
locale = 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对象后,调用下一个拦截器......

struts2 18拦截器详解(五)的更多相关文章

  1. struts2 18拦截器详解(七)

    ChainingInterceptor 该拦截器处于defaultStack第六的位置,其主要功能是复制值栈(ValueStack)中的所有对象的所有属性到当前正在执行的Action中,如果说Valu ...

  2. struts2 18拦截器详解(十)

    ModelDrivenInterceptor 该拦截器处于defaultStack中的第九的位置,在ScopedModelDrivenInterceptor拦截器之后,要使该拦截器有效的话,Actio ...

  3. struts2 18拦截器详解(九)

    ScopedModelDrivenInterceptor 该拦截器处于defaultStack第八的位置,其主要功能是从指定的作用域内检索相应的model设置到Action中,该类中有三个相关的属性: ...

  4. 通俗易懂之SpringMVC&Struts2前端拦截器详解

    直接进入主题吧!一,配置Struts2的拦截器分两步走1配置对应的拦截器类:2在配置文件Struts.xml中进行配置拦截器同时在Strust2中配置拦截器类有三种方法1实现Interceptor接口 ...

  5. struts2内置拦截器和自定义拦截器详解(附源码)

    一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截 ...

  6. Struts2 之 modelDriven & prepare 拦截器详解

    struts2 ModelDriven & Prepareable 拦截器 前面对于 Struts2 的开发环境的搭建.配置文件以及 Struts2 的值栈都已经进行过叙述了!这次博文我们讲解 ...

  7. Struts2拦截器详解

    一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列 ...

  8. Struts2中的拦截器详解

    exception:异常拦截器,拦截异常aliasservletConfig18nprepare:预备拦截器,这个拦截器就是为了ModelDriven准备对象的,若Action类实现了preparab ...

  9. [转]SpringMVC拦截器详解[附带源码分析]

      目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...

随机推荐

  1. 最详细的vue-cli安装教程 &^没有之一 ^& 大神亲测。。╮( ̄▽  ̄)╭

    这里介绍使用git安装,电脑自带命令行依然可以使用进行安装 第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安装 1.2 如果本机已经安装node的运行换 ...

  2. 深入理解SQL的四种连接,左外连接,右外连接,内连接,全连接

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  3. Java中面向对象的理解

    按照惯例,先做一个简单的介绍,现在开始学习 Thinging in Java 4 ,一边看,一边记录,我都不想给自己设定时间安排了,毕竟很少实现过.所以就这样吧!不定期的更新,我都会放到博客中的. 所 ...

  4. 简单介绍下python中函数的基础语法

    python 函数 定义 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 特性 减少代码重复 使程序变得可扩展 使程序变得易于维护 函数的创建 pyt ...

  5. django中两张表有外键关系的相互查找方法,自定义json编码方法

    两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集? 平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找.如果条件是表中外键列所对应表的某一列,该如何 ...

  6. TortoiseGit + msysgit 记住帐号密码方法及使用密匙的方法

    Windows 重度用户只能用 for windows 的软件了,所以虽然使用 Git,但还是要找专门的 windows 版本. 最近开始使用 GitHub 来托管一些小项目/兴趣,而自己是重度 wi ...

  7. Kali2.0通过xrdp实现windows远程链接Linux

    标题:Kali2.0通过xrdp实现windows远程链接Linux apt-get install xrdp 首先需要安装xrdp 接下来安装xfce4 apt-get install xfce4 ...

  8. java的反射机制(第三篇)

    本文转载自:http://c.biancheng.net/cpp/html/1782.html Person p=new Person();这是什么?当然是实例化一个对象了.可是这种实例化对象的方法存 ...

  9. opencv第三课 Canny边缘检测

    #include<stdio.h> #include<iostream> #include<opencv2\opencv.hpp> using namespace ...

  10. MYSQL用户操作管理大杂烩

    一.创建用户 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指定该 ...