Struts2 拦截器
背景:
拦截器是struts中最强大的特性之一,可以使得在action和result之间进行一些处理,作用于页面传递请求,数据封装,国际化,类型转换,上传文件
拦截器意义:
AOP思想
极大程度的解耦
应用于权限控制,日志记录等领域
struts2 通配符
UserAction.java
package action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
/*version1.0 2.0 3.0*/
/*public String add() throws Exception {
System.out.println("进入到add");
return "success";
}
public String select() throws Exception {
System.out.println("进入到show");
return "success";
}
public String update() throws Exception {
System.out.println("进入到update");
return "success";
}
public String delete() throws Exception {
System.out.println("进入到delete");
return "success";
}*/
/*version 4.0*/
public String add() throws Exception {
System.out.println("进入到add");
return "User_add";
}
public String select() throws Exception {
System.out.println("进入到show");
return "User_select";
}
public String update() throws Exception {
System.out.println("进入到update");
return "User_update";
}
public String delete() throws Exception {
System.out.println("进入到delete");
return "User_delete";
}
}
package action;
import com.opensymphony.xwork2.ActionSupport;
public class NewsAction extends ActionSupport {
/*version 1.0 2.0 3.0 4.0*/
/*public String add() throws Exception{
System.out.println("news add");
return "success";
}
public String select() throws Exception{
System.out.println("news select");
return "success";
}
public String delete() throws Exception{
System.out.println("news delete");
return "success";
}
public String update() throws Exception{
System.out.println("news update");
return "success";
}*/
/*version 4.0*/
public String add() throws Exception {
System.out.println("进入到add");
return "News_add";
}
public String select() throws Exception {
System.out.println("进入到show");
return "News_select";
}
public String update() throws Exception {
System.out.println("进入到update");
return "News_update";
}
public String delete() throws Exception {
System.out.println("进入到delete");
return "News_delete";
}
}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">struts.xml</span>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="action" extends="struts-default">
<!-- version 1.0 -->
<!-- <action name="userAction" class="action.UserAction" method="add">
<result name="success">/index.jsp</result>
</action>
<action name="userAction" class="action.UserAction" method="delete">
<result name="success">/index.jsp</result>
</action>
<action name="userAction" class="action.UserAction" method="update">
<result name="success">/index.jsp</result>
</action>
<action name="userAction" class="action.UserAction" method="select">
<result name="success">/index.jsp</result>
</action> -->
<!--version 2.0 -->
<!-- <action name="userAction" class="action.UserAction" method="{*}">
<result name="success">/index.jsp</result>
</action>
<action name="newsAction" class="action.NewsAction" method="{*}">
<result name="success">/index.jsp</result>
</action> -->
<!-- version 3.0 -->
<!-- <action name="*Action" class="action.{1}Action" method="{*}">
<result name="success">/index.jsp</result> -->
<!--version 4.0 -->
<action name="*_*" class="action.{1}Action" method="{2}">
<result name="{1}_{2}">/{1}_{2}.jsp</result>
</action>
</package>
</struts>
拦截器的使用
action.InterceptorAction.java
package action;
import com.opensymphony.xwork2.ActionSupport;
public class InterceptorAction extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("进入InterceptorAction");
return "success";
}
}
interceptor.Interceptor1.java
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class Interceptor1 implements Interceptor {
String name;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
System.out.println(name+"初始化拦截器");
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
//让到达拦截器的请求继续前进,到达想要访问的资源
//作用相当于一个中间件,继续完成请求
System.out.println("进入拦截器2");
String returnValue=arg0.invoke();
System.out.println("穿过拦截器2");
return returnValue;
}
}
interceptor.MethodInterceptor.java
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
/*
* 方法拦截器,用于拦截指定的方法
*/
public class MethodInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
System.out.println("进入方法拦截器");
String url=arg0.invoke();
System.out.println("穿过方法拦截器");
return url;
}
}
interceptor.Interceptor1.java
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class Interceptor2 implements Interceptor{
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("进入拦截器2");
String returnValue=arg0.invoke();
System.out.println("穿越拦截器2");
return returnValue;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="action" extends="struts-default">
<interceptors>
<interceptor name="interceptor1" class="interceptor.Interceptor1"></interceptor>
<interceptor name="interceptor2" class="interceptor.Interceptor2"></interceptor>
<!--方法拦截器,可以选择拦截指定的方法 -->
<interceptor name="methodInterceptor" class="interceptor.MethodInterceptor">
<param name="includeMethods" >add,delete</param>
<param name="excludeMethods">show</param>
</interceptor>
<!-- 将需要使用到的拦截器包装到一起 -->
<interceptor-stack name="allInterceptor">
<interceptor-ref name="interceptor1" ></interceptor-ref>
<interceptor-ref name="interceptor2"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="methodInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 默认处理方式,对当前的所有action采取同样的处理 -->
<global-results >
<result name="error">/error.jsp</result>
</global-results>
<action name="interceptorAction" class="action.InterceptorAction" method="{*}">
<interceptor-ref name="allInterceptor"></interceptor-ref>
<result name="success">/login.jsp</result>
</action>
</package>
</struts>