重温经典struts1之自定义全局异常处理类处理异常以及<exeception>标签的配置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

前面的文章,我们学习了,Action类中调用Service,通过try…catch代码块,catch自定义异常类,通过ActionMessage类,进行错误信息页面显示,
今天我们来学习,自定义全局异常处理类,无需try…catch代码块,通过配置struts-config.xml文件中的< exeception>标签,统一处理异常,将错误信息显示到页面


需求

如下图所示,
写一个login页面
当用户名和密码不等于admin时,
login页面上显示错误信息:用户名和密码错误

在这里插入图片描述

具体实现步骤

  1. 自定义MyException异常类
    继承RuntimeException类,定义messageKey和args变量,提供get和set方法,来接收错误消息key和参数内容
    这里注意args变量是object数组类型,可以接收多个参数

MyException异常类代码如下:

package xxx.xxx.exception;

public class MyException extends RuntimeException {

	private String messageKey;

	private Object[] args;

	public String getMessageKey() {
		return messageKey;
	}

	public void setMessageKey(String messageKey) {
		this.messageKey = messageKey;
	}

	public Object[] getArgs() {
		return args;
	}

	public void setArgs(Object[] args) {
		this.args = args;
	}

	public MyException(String messageKey) {
		this(messageKey, null);
	}

	public MyException(String messageKey, Object arg) {
		this(messageKey, new Object[] { arg });
	}

	public MyException(String messageKey, Object[] args) {
		this.messageKey = messageKey;
		this.args = args;
	}

}
  1. 自定义MyExceptionHandler全局异常处理类
    继承ExceptionHandler类,放行自定义MyException以外的异常类,处理我们自定义的异常类,同样,将自定义异常类的消息key和参数赋值到ActionMessage类,返回到页面显示

MyExceptionHandler异常处理类代码如下:

package xxx.xxx.handler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.config.ExceptionConfig;
import org.apache.struts.util.ModuleException;

import xxx.xxx.exception.MyException;

public class MyExceptionHandler extends ExceptionHandler {

	public ActionForward execute(Exception ex, ExceptionConfig ae, ActionMapping mapping, ActionForm formInstance,
			HttpServletRequest request, HttpServletResponse response) throws ServletException {

		if (!(ex instanceof MyException)) {
			return super.execute(ex, ae, mapping, formInstance, request, response);
		}

		ActionForward forward = null;
		ActionMessage error = null;
		String property = null;

		if (ae.getPath() != null) {
			forward = new ActionForward(ae.getPath());
		} else {
			forward = mapping.getInputForward();
		}

		MyException ece = (MyException) ex;
			error = new ActionMessage(ece.getMessageKey(), ece.getArgs());
			property = error.getKey();

		this.logException(ex);

		request.setAttribute(Globals.EXCEPTION_KEY, ex);
		this.storeException(request, property, error, forward, ae.getScope());

		return forward;
	}
}

  1. 将自定义MyException异常类和MyExceptionHandler异常处理类,配置到struts-config.xml文件中的< global-exceptions>< exception>标签内,交给struts管理

struts-config.xml代码如下:

	<global-exceptions>
		<exception key=""
		           type="xxx.xxx.exception.MyException"
		           handler="xxx.xxx.handler.MyExceptionHandler"/>
	</global-exceptions>
  1. UserService类中验证用户名和密码,错误时,抛出自定义MyException的异常类
    错误消息内容的login.error,是定义在国际化资源文件中。
    具体内容参看我之前的文章
    重温经典struts1之国际化(I18N)

UserService 代码如下:

package xxx.xxx.service;

import xxx.xxx.exception.MyException;

public class UserService {

	public void login(String username, String password) {
		if (!"admin".equals(username) || !"admin".equals(password)) {
			throw new MyException("login.error", username);
		}
	}

}

  1. action类调用UserService类完成用户名和密码验证
    通过下边的示例,可以看到,action中调用service的异常处理代码变得比较简洁。

