`
TechBirds
  • 浏览: 83160 次
文章分类
社区版块
存档分类
最新评论

Struts2默认拦截器(ExceptionMappingInterceptor)的使用及源码阅读

 
阅读更多

定义

捕获异常并定位到指定视图。
ps:从这给类的原型,可以帮助我们思考异常如何以日志形式记录,可以再此类的基础上进行扩展。这个待日后有慢慢琢磨。

使用

1.局部exception配置使用

Action源码:
public class SourceCoreAction {
 
 	public String error() throws ClassNotFoundException {
 		System.out.println("do the error!");	
 		Class.forName("xxx");		
 		return "success";
 	}
 	
 }
struts-xxx.xml配置:
		<action name="error" class="com.company.strutstudy.web.action.core.SourceCoreAction"
 			method="error">
 			<interceptor-ref name="exception"></interceptor-ref><!--只有一个默认拦截器起作用,好debug-->
 			<result name="input">/core/exception.jsp</result>
 			<result name="success">/core/ok.jsp</result>
 			<exception-mapping result="input" exception="java.lang.Exception"></exception-mapping>
 		</action>

2.全局exception配置使用

Action源码不变,参考局部exception

struts-xxx.xml配置:
<struts>
 	<package name="exception" extends="struts-default" abstract="true">
 		<global-results>
 			<result name="input">/core/exception.jsp</result>
 		</global-results>
 		<global-exception-mappings>
 			<exception-mapping result="input" exception="java.lang.Exception"></exception-mapping>
 		</global-exception-mappings>
 	</package>
 	<package name="core" extends="exception">
 		<action name="error"class="com.company.strutstudy.web.action.core.SourceCoreAction" method="error">
 			<interceptor-ref name="exception"></interceptor-ref>
 			<result name="success">/core/ok.jsp</result>
 		</action>
 	</package>
 </struts>

源码阅读

public class ExceptionMappingInterceptor extends AbstractInterceptor {
     
     protected static final Log log = LogFactory.getLog(ExceptionMappingInterceptor.class);
     protected Log categoryLogger;
     protected boolean logEnabled = false;
     protected String logCategory;
     protected String logLevel;    
 
     ....getset省略
     public String intercept(ActionInvocation invocation) throws Exception {
         String result;
         /*
          * 处理action或拦截器执行的异常
          */
         try {
             result = invocation.invoke();
         } catch (Exception e) {
         	//默认为false
             if (logEnabled) {
                 handleLogging(e);
             }
             //获取全局或局部与该action相关的exception映射信息
             List exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
             //获取异常发生以后的逻辑视图(resultcode)
             String mappedResult = this.findResultFromExceptions(exceptionMappings, e);
             if (mappedResult != null) {
                 result = mappedResult;
                 //将异常信息压入栈顶,异常信息可在页面通过ognl进行获取。
                 publishException(invocation, new ExceptionHolder(e));
             } else {
                 throw e;
             }
         }
 
         return result;
     }
 
     /**
      * Handles the logging of the exception.
      * 
      * @param e  the exception to log.
      */
     protected void handleLogging(Exception e) {
     	if (logCategory != null) {
         	if (categoryLogger == null) {
         		// init category logger
         		categoryLogger = LogFactory.getLog(logCategory);
         	}
         	doLog(categoryLogger, e);
     	} else {
     		doLog(log, e);
     	}
     }
     
     /**
      * Performs the actual logging.
      * 
      * @param logger  the provided logger to use.
      * @param e  the exception to log.
      */
     protected void doLog(Log logger, Exception e) {
     	if (logLevel == null) {
     		logger.debug(e.getMessage(), e);
     		return;
     	}  	
     	if ("trace".equalsIgnoreCase(logLevel)) {
     		logger.trace(e.getMessage(), e);
     	} else if ("debug".equalsIgnoreCase(logLevel)) {
     		logger.debug(e.getMessage(), e);
     	} else if ("info".equalsIgnoreCase(logLevel)) {
     		logger.info(e.getMessage(), e);
     	} else if ("warn".equalsIgnoreCase(logLevel)) {
     		logger.warn(e.getMessage(), e);
     	} else if ("error".equalsIgnoreCase(logLevel)) {
     		logger.error(e.getMessage(), e);
     	} else if ("fatal".equalsIgnoreCase(logLevel)) {
     		logger.fatal(e.getMessage(), e);
     	} else {
     		throw new IllegalArgumentException("LogLevel [" + logLevel + "] is not supported");
     	}
     }
 
     private String findResultFromExceptions(List exceptionMappings, Throwable t) {
         String result = null;
 
         // Check for specific exception mappings.
         if (exceptionMappings != null) {
             int deepest = Integer.MAX_VALUE;
             for (Iterator iter = exceptionMappings.iterator(); iter.hasNext();) {
                 ExceptionMappingConfig exceptionMappingConfig = (ExceptionMappingConfig) iter.next();
                 int depth = getDepth(exceptionMappingConfig.getExceptionClassName(), t);
                 if (depth >= 0 && depth < deepest) {
                     deepest = depth;
                     result = exceptionMappingConfig.getResult();
                 }
             }
         }
 
         return result;
     }
 
     /**
      * Return the depth to the superclass matching. 0 means ex matches exactly. Returns -1 if there's no match.
      * Otherwise, returns depth. Lowest depth wins.
      *
      * @param exceptionMapping  the mapping classname
      * @param t  the cause
      * @return the depth, if not found -1 is returned.
      */
     public int getDepth(String exceptionMapping, Throwable t) {
         return getDepth(exceptionMapping, t.getClass(), 0);
     }
 
     private int getDepth(String exceptionMapping, Class exceptionClass, int depth) {
         if (exceptionClass.getName().indexOf(exceptionMapping) != -1) {
             // Found it!
             return depth;
         }
         // If we've gone as far as we can go and haven't found it...
         if (exceptionClass.equals(Throwable.class)) {
             return -1;
         }
         return getDepth(exceptionMapping, exceptionClass.getSuperclass(), depth + 1);
     }
 
     /**
      * 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);
     }
 }



分享到:
评论

相关推荐

    基于Java的SaaS OA协同办公毕设(源码+使用文档)

    系统概述 SaaS OA协同办公系统通常包括以下几个关键组件: 用户界面(UI):提供用户交互界面,用于任务管理、日程安排、文档共享等。 后端服务:处理业务逻辑,如用户认证、数据管理、服务集成等。 数据库:存储用户数据、任务数据、文档数据等。 服务层:提供业务逻辑服务,如权限管理、工作流程等。 集成API:与其他系统集成,如邮件服务、短信服务等。 主要功能 用户认证与管理:用户登录、权限分配、用户资料管理。 任务管理:创建、分配、跟踪和归档任务。 日程管理:安排会议、提醒事件、查看日历。 文档管理:上传、下载、共享和版本控制文档。 协同工作:实时编辑文档、团队讨论、任务协作。 技术架构 Java:作为主要的编程语言。 Spring Boot:用于快速开发基于Java的后端服务。 Apache Shiro或Spring Security:用于安全和认证。 Thymeleaf或JSF:用于构建Java Web应用的用户界面。 数据库:如MySQL、PostgreSQL或MongoDB。 开发优势 实用性:解决企业日常办公需求,提高工作效率。 技术先进:使用当前流行的Java技术栈和框架。

    虎年春节送祝福微信小程序源码下载/新版UI/支持多种流量主

    虎年春节送祝福微信小程序源码下载,新版UI支持多种流量主,这是一款网友用以前发过的一款端午送祝福改的一款小程序。 里面的背景图包括祝福语都已经修改成与虎年相关的内容了,总体来说找的背景图还是可以的,不过有些地方和细节小编也给完善了一下。 然后小编测试的时候发现还没有流量主,所以小编也给加了几个流量主进去,到时候大家直接替换流量主的ID就可以了。 另外支持更多小程序推荐,拥有独立的推荐界面 PS:进入送祝福的按钮,部分机型是在老虎的帽子那里,部分是在金元宝那里

    智能车竞赛介绍&竞赛案例&智能车开发技术&技术项目.docx

    智能车竞赛是一个涉及人工智能、机器人技术和工程学的跨学科竞技活动。在这类比赛中,参赛者通常需要设计、构建和编程一辆能够自主行驶的智能车,并使其在给定的赛道上完成特定任务或挑战。以下是一些智能车竞赛的介绍、案例、技术和项目: 1. 智能车竞赛介绍: 智能车竞赛是一种比赛形式,旨在促进人工智能、机器人技术等领域的发展与创新。参赛者通过设计和编程智能车,挑战其在复杂环境中的自主感知、决策和行动能力。 2. 竞赛案例: RoboCup: 国际机器人世界杯大赛,包括足球比赛、救援比赛等多个项目,旨在推动机器人技术的发展与应用。 Formula Student Driverless: 一种大学生工程师团队间的比赛,要求参赛车辆自主完成赛道上的行驶和各种任务。 DARPA Urban Challenge: 由美国国防高级研究计划局(DARPA)主办的自动驾驶车辆竞赛,要求车辆在城市环境中完成一系列任务。 3. 智能车开发技术: 感知技术: 使用传感器(如摄像头、激光雷达、超声波传感器等)感知周围环境,获取路况和障碍物信息。 决策与规划技术: 基于感知系统获取的信息,采用不同的算法进行决策,包括路

    奇异谱分析的matlab程序(包括部分实验结果).zip

    该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示

    基于微信小程序的家庭记账本(后端接口ssm框架实现)-毕设项目

    毕业设计基于微信小程序的家庭记账本(后端接口ssm框架实现)-毕设项目.zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 项目介绍: 家庭记账本项目, 前端为微信小程序,后端接口为ssm框架实现,项目包含源码、数据库毕业设计基于微信小程序的家庭记账本(后端接口ssm框架实现)-毕设项目.zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 项目主要功能: 这是一个基于微信小程序的毕设项目,实现了家庭记账本功能。后端采用SSM(Spring、SpringMVC、MyBatis)框架进行接口开发。主要功能包括收支记录管理、分类统计、账户管理等,旨在方便用户跟踪和分析家庭财务状况。特点在于便捷的移动端使用体验,结合微信小程序的特性,实现随时随地记账。技术栈涵盖Java后端开发和微信小程序前端,为用户提供了轻量级的财务管理和数据分析工具。

    机器视觉:5G工业的“眼睛”

    机器视觉:5G工业的“眼睛”

    2024嵌入式面试资料IO模型

    2024嵌入式面试资料IO模型提取方式是百度网盘分享地址

    网络安全相关的密码学、网络攻防、安全分析等教程.docx

    网络安全相关的密码学、网络攻防、安全分析等教程.docx

    某三层流水别墅建筑施工说明,材料做法表A2.dwg

    某三层流水别墅建筑施工说明,材料做法表A2.dwg

    基于stm32的英语单词学习设备

    基于stm32的英语单词学习设备

    HIT 软件工程实验二 第一次迭代

    HIT 软件工程实验二 第一次迭代

    Python基于Tensorflow的手势识别系统源码+数据资料+说明文档.zip

    数据收集和预处理:收集手势数据集,包括不同手势的图像或视频。然后对这些数据进行预处理,例如裁剪、调整大小和标准化,以便于输入到神经网络模型中。 神经网络模型:使用TensorFlow构建一个深度学习模型来学习手势的特征并进行分类。常见的模型包括卷积神经网络(CNN)、循环神经网络(RNN)或其变体,用于处理图像序列的长期依赖性。 训练模型:使用收集的手势数据集对神经网络模型进行训练。通过将标记好的手势图像作为输入,并提供相应的标签(手势类型),来调整模型的参数以最小化预测误差。 模型评估:评估训练好的模型在测试数据集上的性能。这包括计算准确率、精确度、召回率等指标,以了解模型对手势识别的整体效果。 实时手势识别:将训练好的模型部署到实际系统中,例如智能手机应用程序或摄像头监测系统,以实时地识别人类手势。 模型优化:根据实时手势识别的反馈和用户反馈,对模型进行优化和改进,以提高识别准确率和性能。 综上所述,基于TensorFlow的手势识别系统可以帮助识别和理解人类手势的动作,广泛应用于虚拟现实、智能交互、手势控制等领域。

    汽车智能工厂报告:智能工厂降本增效,自动化设备迎来稳健发展

    汽车智能工厂报告:智能工厂降本增效,自动化设备迎来稳健发展

    使用VC++实现的类似C#下List<Key,Value>形态的数组字典

    可以同时通过index或者Key来对数组元素进行查询。在VC++ 2022下的示例: List<std::string, int> list; list.add("one", 1); auto element1 = list.getByIndex(1); auto element2 = list.getByKey("two"); for (const auto& element : list) { std::cout << "Element: " << element << std::endl; }

    某三层流水别墅建筑施工图暖-施工图.dwg

    某三层流水别墅建筑施工暖-施工图.dwg

    2024年铁基非晶合金行业分析报告.pptx

    行业报告

    整站程序亿网家教网站管理程序 v2.0-ywjj-php

    [整站程序]亿网家教网站管理程序 v2.0_ywjj-php

    优化BP神经网络(GWO-BP)灰狼算法

    优化BP神经网络(GWO-BP)【灰狼算法】

    2024嵌入式大厂面经赛科世纪面试题

    2024嵌入式大厂面经赛科世纪面试题提取方式是百度网盘分享地址

    2024嵌入式面试资料如何看芯片数据手册

    2024嵌入式面试资料如何看芯片数据手册提取方式是百度网盘分享地址

Global site tag (gtag.js) - Google Analytics