一. SpringMVC的异常处理
异常,在开发中很常见,有编译时期的异常和运行时期的异常。 异常,可以存在于 dao,service,action 各个层里面, 在方法中可以抛出异常,依次抛出, dao里面抛出的异常,由service进行处理,service里面抛出的异常,由action进行处理。 但一般,不在dao里面抛出异常,dao里面的异常是数据库层面的异常,由数据库进行抛出,如 select语句错误,插入时主键重复,查询出多行用一行接收 等。 service抛出的是业务的异常,是业务逻辑的错误。 action中的异常,主要是接收处理service中抛出的异常,或者是对前端传入的数据进行验证的异常。 常见的,是把所有的异常都放置在action中。
springmvc的异常处理,常见的有三种方式, 一种是 org.springframework.web.servlet.handler.SimpleMappingExceptionResolver 进行配置, 另外一种是实现 org.springframework.web.servlet.HandlerExceptionResolver 接口,还有一种是注解的形式。 注解的形式,不常用,老蝴蝶这里就不讲了。 可以学习 JS_HCX 前辈的文章: springmvc异常处理
老蝴蝶写这篇文章的时候,也参考了该文章,为了评论,还特意注册了简书。 哈哈。
二. SimpleMappingExceptionResolver 实现异常处理
自定义的异常,需要继承 java.lang.Exception 类, 常见的异常有很多,这里以 员工 User 类为例,自定义两个异常类,一个是 InputException, 对输入数据的异常处理, DataException 对数据的异常处理。
二.一 自定义的 InputException 类
package com.yjl.exception; public class InputException extends Exception{ private static final long serialVersionUID = 1L; private String message; public InputException(){ } public InputException(String message) { this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
二.二 自定义的 DataException 类
package com.yjl.exception; public class DataException extends Exception{ private static final long serialVersionUID = 1L; private String message; public DataException(){ } public DataException(String message) { this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
二.三 前端登录页面 login.jsp
<body> <h2>两个蝴蝶飞,异常处理使用</h2> <form:form commandName="user" action="login.action" type="post"> <form:label path="name">姓名:</form:label> <form:input path="name"/> <br/><br/> <form:label path="password">密码:</form:label> <form:input path="password"/> <br/><br/> <form:button>提交</form:button> </form:form> </body>
二.四 后端 UserAction 验证处理
//转到登录的页面 @RequestMapping(value="toLogin") public String toLogin(Model model){ model.addAttribute("user",new User()); return "user/login"; } //绑定到user对象。 @RequestMapping(value="login") public String login(User user,Model model,HttpServletRequest request) throws Exception{ model.addAttribute("user",user); if(user.getName()==null||"".equals(user.getName())){ throw new InputException("用户名不能为空"); } if(user.getPassword()==null||"".equals(user.getPassword())){ throw new InputException("密码不能为空"); } if(!("两个蝴蝶飞".equals(user.getName())&&"1234".equals(user.getPassword()))){ throw new DataException("用户名或者是密码不正确"); } return "user/list"; }
根据前台传入的不同的值,进行抛出不同的异常信息。
二.五 springmvc.xml 配置文件中配置 SimpleMappingExceptionResolver
<mvc:annotation-driven></mvc:annotation-driven> <!-- 配置异常 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- 每个异常类,对应一个jsp --> <prop key="com.yjl.exception.InputException">errors/inputError</prop> <prop key="com.yjl.exception.DataException">errors/dataError</prop> <!-- 可继续添加多个 ,如StudentException --> </props> </property> <!-- 默认的异常页面 --> <property name="defaultErrorView" value="errors/default"></property> <!-- 默认的异常代码 --> <property name="defaultStatusCode" value="500"></property> <!-- 异常属性设置,用于在jsp中进行接收异常的信息 --> <property name="exceptionAttribute" value="ex"></property> </bean>
二.六 创建errors文件夹,里面创建不同的异常.jsp
不要忘记 在jsp 里面设置 isErrorPage=true.
1 .errors/default.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>默认异常接收</title> </head> <body> ${ex.message} </body> </html>
2 .errors/inputError.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>输入数据异常</title> </head> <body> ${ex.message}, 用户输入的错误 </body> </html>
3 . errors/dataError.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>数据异常</title> </head> <body> ${ex.message},数据用户不存在的错误 </body> </html>
二.七 重启服务器,进行验证
正常的界面:
没有输入用户名时:
用户名输入为两个蝴蝶飞, 密码不输入时
用户名输入为两个蝴蝶飞,密码输入 12时,
用户名输入为两个蝴蝶飞,密码输入为1234,正确的数据时,
可以进行异常的抛出,然而,这个只能进行抛出异常,根据不同的异常,来跳转到不同的页面进行显示,却无法对异常进行相应的处理,所以会选择实现 HandlerExceptionResolver 接口的方式。