说起struts2中的拦截器,就不得不谈到struts2的优点:
1.在软件设计上,Struts2没有像Struts1一样和ServletAPI与StrutsAPI紧密耦合,Struts2的应用可以不依赖与ServetAPI和StrutsAPI。Struts2是无侵入式设计,而Struts1属于入侵式设计。
2. Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。
3. Struts2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。
4. Struts2提供多种表现层技术,如:jsp,freeMarker,Velocity等。
5. Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。
6. Struts2提供了全局范围,包范围,和Action范围的国际化资源文件管理实现 。
可以看到拦截器就是其中之一,还有struts2提供了一套标签,比jstl还要强大。那么拦截器是如何使用的,需要怎样配置呢?
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.defu.vo.Userinfo;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class UserInterceptor extends AbstractInterceptor{
}
看一下配置文件的信息,这里有技巧在里面,一般这些拦截都属于常用拦截,所以把它写在了struts2.xml中,并且将该包定义为抽象的,这样其他包直接继承这个包就可以使用里面给的拦截器了;
<</span>package name="interceptor" extends="struts-default" abstract="true">
<</span>interceptors>
<</span>interceptor name="userinterceptor" class="com.defu.interceptor.UserInterceptor">
</</span>interceptor>
<</span>interceptor-stack name="interceptorStack">
<</span>interceptor-ref name="userinterceptor"/>
<</span>interceptor-ref name="defaultStack"></</span>interceptor-ref>
</</span>interceptor-stack>
</</span>interceptors>
</</span>package>
这是在struts2.xml中配置的拦截器,在action中引用:
红色字体是继承了自己定义的包,interceptorStack是使用用户是否登录的拦截器栈,里面有用户是否登录的处理类。
下面给一个字符编码的拦截器:Action代码:
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class Charset extends AbstractInterceptor{
private String encoding="GBK";
}
}
看struts2.xml中的总配置:
<</span>package name="interceptor" extends="struts-default" abstract="true">
<</span>interceptors>
<</span>interceptor name="charset" class="com.defu.interceptor.Charset">
<</span>param name="encoding">UTF-8</</span>param>
</</span>interceptor>
<</span>interceptor-stack name="charsetstack">
<</span>interceptor-ref name="charset"/>
<</span>interceptor-ref name="defaultStack"></</span>interceptor-ref>
</</span>interceptor-stack></</span>interceptors>
</</span>package>
看我如何使用它:
<</span>package name="Interceptoractions" extends="interceptor">
<</span>action
name="lookforflowerbyinfo" class="com.defu.useraction.LookForflowerbyinfo">
<</span>interceptor-ref name="charsetstack"/>
<</span>result name="success">/main.jsp</</span>result>
</</span>action>
然后就没有然后了,你所有请求都会被编码为UTF-8。也不用愁乱码问题了,整个世界安静了!