拦截器是Struts 2的一个强有力的工具。前面我们提到,正是大量的内置拦截器完成了Struts框架的大部分操作,像params拦截器将http请求中参数解析出来赋值给Action中对应的属性;Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action;以及前面讲过的国际化、转换器,校验等等。
1.使用struts2默认的interceptor实例:
在strut2中有一个tokenSession的默认拦截器(这个拦截起作用:若用户多次输入,则除第一次输入之外的输入都无效,即只处理第一次请求)
A.配置strut.xml文件如下:
<action name="reg" class="com.chinasei.struts2.RegAction">
<interceptor-ref name="tokenSession"/>
<result name="invalid.token">/reg.jsp</result>
<result name="success">/reg.jsp</result>
</action>
B.com.chinasei.struts2.RegAction.java文件如下:
package com.chinasei.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class RegAction extends ActionSupport{
public String execute(){
try{
addActionMessage("注册成功!");
Thread.sleep(2000);
}
catch(InterruptedException e){
}
return SUCCESS;}}
C:reg.jsp文件如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:actionerror/>
<s:actionmessage/>
<s:form action="reg">
<s:token/>//这个地方是必须的,加入token标签
<s:textfield name="userName" label="帐号"/>
<s:password name="userPassword" label="输入密码"/>
<s:submit value="注册"/>
</s:form>
2.使用自定义的拦截器:
A:配置strut.xml
<package name="loginCode" extends="struts-default">
<interceptors>
<interceptor name="checkLogin" class="com.chinasei.struts2.CheckLoginInterceptor"/>
<interceptor-stack name="checkLoginStack">
<interceptor-ref name="checkLogin"/> </interceptors>
<actionname="login"class="com.chinasei.struts2.LoginAction">
<result name="success">/loginSuccess.jsp</result>
<result name="input">/login.jsp</result>
<interceptor-ref name="checkLogin"/>
<interceptor-ref name="defaultStack"/>
</action>
<action name="test" class="com.chinasei.struts2.TestAction">
<result name="success">/testSuccess.jsp</result>
<result name="input">/login.jsp</result>
<interceptor-ref name="checkLogin"/>
<interceptor-ref name="defaultStack"/>
</action>
(也可以把上述两个拦截器或拦截器栈放在一个自定义的拦截器栈中)
B.login.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:actionerror/>
<s:actionmessage/>
<s:form action="login" method="post">
<s:textfield name="userName" label="帐号"/>
<s:password name="userPassword" label="密码" showPassword="true"/>
<s:submit value="登录"/>
</s:form>
<s:a action="test">未登录时,自定义拦截器测试!</s:a>
C:com.chinasei.struts2.CheckLoginInterceptor.java(非常重要,为自己定义的拦截器)
package com.chinasei.struts2;
import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class CheckLoginInterceptor implements Interceptor {
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("这是自定义拦截器!");
//获得被拦截的Action的引用
Object action = actionInvocation.getAction();
if (action instanceof LoginAction){
System.out.println("这是登录用的Action,不调用自定义拦截器,直接调用后面的拦截器!");
return actionInvocation.invoke();
}
//确认Session中是否存在LOGIN
Map session = actionInvocation.getInvocationContext().getSession();
String login = (String)session.get("loginFlag");
if (login != null && login.equals("login")){
System.out.println("已经登录,调用后面的拦截器!");
return actionInvocation.invoke();
}
else{
//终止后续操作
System.out.println("还没有登录,停止调用后面的拦截器,返回登录页面!");
((ActionSupport) action).addActionMessage("您还没有登录,请先登录!");
return "input";
}
}
}
D:com.chinasei.struts2.LoginAction.java如下
package com.chinasei.struts2;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport implements SessionAware{
private String userName;
private String userPassword;
private Map mySession;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String execute(){
if(getUserName().equals("Wangjg") && getUserPassword().equals("Wangjg")){
addActionMessage("恭喜您,登录成功!");
mySession.put("loginFlag", "login");
return SUCCESS;
}
else{
addActionError("帐号或密码错误!");
return INPUT;
}
}
public void setSession(Map session) {
mySession = session;
}
}
E:loginSuccess.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:actionmessage/>
您的帐号是:<s:property value="userName"/><br>
您的密码是:<s:property value="userPassword"/><br>
<br>
<s:a action="test">成功登录后,自定义拦截器测试!</s:a>
F:com.chinasei.struts2.TestAction.java如下:
package com.chinasei.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport{
public String execute(){
return SUCCESS;
}
}
G:testSuccess.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
已登录的标识内容是:<s:property value="#session['loginFlag']"/>
H:注意params拦截器
<interceptor-stack name="myBasicStack">
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
</interceptor-stack>
作用是:从需要从jsp页面复选框获取属性checkboxTest的值时用到。