基于Struts2和freemarker的异常提示信息的统一处理

2024-03-09 00:58

本文主要是介绍基于Struts2和freemarker的异常提示信息的统一处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Struts2 版本 2.2.1
Freemarker版本 2.3.16
此统一处理的目的在于 Web层、Service层抛出的业务异常以统一的格式显示在页面的固定位置。
首先定义我们的业务异常类。
public abstract class BaseException extends RuntimeException {
    private static final long serialVersionUID = -6765360320533958383L;
    private String messageCode;
    public String getMessageCode() {
        return messageCode;
    }
    public void setMessageCode(String messageCode) {
        this.messageCode = messageCode;
    }
    public BaseException() {
        super();
    }
    public BaseException(String message) {
        super(message);
    }
    public BaseException(String message, Throwable cause) {
        super(message, cause);
    }
    public BaseException(Throwable cause) {
        super(cause);
    }
    public BaseException(String messageCode, String message) {
        super(message);
        setMessageCode(messageCode);
    }
    public BaseException(String messageCode, String message, Throwable cause) {
        super(message, cause);
        setMessageCode(messageCode);
    }
public class BusinessException extends BaseException {
    private static final long serialVersionUID = -1657938434382769721L;
                   
    public BusinessException() {
        super();
    }
    
    public BusinessException(String message, Throwable cause) {
        super(message, cause);
    }
    
    public BusinessException(Throwable cause) {
        super(cause);
    }
    
    public BusinessException(String messageCode, String message) {
        super(messageCode, message);
        setMessageCode(messageCode);
    }
    
    public BusinessException(String messageCode, String message, Throwable cause) {
        super(messageCode, message, cause);
        setMessageCode(messageCode);
    }
}

拦截器类:ErrorHandlingInterceptor.java 用于拦截异常,并在此统一处理
public class ErrorHandlingInterceptor extends AbstractInterceptor {
    private static final long serialVersionUID = 1L;
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        try {
            return invocation.invoke();
        } catch (Exception e) {
            e.printStackTrace();
            handleException(e);
        }
        return Action.INPUT;
    }
    
    /** *//**
     * 处理异常
     * @param e
     */
    private void handleException(Exception e) {
        boolean handled = false;
        Throwable throwEx = e;
        while (throwEx != null) {
            if(throwEx instanceof BusinessException) {
                BusinessException be = (BusinessException)throwEx;
                String errorCode = be.getMessageCode();
                
                // 从缓存中通过ErrorCode取得对应message
                // 实现略
                String errorMsg = getMessage(errorCode);
                
                // 页面显示错误提示信息
                fillError4Display(errorMsg);
                handled = true;
            } 
            throwEx = throwEx.getCause();
        }
        
        if(!handled) {
            fillDefaultError();
        }
    }
    
    private HttpServletRequest getRequest() {
        return (HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
    }
    
    private void fillDefaultError() {
        fillError4Display("系统忙,请稍候再试。");
    }
    
    private void fillError4Display(String msg) {
        getRequest().setAttribute("_error_msg_", msg);
    }
}
拦截所有的异常,并对其进行处理。
当为 自定义的BusinessException时,根据抛出异常时的msgCode,取得对应的显示信息。
msgCode与显示信息的对应关系 可先配置好,系统启动时将其缓存起来。
如果非BusinessException,则统一显示为 “系统忙,请稍候再试。”
将要显示的信息设置到Request中,下面来看看Freemarker模板的写法:
msg.ftl

<div id='_err_msg_div'>
    <#if Request['_error_msg_']?exists>
        ${Request['_error_msg_']}
    </#if>
</div>
<script type="text/javascript">
if (!this.Message) {
    this.Message = {};
    (function() {
        /**//**
         * show client message
         */
        Message.showMsg = function(msg) {
            document.getElementById("_err_msg_div").innerHTML = msg;
        };
    })();
};
</script>
在使用时,只要在页面上想要展现异常信息的地方插入如下代码即可:
<#include "/msg.ftl">
这样 系统中的异常 将会被统一的显示。
当使用js做前台的表单验证的时候,提示用户的输入有问题,则可以使用 Message.showMsg('...'),提示信息也会显示在同一个位置。
这样就实现了异常提示信息的统一展示了。
这是一个比较简易的实现,只提供一个思路。

这篇关于基于Struts2和freemarker的异常提示信息的统一处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/789029

相关文章

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、