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
  • 相关阅读:
    hdu6229 Wandering Robots 2017沈阳区域赛M题 思维加map
    hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)
    hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心
    hdu6441 Find Integer 求勾股数 费马大定理
    bzoj 1176 Mokia
    luogu 3415 祭坛
    bzoj 1010 玩具装箱
    bzoj 3312 No Change
    luogu 3383【模板】线性筛素数
    bzoj 1067 降雨量
  • 原文地址:https://www.cnblogs.com/pjlhf/p/8718914.html
Copyright © 2011-2022 走看看