1、在Struts2中,预设了许多拦截器,这些拦截器的定义都在struts-default.xml文件中的struts-default包内。
2、拦截器栈,由多个拦截器的引用组成:
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginCheck"/>
</interceptor-stack>
3、拦截器在声明和引用:
a、声明:
<interceptor name="loginCheck" class="interceptor.LoginInterceptor"/>
b、引用:
<interceptor name="loginCheck">
c、拦截器栈内既可以是拦截器的引用,又可以是拦截器栈的引用。
4、拦截器在<action>中的声明和引用:
a、声明:同上
b、引用:
<interceptor-ref name="defaultStack"/>
5、拦截器在<package>中的声明和引用:
a、声明:
<interceptors>
<interceptor name="loginCheck" class="interceptor.LoginInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginCheck"/>
</interceptor-stack>
</interceptors>
b、引用:
<default-interceptor-ref name="myStack"/>
6、<action>中拦截器的调用顺序:1)首先,看有没有<interceptor-ref>,如果有,不找了2)如果没有,则看<package>中是否有元素<default-interceptor-ref>,如果有,不找了,3)如果没有,则递归寻找这个包的子包。4)如果这些位置都有相应的拦截器,则以<action>中的为准。
7、如果在<action>自己定义了拦截器,则系统预设的拦截器会失效,如:
<interceptor-ref name="myStack"></interceptor-ref>
8、如果既想使用系统预设的拦截器又想使用自己定义的拦截器,可以这样定义:
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myStack"/>
即在自己定义的拦截器前面引用系统的拦截器。
9、自定义拦截器,假设进行简单的登录验证,如果用户没有进行登录,则不让其继续进行下一步的操作。
a、创建LoginInterceptor.java
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class LoginInterceptor implements Interceptor {
@Override
public void destroy() {
System.out.println("destroy...");
}
@Override
public void init() {
System.out.println("init...");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
String flag = (String) invocation.getInvocationContext().getSession().get("user");
if(flag==null || "".equals(flag)) {
System.out.println("没有登录!");
return "login";
} else {
System.out.println("已经登录!");
return invocation.invoke();
}
}
}
b、创建UserAction.java
package action;
import model.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return super.execute();
}
public String loginUser() throws Exception {
if("zhangsan".equals(user.getName())) {
ActionContext.getContext().getSession().put("user", "zhangsan");//注释和不注释两种情况
return SUCCESS;
} else {
return ERROR;
}
}
}
c、创建struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!--增加登录的拦截器,没有登录则不让进行下一步操作。 -->
<interceptors>
<interceptor name="loginCheck" class="interceptor.LoginInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginCheck"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<!--配置全局的Result -->
<global-results>
<result name="error">error.jsp</result>
<result name="login">login.jsp</result>
</global-results>
<!--配置全局的异常映射 -->
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"/>
</global-exception-mappings>
<!--默认的action -->
<!--增加自己的拦截器,让登录检查的拦截器失效 -->
<action name="index">
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>login.jsp</result>
</action>
<action name="chainAction" class="action.ChainAction">
<result >welcome.jsp</result>
</action>
<!--增加自己的拦截器,让登录检查的拦截器失效 -->
<action name="*User" class="action.UserAction" method="{1}User">
<interceptor-ref name="defaultStack"></interceptor-ref>
<result type="chain">chainAction</result><!-- 这个action后面不能加上.action!!! -->
<result name="input">index.jsp</result>
</action>
</package>
</struts>
d、创建index.jsp(用于进行跳转到login.jsp)、login.jsp(用于登录)、welcome.jsp(欢迎页面).....