Struts2技术要点

Struts 1 是全世界第一个发布的MVC框架,它在2001年发布,该框架一经推出,就得到了世界上Java Web开发者的拥护,是世界上使用最广泛的MVC框架。但毕竟事物都是在不断发展的,没有最好只有更好,Struts 2 的推出将MVC框架的水平提高到了一个新的高度。Struts 2 没有继承Struts 1 的血统,而是继承了WebWork的血统。或者说,WebWork衍生出了Struts 2,而不是Struts 1衍生了Struts 2。如果你是WebWork开发者,过度到Struts 2 基本不需要学习,事实上,很多人就是通过《WebWork in action》这本书学习Struts的。Struts 2的功能较Struts 1提高很多,学习难度也有所增加,下面是我总结的一些技术要点,希望对学习者有所帮助。


1.拦截器interceptor
      interceptor是Struts 2新增的一个强大功能,Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。您想要使用内置拦截器,只需要在应用程序struts.xml文件中定义package时继承struts-default包(package)即可。一旦您继承了struts-default包(package),所有Action都会调用拦截器栈 ——defaultStack。当然也可通过<default-interceptor-ref name="***"/>来定义自己的默认拦截器。这里有一个问题很重要,如果为某个action定义了interceptor,那么这个action将不再使用使用默认的interceptor引用。这是很多初学者常犯的错误,他们常认为新增的interceptor会在默认interceptor后调用,而事实上一旦为某个action定义了interceptor,将覆盖默认interceptor。

2.使用OGNL表达式

    OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。“%”符号是最不容易理解的一个符号,它的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。 这很有点类似javascript里面的eval()功能,例如 
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>      
<s:property value="#myMap['key1']"/>      
<s:url value="#myMap['key1']" />

上面的代码第2行会在页面上输出“value1”,而第3行则会输出"#myMap['key1']"这么一个字符串。 如果将第3行改写成这样:    
<s:url value="%{#myMap['key1']}"/>      
则输出为“value1”。 

这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。 


3.使用JSTL标签和EL表达式
      JSTL标签和EL表达式在Struts 1 中得到了广泛的应用,它们按page->request->session->application顺序访问其属性。我们知道Struts 2的表达式是从值栈和ognl上下文中取值的。但事实上我们发现,在Struts 2 环境中JSTL标签和EL表达式仍然可以直接使用,也就是说在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性。这是因为Struts2对HttpServletRequest作了进一步的封装。简略代码如下:
public class StrutsRequestWrapper extends HttpServletRequestWrapper {
public StrutsRequestWrapper(HttpServletRequest req) {
super(req);
}
public Object getAttribute(String s) {
......
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);//先从request范围获取属性值
if (ctx != null) {
if (attribute == null) {//如果从request范围没有找到属性值,即从ValueStack中查找对象的属性值
......
ValueStack stack = ctx.getValueStack();
attribute = stack.findValue(s);

......
}
}
return attribute;
}
}

在Struts2的过滤器中会用此包装器替换掉原来的Request对象,在后面你实际使用的是这个包装器对象。

4.实现Preparable接口

       Action可以实现Preparable接口,然后实现该接口的prepare()方法,可以在该方法中完成一些初始化工作,但是一定要注意,该方法执行时action中的属性字段还没有被http请求的数据填充,因此该方法不能访问action中的属性字段。


5.校验

       DefaultWorkflowInterceptor的intercept()方法用于校验action,并找出所有错误信息。如果action实现了Validateable接口,DefaultWorkflowInterceptor会在action执行之前调用action的validate()方法。如果action实现ValidationAware接口,那么DefaultWorkflowInterceptor调用hasErrors()方法找出所有错误信息,如果存在任何错误信息,将返回Action.INPUT,而不会执行这个action。ValidationAware接口定义了一系列存储和读取错误信息的方法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值