SpringMVC异常处理(7)

SpringMVC异常处理(7)

接下来我到了对于异常处理部分的学习。对于异常处理而言,SpringMVC部分仍然有解决的办法,下面就进入异常处理的内容吧。

1、@ExceptionHandler

该注解就是将一个方法指定为异常处理方法。

其注解的方法使用上,注意以下:

  • 返回值可以是ModelAndView、String或者void
  • 方法名随意等
  • 方法参数可以是Exception及其子类对象、HttpServletRequest、HttpServletResponse

此时系统会将这些方法赋值。

2、实现步骤

2.1 自定义异常类

package com.kkb.exceptions;
public class TeamException extends Exception{
	public TeamException() {
	}
	public TeamException(String message) {
		super(message);
	}
}
package com.kkb.exceptions;
public class TeamIdException extends TeamException{
	public TeamIdException() {
	}
	public TeamIdException(String message) {
		super(message);
	}
}
package com.jpg.exceptions;
public class TeamNameException extends TeamException{
    public TeamNameException() {
    }
    public TeamNameException(String message) {
        super(message);
    }
}

首先创建以上三个异常类,后面两个异常类继承自上面第一个异常类。

2.2 编写控制器

package com.jpg.controller;

import com.jpg.exceptions.TeamIdException;
import com.jpg.exceptions.TeamNameException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("ex")
public class ExController {

    @RequestMapping("test01/{id}/{name}")
    public ModelAndView test01(@PathVariable("id") Integer teamId,@PathVariable("name") String teamName) throws TeamIdException, TeamNameException {
        ModelAndView mv = new ModelAndView();
        if(teamId<=1000){
            throw new TeamIdException("因为team编号没有1000以下的,此时不合法!");
        }
        if("test".equals(teamName)){
            throw new TeamNameException("因为不能使用test,此时不合法!");
        }
        System.out.println(10/0);
        mv.setViewName("ok");
        return mv;
    }
    @ExceptionHandler(value = {TeamIdException.class,TeamNameException.class,Exception.class})
    public ModelAndView exHandler(Exception ex){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg",ex.getMessage());
        if(ex instanceof TeamIdException)
            mv.setViewName("idError");
        else if(ex instanceof TeamNameException)
            mv.setViewName("nameError");
        else
            mv.setViewName("error");
        return mv;

    }
}

在这里我们使用第一个方法来调动测试,并且会根据抛出的类,跟第二个方法里加载的异常类进行相比较,然后返回出相应的异常网页。

2.3 编写jsp代码

error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>error</title>
</head>
<body>
    <h1>默认的错误方式,即————${msg}</h1>
</body>
</html>

idError.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>id error</title>
</head>
<body>
    <h1>teamID Error-----${msg}</h1>
</body>
</html>

nameError.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>name error</title>
</head>
<body>
    <h1>teamName error</h1>
</body>
</html>

附加:关于代码调试出现500报错的问题

在这里插入图片描述

若出现如下的报错:

Message /idError.jsp (line: [14], column: [27]) #{...} is not allowed in template text
Description The server encountered an unexpected condition that prevented it from fulfilling the request.

请查看自己的JSP文件是不是使用了#{...}的符号,改成${...}

这是因为,${...}是jsp的一种标记语言,而#{...}是JSF的一种标记语言,在jsp页面中打印model attribute 必须用${...}

2.4 使用网页调试

在这里插入图片描述
在这里插入图片描述

此时调试内容正确无误。

3、后续的优化

我们在后续的异常编写时,一般将异常处理方法专门定义在一个类里面,作为全局的异常处理类。

这时候使用@ControllerAdvice,即控制器增强,是给控制器对象增强功能的。这里使用@ControllerAdvice修饰的类可以使用@ExceptionHandler

当使用@RequestMapping 注解修饰的方法抛出异常时,会执行@ControllerAdvice 修饰的类中的异常 处理方法。 @ControllerAdvice 注解所在的类需要进行包扫描,否则无法创建对象,即如下:

<context:component-scan base-package="com.jpg.exceptions"/>
package com.jpg.exceptions;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
/**
* ClassName: GlobalExceptionHandler
* 自定义全局异常处理类
* @author xiaoaifu
* @version 1.0
*/
@ControllerAdvice
public class GlobalExceptionHandler {
	@ExceptionHandler(value = TeamIdException.class)
	public ModelAndView exHandler1(Exception ex){
		ModelAndView mv=new ModelAndView();
		mv.addObject("msg",ex.getMessage());
		mv.setViewName("idError");
		return mv;
	}
	@ExceptionHandler(value = TeamNameException.class)
	public ModelAndView exHandler2(Exception ex){
		ModelAndView mv=new ModelAndView();
		mv.addObject("msg",ex.getMessage());
		mv.setViewName("nameError");
		return mv;
	}
	@ExceptionHandler(value = TeamException.class)
	public ModelAndView exHandler4(Exception ex){
		ModelAndView mv=new ModelAndView();
		mv.addObject("msg",ex.getMessage());
		mv.setViewName("nameError");
		return mv;
	}
	@ExceptionHandler(value = Exception.class)
	public ModelAndView exHandler3(Exception ex){
		ModelAndView mv=new ModelAndView();
		mv.addObject("msg",ex.getMessage());
		mv.setViewName("error");
		return mv;
	}
}

此时编写应该跟上面是一样的效果。

总结

以上是我对于SpringMVC异常处理的一些总结和收获,希望大家能够收获到一些知识,并且多多访问我的其他文章内容,谢谢大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiao艾扶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值