1. 程式人生 > >(十)struts2的異常處理機制

(十)struts2的異常處理機制

原理 login 重寫 ... implement set 聲明式 nbsp con

成熟的MVC框架應該提供成熟的異常處理機制。當然可以在方法中手動捕捉異常,當捕捉到特定異常時,返回特定邏輯視圖名。

這種方式非常繁瑣,需要在方法中寫大量try catch塊,最大的缺點還是一旦需要改變異常處理方法時,需要修改代碼。

最好的方式是通過聲明式的方式管理異常處理。struts2提供了一種聲明式的異常處理方式。

一、原理

    我們看Action接口中的execute方法聲明。
    public String execute() throws Exception 

    這就意味著我們重寫該方法時,無需進行任何異常處理,而是把異常拋給struts2框架處理. 

    struts2框架接收到Action拋出的異常後,根據struts.xml文件配置的異常映射,轉入指定的視圖資源。

    異常映射功能是由 exception的攔截器幫我們做的。

    struts2的異常處理機制是通過在struts.xml中配置<exception-mapping..../>元素完成。
        屬性:
            exception:異常類型
            result:出現該異常時,系統轉入result指定的結果 

二、局部異常映射和全局異常映射

全局異常映射對所有的Action都有效,但局部異常映射只對該異常映射所在的Action有效。

局部異常映射:將<exception-mapping..../>元素作為<action.../>的子元素配置
如果全局異常映射和局部異常映射配置了同一個異常類型,在該Action內,局部覆蓋全局。

全局異常映射:將<exception-mapping..../>元素作為<global-exception-mappings>元素的子元素配置

三、異常處理案例

 我們做一個簡單的登陸應用

(1)編寫我們的Action類

        public class LoginAction implements Action{
            private String username;
            private String password;
            public String getUsername() {
                return username;
            }
            public void setUsername(String username) {
                this.username = username;
            }
            public String getPassword() {
                return password;
            }
            public void setPassword(String password) {
                this.password = password;
            }
            public String execute()throws Exception{ 
                //當用戶名為monster時,拋出我們的自定義異常
                if(getUsername().equals("monster")){
                    throw new MyException("自定義異常");
                } 
                //當用戶名為sql時,拋出sql異常
                if(getUsername().equalsIgnoreCase("sql")){
                    throw new SQLException("用戶名不能為sql");
                }
                if(getUsername().equals("cad")&&getPassword().equals("123456")){
                    return "success";
                }else
                {
                    return "error";
                }
            }

        }

(2)我們編寫我們的登陸jsp頁面

        <body>
            <form action="${pageContext.request.contextPath }/login" method="post">
                用戶名:<input type="text" name="username"><br>
                密  碼:<input type="password" name="password"><br>
                <input type="submit" value="提交">
            </form>
        </body> 

(3)我們編寫我們的配置文件struts.xml

    <package name="p2" extends="struts-default">
        //全局結果視圖定義
        <global-results>
            <result name="sql">/exception.jsp</result>
        </global-results>

        //全局異常定義
        <global-exception-mappings>
            //出現sql異常,就轉入到視圖名為sql的視圖結果
            <exception-mapping result="sql" exception="java.sql.Exception"></exception-mapping>
        </global-exception-mappings> 

        <action name="login" class="com.cad.struts2.LoginAction" > 
                //局部異常定義
                <exception-mapping result="my" exception="conm.cad.struts2.MyException"></exception-mapping>
                <result name="my">/exception.jsp</result>
                <result name="success">/welcome.jsp</result>
                <result name="error">/error.jsp</result>    
        </action>
    </package>  

  

  

  

(十)struts2的異常處理機制