SpringMVC的异常处理和REST风格的实例应用(十三)上

简介: SpringMVC的异常处理和REST风格的实例应用(十三)上

一. 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>


二.七 重启服务器,进行验证


正常的界面:


微信图片_20211228234356.png


没有输入用户名时:


微信图片_20211228234426.png


用户名输入为两个蝴蝶飞, 密码不输入时


微信图片_20211228234446.png


用户名输入为两个蝴蝶飞,密码输入 12时,


微信图片_20211228234505.png


用户名输入为两个蝴蝶飞,密码输入为1234,正确的数据时,


微信图片_20211228234525.png


可以进行异常的抛出,然而,这个只能进行抛出异常,根据不同的异常,来跳转到不同的页面进行显示,却无法对异常进行相应的处理,所以会选择实现 HandlerExceptionResolver 接口的方式。

相关文章
|
存储 JSON 前端开发
SpringMVC的异常处理和REST风格的实例应用(十三)下
SpringMVC的异常处理和REST风格的实例应用(十三)下
172 0
SpringMVC的异常处理和REST风格的实例应用(十三)下
|
JSON 前端开发 JavaScript
SpringMVC的异常处理和REST风格的实例应用(十三)中
SpringMVC的异常处理和REST风格的实例应用(十三)中
208 0
SpringMVC的异常处理和REST风格的实例应用(十三)中
|
4月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
3月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
43 1
|
3月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
3月前
|
XML Java 数据格式
SpringMVC的XML配置解析-spring18
SpringMVC的XML配置解析-spring18
|
3月前
|
应用服务中间件
从代码角度戳一下springMVC的运行过程-spring16
从代码角度戳一下springMVC的运行过程-spring16
|
4月前
|
前端开发 Java 关系型数据库
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
|
4月前
|
移动开发 Java 测试技术
Spring MVC+Spring+Mybatis实现支付宝支付功能(附完整代码)
Spring MVC+Spring+Mybatis实现支付宝支付功能(附完整代码)
134 1
|
11月前
|
前端开发 Java Go
Spring MVC 和 Spring Boot 的区别
Spring MVC 和 Spring Boot 的区别
204 0