在Struts2中我们可以自定义一个拦截器来拦截特定的方法,下面我们来实现一个基本的拦截器,并调用它,并调用未拦截的方法进行对比。
1.创建拦截器类:新建包indi.zx.Interceptor,在该包中创建LoggerInterceptor类,该类继承自MethodFilterInterceptor,用来显示的显示拦截器调用了该方法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19/**
* @author XiaoHuZiXianShengZx
* 自定义拦截器用于拦截特定的方法
*
*/
@SuppressWarnings("serial")
public class LoggerInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation chain) throws Exception {
// TODO Auto-generated method stub
System.out.println("------前置拦截操作------");
String result=chain.invoke();//执行下一个操作,如:调用其他action或执行其他拦截器
System.out.println("------后置拦截操作------");
return result;
}
}
2.编写UserBean类:新建包indi.zx.UserBean,在该包中创建UserBean类,完成参数的封装1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class UserBean {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3.编写UserAction类:新建包indi.zx.UserAction,在该包中创建UserAction类,完成动作函数的声明。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class UserAction extends ActionSupport{
private UserBean user;//创建UserBean对象
public String execute(){
System.out.println(user.getName()+" execute()方法调用");
return SUCCESS;
}
public String add(){
System.out.println(" add方法调用");
return SUCCESS;
}
public String del(){
System.out.println(" del方法调用");
return SUCCESS;
}
public UserBean getUser() {
return user;
}
public void setUser(UserBean user) {
this.user = user;
}
}
4.配置struts.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29<struts>
<package name="commonpackage" extends="struts-default">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="mylogger" class="indi.zx.Interceptor.LoggerInterceptor">
</interceptor>
</interceptors>
</package>
<package name="mypackage" extends="commonpackage">
<!-- 对execut方法进行拦截 -->
<action name="interceptor" class="indi.zx.UserAction.UserAction" method="execute">
<result>ok.jsp</result>
<interceptor-ref name="mylogger">
<param name="includeMethods">execute</param>
</interceptor-ref>
<!-- 由于自定义了拦截器,系统则不会调用默认的拦截器,这里为了使用默认的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<action name="add" class="indi.zx.UserAction.UserAction" method="add">
<result>ok.jsp</result>
</action>
<action name="del" class="indi.zx.UserAction.UserAction" method="del">
<result>index.jsp</result>
</action>
</package>
</struts>
5.编写index.jsp:实现初始登陆界面,以及对拦截器action的调用1
2
3
4
5
6
7
8
9<body>
<div style="border: solid 1px black;width: 300px;height: 200px;margin: 0 auto">
<form action="interceptor.action" method="post">
用户名 :<input type="text" name="user.name" /><br/>
年 龄:<input type="text" name="user.age" /><br/>
<input type="submit" value="提交"/>
</form>
</div>
</body>
6.编写ok.jsp:完成响应action的页面跳转1
2
3
4
5
6
7
8要映入标签:
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
恭喜用户:<s:property value="user.name" />,登陆成功!
<!-- 调用其他的方法来测试拦截器 -->
<a href="<%=request.getContextPath() %>/add.action">add</a><br>
<a href="<%=request.getContextPath() %>/del.action">del</a>
</body>
7.结果显示:
我们先任意输入然后提交,此时结果,注意红框
然后我们点击add之后点击del会使界面跳回登陆页面,而方法 调用如下,此时我们可以看到只有被拦截的execute方法被拦截。
注:
- 所做的分析都是笔者自己的见解,如有不正确还请见谅。
- 另外,基础struts工程的创建这里就不叙述了,如果不太清楚可以访问:Sturts2之HelloWorld