Action类代码如下:

package xxx.xxx.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import xxx.xxx.form.LoginForm;
import xxx.xxx.service.UserService;

public class LoginAction extends Action {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		LoginForm lf = (LoginForm) form;
		String username = lf.getUsername();
		String password = lf.getPassword();

		UserService userService = new UserService();

		ActionMessages messages = new ActionMessages();

		userService.login(username, password);

		ActionMessage message = new ActionMessage("login.success", username);
		messages.add("login.success", message);
		this.saveMessages(request, messages);

		return mapping.findForward("success");

	}
}

总结

到这里我们就完成了自定义全局异常处理类处理异常以及将其配置到struts-config.xml的<exeception>标签中,运行效果在文章开头需求中的图可以看到,欢迎留言交流,下篇见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/317429.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

metrics安装异常原因【doesn‘t contain any IP SANs】

1、问题背景 安装好k8s后&#xff0c;安装metrics-server后发现对应的pod一直无法启动。 apiVersion: v1 kind: ServiceAccount metadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: Cl…

05.neuvector网络学习与管控实现

原文链接&#xff0c;欢迎大家关注我的github 一、网络的策略学习 1.1.非主机模式的网络连接学习 agent进程侧&#xff1a; 调用taskAddContainer->taskInterceptContainer->programDP->DPCtrlAddTapPort为所有非host模式的容器向dp传送 DPAddTapPortReq对象数据.&…

成就动机测试

成就动机测试广泛应用在职业发展领域&#xff0c;如&#xff1a;企业Hr人力资源管理部门&#xff0c;用于评估分析员工的潜能和价值&#xff0c;适用场景有人才招聘&#xff0c;岗位晋升&#xff0c;绩效考评等等。在大学生做职业规划&#xff0c;求职应聘中&#xff0c;应用成…

数据结构与算法(十一) 排序算法一

int nArray[] { 8,5,3,2,7 };如下一个数组&#xff0c;现对其进行从小到大排序 选择排序 选择排序&#xff1a;将小的依次放在前面 具象化如下&#xff1a; void swap(int *nSValue,int *nDValue) 交换函数 { int nTempValue 0; nTempValue *nSValue; *nSVal…

Spring Boot 整合支付宝实现在线支付方案(沙箱环境)

文章目录 1.理解沙箱环境2.沙箱环境接入准备2.1 访问开发者控制台2.2 获取重要信息2.3 处理秘钥 3.接入支付宝支付的流程4.实现支付4.1 添加 SDK 依赖4.2 创建配置类4.3 支付宝订单管理接口实现流程4.4 支付宝支付接口实现流程 5.支付宝支付功能演示7.总结 TIP&#xff1a;对于…

分享一个好用的免费在线扣图网址

具体效果 附地址 https://cutout.aiwave.cc/

【python】基础知识类的语法功能讲解

Python代码定义了一个名为Calculation的类&#xff0c;用于执行基础的数学运算&#xff08;加法、减法、乘法、除法和取模&#xff09;。下面我将详细解释各个部分的功能&#xff0c;并以列表形式总结&#xff1a; 类定义&#xff1a; class Calculation: 定义了一个名为Cal…

iOS Universal Links(通用链接)详细教程

一&#xff1a;Universal Links是用来做什么的&#xff1f; iOS9.0推出的用于应用之间跳转的一种机&#xff0c; 通过一个https的链接启动app。如果手机有安装需要启动的app&#xff0c;可实现无缝跳转。如果没有安装&#xff0c;会打开网页。 实现场景&#xff1a;微信链接无…

Flink窗口(2)—— Window API

目录 窗口分配器 时间窗口 计数窗口 全局窗口 窗口函数 增量聚合函数 全窗口函数&#xff08;full window functions&#xff09; 增量聚合和全窗口函数的结合使用 Window API 主要由两部分构成&#xff1a;窗口分配器&#xff08;Window Assigners&#xff09;和窗口函…

Memcache简介与运维

