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异常处理的一些总结和收获,希望大家能够收获到一些知识,并且多多访问我的其他文章内容,谢谢大家。