struts框架之攔截器

自定義攔截器

自定義攔截器方式一

攔截器的生命週期(不可能每一次訪問都創建一遍攔截器)
隨着程序的開始而創建
隨着程序的結束而銷燬

public class MyIntercept1 implements Interceptor{

    // 生命週期方法
    // 攔截器的初始化方法
    @Override
    public void init() {

    }
    // 攔截方法
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        return null;
    }
    // 銷燬方法
    @Override
    public void destroy() {

    }
}

自定義攔截器方式二

繼承AbstractInterceptor類
public class MyIntercept2 extends AbstractInterceptor{

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
}

自定義攔截器方式三

public class MyIntercept3 extends MethodFilterInterceptor{
    // 攔截方法
    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        // 前處理
        System.out.println("前處理");
        // 放行方法
        // 所有攔截器都執行完畢後 
        // 會拿到一個字符串
        // 這個字符串就是 action類 執行完畢後 返回的字符串
        String result = invocation.invoke();
        // 後處理
        System.out.println("後處理");
        return result;
    }
}

測試

import com.opensymphony.xwork2.ActionSupport;
/*
 * 配置自定義攔截器
 * 可以指定 攔截或不攔截哪些方法
 */
public class Demo01Action extends ActionSupport{
    public String add() {
        System.out.println("add");
        return "success";
    }
    public String update() {
        System.out.println("update");
        return "success";
    }
    public String find() {
        System.out.println("find");
        return "success";
    }
    public String delete() {
        System.out.println("delete");
        return "success";
    }
}
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="inter" namespace="/" extends="struts-default">
        <!-- 1.註冊攔截器 -->
        <interceptors>
            <!-- 註冊你自己定義的攔截器 -->
            <interceptor name="MyIntercept3" class="com.lanou3g.intercept.MyIntercept3"></interceptor>
            <!-- 2.註冊攔截器棧 -->
            <interceptor-stack name="MyStack">
                <interceptor-ref name="MyIntercept3">
                    <!-- 設置不想攔截的方法 逗號隔開多個方法 -->
                    <param name="includeMethods">add,update</param>
                </interceptor-ref>
            <!-- 除了引用自己的攔截器 還要使用系統默認的攔截器 -->
            <!-- 建議:先放自己的攔截器 再放系統的攔截器
                 自己寫的攔截器 可能會用到系統的攔截器封裝好的功能 
             -->
                <!-- 引入系統默認的攔截器棧 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 3.設置默認走的攔截器棧是哪個 -->
        <default-interceptor-ref name="MyStack"></default-interceptor-ref>
        <action name="Demo01Action_*" class="com.lanou3g.intercept.Demo01Action" method="{1}">
            <result name="success">/1.jsp</result>
        </action>
    </package>
</struts>

小項目之部分代碼

struts.xml

<struts>
    <package name="web" namespace="/" extends="struts-default">

        <interceptors>
            <interceptor name="MyIntercept" class="com.lanou3g.web.MyInterceptor"></interceptor>
            <interceptor-stack name="MyStack">
                <interceptor-ref name="MyIntercept">
                    <!-- 設置不攔截登錄 方法 -->
                    <param name="excludeMethods">login</param>  
                </interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
                <!-- 設置默認使用的攔截器棧 -->
        <default-interceptor-ref name="MyStack"></default-interceptor-ref>
        <!-- 設置全局的攔截器 返回結果 跳轉設置 -->
        <global-results>
            <result name="toLogin" type="redirect" >/login.jsp</result>
        </global-results>
        <!-- 配置全局異常處理 映射 -->
        <global-exception-mappings>
            <!-- exception 異常錯誤類型(全類名) -->
            <!-- result 出現異常 返回的結果字符串 -->
            <!-- action 可以根據這個異常的結果 跳轉一個頁面 -->
            <exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
        </global-exception-mappings>
    </package>
</struts>

UserAction

public class UserAction extends ActionSupport implements ModelDriven<User>{
    // 使用模型驅動
    private User u = new User();
    // 聲明service
    private UserService service = new UserServiceImpl();
    // 聲明登錄的action方法
    public String login() {
        System.out.println(u);

        // 調用service方法(接收查詢回來的對象)
        User findU = service.login(u);
        // 保存到session域中(登錄狀態)
        ActionContext.getContext().getSession().put("user", findU);

        // 表示重定向回首頁
        return "toIndex";
    }   
    @Override
    public User getModel() {

        return u;
    }
}

MyInterceptor

public class MyInterceptor extends MethodFilterInterceptor{
    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
           // 根據session域中 是否存放了 User對象 來判斷用戶是否登錄了
          Object object =  ActionContext.getContext().getSession().get("user");   
          if(object == null){
              // 沒登錄 重定向到 登錄界面
              return "toLogin";
          }else{
              // 登錄了
              return invocation.invoke();
          }
    }
}

UserServiceImpl

public class UserServiceImpl implements UserService {
    // 聲明dao層對象
    private UserDao dao = new UserDaoImpl();
    @Override
    public User login(User u) {
        // 開啓事物
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        // 調用dao層方法
        User findU = dao.findUser(u);
        // 提交事物
        transaction.commit();
        // 處理邏輯 要在提交事物之後來寫(事物中間只調dao層的方法)
        // 分別提示用戶名和密碼錯誤
        // 只根據名字 查詢用戶 如果查詢出用戶(這裏包含着用戶的所有信息)
        // 再比對 用戶的密碼是否正確
        if (findU == null) {
            // 沒有這個用戶 使用異常處理
            throw new RuntimeException("該用戶不存在");
        }
        // 有這個用戶
        if (!findU.getUser_password().equals(u.getUser_password())) {
            // 密碼不正確
            throw new RuntimeException("密碼不正確");
        }
        // 返回查詢的對象
        return findU;
    }
}

UserDaoImpl

public class UserDaoImpl implements UserDao {
    @Override
    public User findUser(User u) {
        Session session = HibernateUtils.getCurrentSession();
        String hql = "from User where user_code=?";
        Query query = session.createQuery(hql);
        query.setParameter(0, u.getUser_code());
        // 預見查詢結果
        User findU = (User) query.uniqueResult();
        return findU;
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 <display-name>sh-struts</display-name>
 <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>  
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

login.jsp

<HEAD>
<script type="text/javascript">
    // 窗口加載
    window.onload=function(){
        // 如果是在框架中
        if(window.parent != window){
            //就讓框架頁面跳轉到登陸頁面
            window.parent.location.href = "${pageContext.request.contextPath}/login.jsp";
        }
    };
</script>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章