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>


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


正常的界面:


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


没有输入用户名时:


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


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


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


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


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


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


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


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

上一篇:揭秘自编码器,一种捕捉数据最重要特征的神经网络(视频+代码)


下一篇:我看JAVA 之 Thread & ThreadLocal