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
1. Lambda表达式
2. 验证框架
3. UI标签
4. 类型转换中的异常处理
5. 上传与下载文件
6. Struts2注解
1. Action
a) namespace(掌握)
b) path(掌握)
c) DMI(掌握)
d) wildcard(掌握)
e) 接收参数(掌握前两种)
f) 访问request等(掌握Map IOC方式)
g) 简单数据验证(掌握addFieldError和<s:fieldError)
2. Result
a) 结果类型(掌握四种,重点两种)
b) 全局结果(掌握)
c) 动态结果(了解)
3. OGNL表达式(精通)
a) # % $
4. Struts标签
a) 掌握常用的
5. 声明式异常处理(了解)
6. I18N(了解)
7. CRUD的过程(最重要是设计与规划)(精通)
8. Interceptor的原理(掌握)
9. 类型转换(掌握默认,了解自定义)
76 拦截器的模拟: (Interceptor)其实每个拦截器只实现了一件事,在某个的Action前面执行一点东西,在这个Action执行完之后再执行一点东西。在执行一个有多个拦截器的Action时,依次执行每一个拦截器希望在Action之前执行的东西(请求Action的过程通过层层拦截器),执行完之后执行Action,Action执行完之后再执行拦截器们希望在Action执行完之后执行的动作(响应的过程也通过层层拦截器)。
77 自己编写拦截器
配置如图:
声明<interceptor>,在action中调用interceptor,用<interceptor-ref>,注意 调用的时候,如果只写自己定义的interceptor会覆盖原来系统帮我们定义的interceptor,所以一定要加上系统的interceptor:defaultStack
拦截器: 体现了切面编程的思想(Spring security)
78 防止重复提交: 1. Post提交方法本身防止了重复提交
2.token方法
*一般的加入拦截器假如在defaultStack后面,因为defaultStack会帮你处理一些参数方面的过滤问题
首先在页面中添加<s:token>标签 访问一个页面的时候在服务器的session里生成一串随机字符串, 当我们第一次提交这个页面中的表单时,用页面中的字符串匹配服务器中的字符串,匹配上了,即允许这次的提交并删除session中的这个字符串. 下次重复提交的时候,再来匹配字符串,这时候页面中的字符串匹配不上了,就说明重复提交了.
配置:
在invalid.token的result中设置重复提交的时候会展现的页面
79 读系统默认拦截器
上面代码是, 判断action是否有实现ApplicationAware这个借口如果有实现,则帮他注入Application.
80 类型转换
日期的转换<s:date name=”” format=””>
在文档这里查日期的格式应该怎么写
传参数的时候按这个格式传给页面 就可以接收并用<s:date>显示了
传多个参数的时候 用list<>或set<>等容器类型, 前台用 显示。在用容器接收参数的时候,一定要用泛型
Map类型传值
81 自己编写转换器
配置
Action级别的转换器用properties文件来声明等号左侧为action里面的成员变量
此properties名称为 Action名_converter
全局转换器 名称固定
全局转换器里面的属性名要用全局的
82
继承StrutsTypeConverter的写法
Point同样可以用容器装起来List<point>传多个参数进去就可以读了
83