Debug查看Struts2中ExceptionMappingInterceptor拦截器怎么把ExceptionHolder放入值栈中,以及理解拦截器的工作原理。。。

1、小案例代码:

jsp界面:

 <body>
    <s:property value="exceptionStack"/><br>
    <s:property value="exception"/><br>
    <s:property value="exception.getMessage"/>
    <form action="product-details.action" method="post">
    ProductName:<input type="text" name="productName"/><br>
    ProductDesc:<input type="text" name="productDesc"/><br>
    ProductPrice:<input type="text" name="productPrice"/><br>
    <input type="submit" value="Submit"/>
    </form>
  </body>

Action类(在其中故意写了一个 java.lang.ArithmeticException: / by zero):

public String save() {
        int i=1/0;
        return "detailes";

    }

struts.xml

<action name="product-details" class="com.luwenhu.struts2.Model.Product" method="save">
<exception-mapping result="input" exception="java.lang.ArithmeticException"></exception-mapping>
<result name="input">/WEB-INF/pages/input.jsp</result>
<result name="detailes">/WEB-INF/pages/details.jsp</result>
</action>

2、源码分析

(1)从struts-default.xml中struts2提供了一个默认的拦截器栈(defaultStack)

(2)拦截器栈中有个exception拦截器,所属类为com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor

(3)查看ExceptionMappingInterceptor这个类的intercept(拦截)方法,观察其怎么进行工作的。

观察这个方法,拦截器在捕获到异常e的时候会:

a.将这个异常交个handleLogging()方法

b.根据struts.xml的配置内容,通过ExceptionMappingConfig,配置异常结果处理

c.将异常处理放置(publish)到值栈中

3、debug验证

(1)我们在捕获到异常(191行)后进行断点,然后观察变量以及它的值,发现成功捕获到java.lang.ArithmeticException: / by zero

(2)继续执行到196行,mappingConfig对应着struts.xml中的异常配置

<-------->

注意带值栈栈顶此时还是test对象:

(3)  继续执行代码至201行,执行完之后,我门发现值栈的栈顶发生了变化。此时栈顶为ExceptionHolder,也就是说异常信息成功放置到了值栈中

                                                                                                                                                                                        

就上就是ExceptionMappingInterceptor拦截器的工作原理!

时间: 2024-10-17 10:34:08

Debug查看Struts2中ExceptionMappingInterceptor拦截器怎么把ExceptionHolder放入值栈中,以及理解拦截器的工作原理。。。的相关文章

从值栈中获取数据

使用struts2的标签+ognl表达式获取值栈数据 <s:property value="ognl表达式"/> 一.获取字符串 示例 打印后台string变量的值 jsp页面 Java代码 二.获取对象 示例 打印user对象的userName与userPwd的值 jsp页面 java代码 三.获取list集合 Java代码 1.通过list[i]的方式获取 jsp页面 2.使用struts2标签获取<s:iterator> jsp页面 3..使用struts

struts框架值栈问题七之EL表达式也会获取到值栈中的数据

7. 问题七:为什么EL也能访问值栈中的数据? * StrutsPreparedAndExecuteFilter的doFilter代码中 request = prepare.wrapRequest(request); > 对Request对象进行了包装 ,StrutsRequestWrapper > 增强了request的 getAttribute Object attribute = super.getAttribute(s); if (attribute == null) { attrib

jsp页面通过使用s标签获取值栈中的值(初识)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitio

向值栈中存放数据与从值栈中读取数据

一.set方法方式 1.使用set方法存数据 public class GetValueStackAction extends ActionSupport{ //使用值栈的get方法往值栈中存数据 public String execute(){ //1获取ActionContext对象 ActionContext ctx = ActionContext.getContext(); //2.获取ValueStack对象 ValueStack vs =ctx.getValueStack(); /*

【源码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)

帮朋友做的,好像是一个面试题.如果仅仅是考察递归的话,应该是够了,程序的健壮性和通用性都很一般的说-- #include <stdio.h> #include <stdlib.h> int count = 0; void myRevert(int n, int a[]) { if(n < 10) { a[count++] = n; } else { a[count++] = n % 10; myRevert(n / 10, a); } } int main() { int n

将一整数逆序后放入一数组中

1.题目描述 将一整数逆序后放入一数组中(非递归实现) 例如: 1234 变为 {4,3,2,1} 2.代码实现 1 package com.wcy.october; 2 3 /** 4 * 时间:2016年10月23日 5 * 题目:将一整数逆序后放入一数组中(非递归实现) 例如: 1234 变为 {4,3,2,1} 6 */ 7 public class RecursionTest2 { 8 9 /** 10 * 将一整数逆序后放入一数组中 11 * @param number 待逆序的整数

zoj 1608 Two Circles and a Rectangle 判断两个圆是否能放入一个矩形中

题目来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=608 分析: 两个圆放到矩形的临界点图为: 其中a为长, b为宽, r1 > r2 红色三角形的三边长分别为: x = a - (r1 +r2) y = b - (r1 + r2) z = r1 +r2 当 x ^ 2 + y ^ 2  >= z^2 时, 显然 矩形是可以放进去圆的. 代码如下: int main() { double w, l , r1 ,r2

在action中将字符串、对象、list集合保存到值栈中,在jsp页面中获取的方法

转自:csdn 封装对象User,属性有id,username,email等1.1:在action中将字符串保存到值栈中   1.1.1 获取值栈对象         ValueStack stack = ActionContext.getContext().getValueStack();   1.1.2 将字符串保存到值栈中         stack.set("username","leo");1.2:在jsp页面中获取值栈中的字符串   1.2.1 <

7、struts2 案例( 模型驱动、 防止表单重复提交--拦截器 、数据回显 、值栈 、 OGNL表达式综合运用)

struts2 案例 技术点: 模型驱动 防止表单重复提交–拦截器 数据回显 值栈 OGNL表达式 通配符.路径匹配原则.常量 数据处理的集中方式 请求数据自动封装以及类型转换 1.导包 c3p0-0.9.1.2.jar commons-dbutils-1.6.jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar freemarker-2.3.19.jar javassist-3.11.0.GA.j