(6)拦截器

来源:互联网 发布:淘宝话费券在哪里 编辑:程序博客网 时间:2024/06/05 22:40

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(欢迎页面).....

0 0
原创粉丝点击