1. 在Actoin中进行异常映射
2. 在package中进行全局异常映射
3. 使用继承共用异常映射
4. Struts2中异常处理由拦截器实现(观察struts-default.xml)
a) 实际上Struts2的大多数功能都由拦截器实现
1. I18N原理
a) ResourceBundle和Locale的概念
b) 资源文件
c) native2ascii
2. Struts的资源文件
a) Action – Package – App级
b) 一般只用APP
i. struts.xml custom.i18n
c) PropertiesEditor插件
i. 解压
ii. features plugin 覆盖到myeclipse中的eclipse目录里
d) 动态语言切换
i. request_locale=en_US
1. Struts架构图
a) 见文档
2. Struts执行过程分析
3. Interceptor拦截器过程模拟
4. 定义自己的拦截器
a) acegi – spring security
5. 使用token拦截器控制重复提交(很少用)
6. 类型转换
a) 默认转换
i. 日期处理
b) 写自己的转换器:
public class MyPointConverter extends DefaultTypeConverter{
@Override
public Object convertValue(Object value, Class toType) {
if(toType == Point.class) {
Point p = new Point();
String[] strs = (String[])value;
String[] xy = strs[0].split(",");
p.x = Integer.parseInt(xy[0]);
p.y = Integer.parseInt(xy[1]);
return p;
}
if(toType == String.class) {
return value.toString();
}
return super.convertValue(value, toType);
}
}
public class MyPointConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
Point p = new Point();
String[] strs = (String[])values;
String[] xy = strs[0].split(",");
p.x = Integer.parseInt(xy[0]);
p.y = Integer.parseInt(xy[1]);
return p;
}
@Override
public String convertToString(Map context, Object o) {
// TODO Auto-generated method stub
return o.toString();
}
}
c) 三种注册方式:
i. 局部:XXXAction-conversion.properties
1. p(属性名称) = converter
ii. 全局:xwork-conversion.properties
1. com.xxx.XXX(类名)= converter
iii. Annotation
d) 如果遇到非常麻烦的映射转换
i. request.setAttribute();
ii. session
63 如果要使用EXT框架,页面编码全使用”UTF-8”
64 引入struts标签的写法<%@tabliburi=”/struts-tags” prefix=”s”%>
64 建议在要取值栈的标签之后加一个<s:debug>方便调试
64 做每行的删除按钮 连接带参数id
66 struts的异常处理:在Service,Actrion等的后台程序中有异常时,你尽管往外抛,及在catch中写throw(e) 到某一个地方,struts会给你一个统一的接口来处理这些抛出来的方法。这就是struts的声明式处理异常。
在上图这里配置异常显示页面
<exception-mapping result=”error”exception=”java.sql.SQLException”/>
<result name=”error”>/error.jsp</result>
可以在该页的值栈里面读取异常信息
66 <global-results>和<global-exception-mappings>(全局异常映射)有先后顺序 必须把前者写在前面
全局异常映射: 任何包继承有全局异常映射配置的包,都可以用这个异常映射
在一个包里面发生异常的时候,先找自己包里面的异常映射, 如果找不到去父包那里找
配置一个global-results中的result用于处理全局的错误,都集中到这个页面中来处理
67 错误处理原理: 拦截器的使用,在struts帮你调用一个action的时候,中间struts在中间加了一些业务逻辑(拦截器),这其中个拦截器就帮你处理了异常问题.
67
一个BUG:当用default-action-ref 去调用一个action时, 不会执行这个action所配的类里面的方法. 只能直接调用这个页面,用一下这种方式可以解决。
69 I18N 国际化
getBundle 这里必须和国际化的properties文件的前半截(第一个下划线前)文件名一模一样
资源文件的命名 XXX_en_US.properties 某名字的资源文件_英文版(en)_为英国写的(UK)
只有UTF-8编码才能支持所有的语言在使用资源文件编写中文之前必须先把struts的字符集改成UTF-8(理论上此处不用到)
编写资源文件时用这种方式打开 右键properties文件 open with>PropertiesEditor
这个editor要自己安装,放在如下图的地方
这是个插件装在MyEclipse下解压后复制到如下图处重启MyEclipse即可
70 国际化
三个级别: Action – package – App
Action级(少用) 起名要和Action一样并且放在同一个包里(只有这个action能用)
包级别的也类比上一个的设置(同样少用)
页面中取该资源文件中的字段的标签如上图
此时显示的字符串的用哪个资源文件由浏览器的浏览默认语言决定
这个调用的方法getText()是调用ActionSupport里面的方法(s:properties里面能直接调用的方法只能是Action里面的方法)
只可能使用APP级别的国际化整个项目的资源文件
上图配置的value名即资源文件名开头
72 国际化的时候 也可以在字符串里面加占位符{0} {1}{2}… 等待参数
参数卸载<s:param> 的name属性里面是解析成ognl表达式
73 动态语言切换:只用在页面上传一个参数,后面访问的页面全部语言都变了.实现的时候用一个按钮 提交回到本页并且传下图中的参数(request_locale=en_US)就可以了
Struts会帮你把action里面的locale设置成你穿的参数 同时也帮你把session里面的locale设置了 所以后面访问的网页都会根据你做的设置变化
75 如果想在页面里面拿到 ValueStack的话 用如下图代码
拦截器调用过程:源码解析图
总结: struts的ActionInvocation依次调用配置好的invocation 调用完之后再去调用Action之中我们指定的方法
Struts的文档里面/docs/big-pictures.html有官方的struts原理图