struts2学习笔记(4)---声明式异常

一、## 实际开发中推荐的异常处理 ##
把所有的异常抛给表现层来处理,即一直向上抛,抛给方法的调用者,而不是使用try/catch语句捕获异常。在struts中最上面的方法调用者就是action类,则将所有异常抛给action,在xml文件中进行配置后,由struts来处理这些异常。

二、## 源代码 ##
struts.xml文件的action配置:

<action name="test" class="org.Test.action.TestAction">
            <result name="success">/index.jsp</result>

            <!-- result的声明放在exception前面 -->
            <result name="error">/error.jsp</result>
            <!-- 发生java.lang.ArithmeticException异常时,跳转到name为error的result -->
            <exception-mapping result="error" exception="java.lang.ArithmeticException"/>
</action>

当调用TestAction时,若捕捉到java.lang.ArithmeticException的异常,则会找到name为error的result,然后跳转到error.jsp页面

TestAction.java文件:

package org.Test.action;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        int i = 1 / 0;

        return SUCCESS;
    }
}

调用TestAction时,int i = 1/0;会出现java.lang.ArithmeticException异常

error.jsp页面:

<body>
    服务器忙,稍后再试……
    <br>
    <s:property value="exception" />
    <br>
    <s:property value="exception.message" />
    <br>
    <s:property value="exception.stackTrace" />
    <br>

    <s:debug></s:debug>
</body>

程序异常时提示用户服务器忙,同时输出相关的异常信息

在error.jsp页面的开头需要导入Struts2 标签库,从而可以使用 Struts2的标签,代码如下:

<%@ taglib prefix="s" uri="/struts-tags"%>

@taglib表明引用标签。类似java中的import语句

prefix=”s” 引用的名称在页面可以使用,就像java中生成的一个对象名,以后调用的时候直接使用就可以了

uri=”/struts-tags”%表示标签库的路径。相当于import一个具体的类。

三、## 运行结果 ##

struts2学习笔记(4)---声明式异常_第1张图片
依次显示的是异常详细信息(exception),异常信息(exception.message),异常路径(exception.stackTrace),以及调试标签(debug)

struts2学习笔记(4)---声明式异常_第2张图片
点击debug标签还可以看到ValueStack的信息

四、## 更多改进 ##
struts.xml文件中加入<global-results><global-exception-mappings> 标签如下:

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

        <!-- 全局的result,相当于在每个action标签里面加入了这个result标签 -->
        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <!-- 全局的exception-mapping,相当于在每个action标签里面加入了这个exception-mapping标签 -->
        <global-exception-mappings>
            <exception-mapping result="error" exception="java.lang.Exception"/>
        </global-exception-mappings>

        <action name="test" class="org.Test.action.TestAction">
            <result>/index.jsp</result>

            <!-- result的声明放在exception前面 -->
            <result name="error">/error.jsp</result>
            <!-- 发生java.lang.ArithmeticException异常时,跳转到name为error的result -->
            <exception-mapping result="error" exception="java.lang.ArithmeticException"/>
        </action>

        <action name="default">
            <result>/index.jsp</result>
        </action>
    </package>

则以后凡是捕获到了异常,都会跳转到error.jsp页面,对于用户来说,看到的不是满页的报错信息,更加的人性化。

你可能感兴趣的:(struts2,声明式异常)