1. 程式人生 > >java SSH第一章學習內容(Struts2攔截器,攔截器堆疊)

java SSH第一章學習內容(Struts2攔截器,攔截器堆疊)

Struts2攔截器,需要導相應的jar包及複製Struts.xml檔案到src目錄下,web.xml進行修改


攔截器

在訪問Action的時候進行攔截處理,需要繼承AbstractInterceptor,重寫intercept方法


案例一:在訪問Action輸出一句話(買電腦),使用攔截器在訪問Action之前和之後各輸出一句話(送鍵盤)(送滑鼠)

1.新建一個買電腦的action,繼承ActionSupport,進行輸出一句話
public class BuyAction extends ActionSupport{
    @Override
    public String execute() throws Exception {
        System.out.println("買電腦");
        return SUCCESS;
    }
}

2.JSP頁面提交到Action中


 <form action="/8.28lanjieqi/login.action">
       <input type="submit" value="提交">
   </form>

3.新建一個買電腦送優惠的類用作於攔截器,繼承AbstractInterceptor,重寫裡面的intercept方法,這句話代表String obj=arg0.invoke();相當於攔截前輸出或則攔截後輸出,案例中表示攔截前送鍵盤,攔截後送滑鼠
public class YouhuiAction extends AbstractInterceptor{
    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("送鍵盤");
        String obj=arg0.invoke();
        System.out.println("送滑鼠");
        return obj;
    }
}

4.修改struts.xml,在裡面定義、使用攔截器


<!-- 例項一 -->
        <interceptors>
            <!-- interceptors標籤裡的interceptor定義攔截器 -->
            <interceptor name="YouhuiAction" class="com.action.YouhuiAction">
            </interceptor>
        </interceptors>
        <action name="login" class="com.action.BuyAction">
            <!-- 結果為“success”時,跳轉至success.jsp頁面 -->
            <result name="success">/index.jsp</result>
            <!-- 設定使用攔截器 ,defaultStack是核心攔截器,如果只設置自己的,就不再走Struts核心攔截器 -->

            <interceptor-ref name="YouhuiAction"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>


執行結果:


攔截器堆疊
如果攔截器過多,可以把打放進一個自定義的攔截器堆疊當中,當有action需要訪問的時候,可以在配置檔案中進行設定堆疊名即可


如在上述案例中多一個攔截器,可以把該攔截器放進攔截堆疊中,讓需要使用攔截器的Action進行呼叫
1.建立送貨攔截器
public class SonghuoAction extends AbstractInterceptor{
    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        String obj=arg0.invoke();
        System.out.println("點贊好評免費送貨");
        return obj;
    }
}

2.在配置檔案中設定堆疊

        <!--  堆疊,把需要的攔截器放進堆疊,當呼叫的使用直接輸入堆疊別名即可 -->
        <interceptors>
            <!-- interceptors標籤裡的interceptor定義攔截器 -->
            <interceptor name="YouhuiAction" class="com.action.YouhuiAction">
            </interceptor>
            <interceptor name="SonghuoAction" class="com.action.SonghuoAction">
            </interceptor>

            <!-- 定義攔截器堆疊 -->
            <interceptor-stack name="tt">
                <interceptor-ref name="YouhuiAction"></interceptor-ref>
                <interceptor-ref name="SonghuoAction"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <!-- 定義預設攔截器引用 -->
        <default-interceptor-ref name="YouhuiAction">

        </default-interceptor-ref>

        <!-- 指定攔截器引用 -->
        <action name="login" class="com.action.BuyAction">
            <!-- 結果為“success”時,跳轉至success.jsp頁面 -->
            <result name="success">/index.jsp</result>
            <interceptor-ref name="tt"></interceptor-ref>
        </action>


執行結果:





案例二:用攔截器登入驗證,如使用者必須在登入頁面通過使用者名稱和密碼訪問登入的Action跳轉到首頁,防止使用者直接訪問首頁的Action

1.建立實體類,裡面有name+pwd的屬性,get+set方法

2.在login.jsp頁面中設定訪問login.action

 <form action="/8.28lanjieqilogin/login.action">
       使用者名稱:<input type="text" name="users.name"/>
       密碼:<input type="password" name="users.pwd"/>
       <input type="submit" value="提交"/>
   </form>

3.新建loginAction,呼叫實體類,繼承ActionSupport用於重寫execute()方法,實現SessionAware介面用於獲得Session存值,用於判斷使用者是否通過登入跳轉到首頁
public class loginAction extends ActionSupport implements SessionAware{
    private Map session;
    private Users users;
    public Users getUsers() {
        return users;
    }
    public void setUsers(Users users) {
        this.users = users;
    }
    public Map getSession() {
        return session;
    }
    @Override
    public String execute() throws Exception {
        if (users.getName().equals("admin")&&users.getPwd().equals("123456")) {
            session.put("users", users);
            return SUCCESS;
        }else {
            return ERROR;
        }
    }
    @Override
    public void setSession(java.util.Map<String, Object> session) {
        this.session=session;  
    }
}

4.建立首頁的Aciton,當訪問了該Action進行輸出一句話
public class IndexAction extends ActionSupport{
    @Override
    public String execute() throws Exception {
        System.out.println("謝謝您的光臨");
        return SUCCESS;
    }
}

5.建立跳轉Action的攔截器,驗證使用者是否通過登入頁面跳轉過來的,需要繼承AbstractInterceptor,重寫intercept方法,判斷之前存的Session是否為空,為空則跳轉為登入頁面,如不為空則正常執行
public class LLAction extends AbstractInterceptor{
    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("進入攔截器");
        Map session = arg0.getInvocationContext().getSession();
        if (session.get("users")!=null) {
            return arg0.invoke();
        }else {
            return Action.LOGIN;
        }
    }
}

6.修改一下配置檔案,定義、配置監聽類
<interceptors>
    <interceptor name="LLAction" class="com.action.LLAction"></interceptor>
    </interceptors>
    
        <action name="login" class="com.action.loginAction">
            <!-- 結果為“success”時,跳轉至success.jsp頁面 -->
            <result name="success">/index.jsp</result>
            <!-- 結果為"error"時,跳轉至fail.jsp頁面 -->
            <result name="error">/login.jsp</result>
            <result name="input">/login.jsp</result>
        </action>
        <action name="index" class="com.action.IndexAction">
            <result name="success">/index.jsp</result>
            <result name="login">/login.jsp</result>
            <result name="error">/login.jsp</result>
            <interceptor-ref name="LLAction"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

執行結果:直接拼接專案/Action名字.action無法訪問,當註冊登入可以訪問

直接訪問返回登入頁面