zoukankan      html  css  js  c++  java
  • Struts2

    异常处理: exception-mapping 元素

    在action方法中添加

            int i=1/0;

    请求action后,结果为:

    这里写图片描述


    在struts.xml中添加异常处理:exception-mapping元素

            <action name="czy_save" class="com.qbz.struts2_02.GG_CZY" method="save">
                <exception-mapping result="ArithmeticException" exception="java.lang.ArithmeticException"></exception-mapping>
                <result name="ArithmeticException">/WEB-INF/page/Input.jsp</result>
    
                <result name="save">/WEB-INF/page/Show.jsp</result>
            </action>

    此时,页面将直接跳转到Input.jsp:

    这里写图片描述

    在Input.jsp加入标签显示exception信息:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
      <form action="czy_save.action" method="post">
          <s:debug></s:debug><br>
          <s:property value="exception"/><br>
          <s:property value="exception.message"/><br>
           编号:<input type="text" name="dlh"/><br>
           姓名:<input type="text" name="name"/><br>
           部门:<input type="text" name="bmmc"/><br>
           <input type="submit" value="保存"/>
       </form>
      </body>
    </html>
    

    请求action后的页面效果:

    这里写图片描述

    点击 Debug :

    这里写图片描述

    可见,对象栈的 栈顶 是异常对象,所以在上面页面没用下标就直接读取属性。ExceptionHolder有两个属性,一个是exceptionStack,一个是exception。


    我们来看,Struts2是如何做到异常映射处理的。

    在struts_default.xml中查看:

    我们的package的父类struts-default中引用的默认拦截器

    <default-interceptor-ref name="defaultStack"/>

    这里写图片描述

    这里写图片描述

    ctrl+shift+t 查看 ExceptionMappingInterceptor 源码

    public class ExceptionMappingInterceptor extends AbstractInterceptor {
    
        //省略......
    
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
            String result;
    
            try {
                result = invocation.invoke();
            } catch (Exception e) {
                if (isLogEnabled()) {
                    handleLogging(e);
                }
                List<ExceptionMappingConfig> exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
                ExceptionMappingConfig mappingConfig = this.findMappingFromExceptions(exceptionMappings, e);
                if (mappingConfig != null && mappingConfig.getResult()!=null) {
                    Map parameterMap = mappingConfig.getParams();
                    // create a mutable HashMap since some interceptors will remove parameters, and parameterMap is immutable
                    invocation.getInvocationContext().setParameters(new HashMap<String, Object>(parameterMap));
                    result = mappingConfig.getResult();
                    publishException(invocation, new ExceptionHolder(e));
                } else {
                    throw e;
                }
            }
    
            return result;
        }
    
        //省略......
    
        /**
         * Default implementation to handle ExceptionHolder publishing. Pushes given ExceptionHolder on the stack.
         * Subclasses may override this to customize publishing.
         *
         * @param invocation The invocation to publish Exception for.
         * @param exceptionHolder The exceptionHolder wrapping the Exception to publish.
         */
        protected void publishException(ActionInvocation invocation, ExceptionHolder exceptionHolder) {
            invocation.getStack().push(exceptionHolder);
        }
    
    }
    

    可见,当catch到异常之后publishException(invocation, new ExceptionHolder(e))把异常压入了栈中。


    每个action是不是都要配置异常处理呢?当然不用,下面来看global-exception-mappings、global-results 。

    在struts.xml中配置如下:

            <global-results>
                <result name="ArithmeticException">/WEB-INF/page/Input.jsp</result>
            </global-results>
    
            <global-exception-mappings>
                <exception-mapping result="ArithmeticException" exception="java.lang.ArithmeticException"></exception-mapping>
            </global-exception-mappings>
    版权声明:本文为博主原创文章,允许转载,请标明出处。 https://blog.csdn.net/qwdafedv/article/details/52431038
  • 相关阅读:
    第六周作业:《人月神话》对我做项目实践的启示(一)
    第五周作业:网站的初步设计
    关于做团队项目时需求分析工作中所学的一部分知识
    软件工程学生的编程能力与编程语言是中文或英文有关系吗?
    面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?请根据自己的理解简明扼要的回答。
    当下大部分互联网创业公司为什么都愿意采用增量模型来做开发
    1+X Web前端开发(中级)理论考试样题(附答案)
    1+X Web前端开发(初级)理论考试样题(附答案)
    vi 和vim 的区别
    Linux查看日志三种命令
  • 原文地址:https://www.cnblogs.com/pjlhf/p/8718914.html
Copyright © 2011-2022 走看看