开源、高性能、高并发的分布式内存缓存系统。 作用 缓存关系型数据库的结果&#xff0c;减少数据库自身访问的次数。 常见内存缓存服务软件对比 memcache 纯内存 redis、memcachedb 可持久化存储&#xff0c;同时会使用磁盘存 …

Typora使用及Markdow学习笔记1

编程如画&#xff0c;我是panda&#xff01; 最近有在学习Markdown&#xff0c;所以这次分享一下我的Markdown学习笔记 目录 前言 一、标题 二、段落 1.换行 2.分割线 三、文字显示 1.字体 2.上下标 四、列表 1.无序列表 2.有序列表 3.任务列表 五、区块 六、代…

外包干了5个月,感觉技术退步明显......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四…

深入理解Spring IOC

1. IOC 理论 IOC 全称控制反转&#xff0c;英文名为 Inversion of Control&#xff0c;它还有一个别名为 DI&#xff08;Dependency Injection&#xff09;,即依赖注入。 在我们刚接触Spring的时候&#xff0c;我们就听说了IOC&#xff0c;但是对于IOC的理解&#xff0c;貌似…

ubuntu 20.04下 Tesla P100加速卡使用

1.系统环境&#xff1a;系统ubuntu 20.04, python 3.8 2.查看cuDNN/CUDA与tensorflow的版本关系如下&#xff1a; Build from source | TensorFlow 从上图可以看出&#xff0c;python3.8 对应的tensorflow/cuDNN/CUDA版本。 3.安装tensorflow #pip3 install tensorflow 新版…

ZooKeeper初探:分布式世界的守护者

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 ZooKeeper初探&#xff1a;分布式世界的守护者 前言Zookeeper的概述分布式系统中的角色和作用&#xff1a; Zookeeper的数据模型Znode的概念和层次结构&#xff1a;Znode的类型和应用场景&#xff1a;…

如何给AI下达精准的指令,哪些提示词对于AI是有效的?

刚上手那会&#xff0c;我倾向于将 prompt 翻译为“指令”&#xff0c;但这并不精确。“指令”通常对应instructions&#xff0c;属于 prompt 中的纯指令部分&#xff0c;通常是一个动宾结构&#xff08;做什么&#xff09;。剩下的部分更多是描述&#xff08;describe&#xf…

【从零开始学习微服务 | 第一篇】什么是微服务

目录 前言&#xff1a; 架构风格&#xff1a; 单体架构&#xff1a; 分布式架构&#xff1a; 微服务&#xff1a; 总结&#xff1a; 前言&#xff1a; 在当今快速发展的软件开发领域&#xff0c;构建大型应用程序已经成为一项巨大的挑战。传统的单体应用架构往往难以满足…

Shiro框架:Shiro内置过滤器源码解析

目录 1. 常见项目中过滤器配置 2.Url访问控制配置解析为内置过滤器 2.1 DefaultFilterChainManager构造并注册内置过滤器 2.2 构造过滤器链 3. Shiro内置过滤器解析 3.1 内置过滤器概览 3.2 公共继承类解析 3.2.1 顶层Filter接口 3.2.2 AbstractFilter 3.2.3 Nameab…

Github上传代码/删除仓库/新建分支的操作流程记录

首先先安装git&#xff0c;安装完git后&#xff0c;看如下操作指令&#xff1a; 输入自己的用户名和邮箱&#xff08;为注册GITHUB账号时的用户名和邮箱&#xff09;&#xff1a; git config --global user.name "HJX-exoskeleton" git config --global user.email …

扫码看图怎么做轮播效果?多组图片用扫码查看的方法

图片通过二维码来做展示现在是很常见的一种方式&#xff0c;用这种方式可以用于多种图片格式。那么当我们需要将图片做成多个分组的轮播图样式展示时&#xff0c;有什么好的方法能够做成这个效果呢&#xff1f;下面就来教大家使用二维码生成器制作图片二维码的操作方法&#xf…