目录
第一种:简单异常处理:SimpleMapping
第二种方法:HandlerException
第三种异常处理@ExceptionHandler注解:
第四种:处理404、505等异常
首先,我们还是来先建一个项目:Maven版本选择1.0
然后等加载完项目后,添加到tomcat服务器里。
但我们有时候会看到JSP页面报了个莫名其妙的错误。说是没有找到servlet,那么我们需要在pom.xml中配置下这个jar包既可以。
往pom.xml中添加:
javax.servlet
javax.servlet-api
3.1.0
然后在同步升级下web的版本,需要在.settings文件包中org.eclipse.wst.common.project.facet.core.xml中进行版本同步升级为3.1。
最后就是maven update. 准备就绪了。
第一步:我们所需要的几个类,让程序先跑起来。
dao:
package com.exception.dao;
import java.util.Date;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public void show() throws Exception{
System.out.println("user dao is running");
}
}
service:
package com.exception.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.exception.dao.UserDao;
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void show() {
System.out.println("-----user service is running");
userDao.show();
}
}
controller:
package com.exception.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.exception.services.UserService;
@Controller
@RequestMapping("user")
public class UserController extends BaseController {
@Autowired
private UserService userService;
@RequestMapping("show")
public String show() {
userService.show();
return "show";
}
}
show.jsp :
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
Add User
~~~~ welcome to show page ~~~~
加入tomcat,进行运行测试。http://localhost:8080/SpringMVC-Exception/user/show
第二步:我们接下来可以继续我们的步骤:全局异常,我们可以在程序中添加异常。
我在service层进行写错程序:
package com.exception.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.exception.dao.UserDao;
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void show() {
//随便定义一个简单的程序错误
int a = 10 ,b = 0 ;
b=a/0;
System.out.println("-----user service is running");
userDao.show();
}
}
并且在springmvc-servlet.xml中配置下简单的异常处理:
解析:注释中有详细解释
error_null
那么我们需要一个默认的错误页面:error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
Add User
~~~~ this is error page ~~~~
好,进行测试:测试显示,当检测到有错误发生时,会自动跳转到error.jsp页面
注意:这种只是简单的错误预警,很多我们是没办法解决的,比如重新登录,重新加载,重新连接。但这种简单异常,只是跳转了一个界面。
需要去实现HandlerExceptionResolver这个接口,然后实现里面的方法。
根据异常提示内容进行返回相应的页面
package com.exception.resolver;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class HandlerException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
Map model = new HashMap();
model.put("ex", ex);
if(ex instanceof NullPointerException) {
return new ModelAndView("error_null", model);
}
return new ModelAndView("error", model);
}
}
写好后需要在springmvc-servlet.xml中配置一下即可。
所以它的优点是,只需要写一个实现类,在xml中调用就可以,不需要修改其他代码。而且比第一种更加灵活一些,第一种只能跳转页面,但是这种能进行业务逻辑处理。
系统会自动通过@ExceptionHandler,进行配置
我们首先写一个:ExceptionController作为异常处理的基本类,需要进行异常处理的类,继承它即可。
@ExceptionHandler会将这个方法自动配置到spring容器中进行全局异常检测
package com.exception.controllers;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
public class ExceptionController {
@ExceptionHandler
public ModelAndView exception(Exception ex) {
ModelAndView model = new ModelAndView();
model.addObject("ex", ex);
if(ex instanceof NullPointerException) {
model.setViewName("error_null");
}else {
model.setViewName("error");
}
return model;
}
}
我们的userController中存在一个异常,就用它继承ExceptionController既可以
package com.exception.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.exception.services.UserService;
@Controller
@RequestMapping("user")
public class UserController extends ExceptionController {
@Autowired
private UserService userService;
@RequestMapping("show")
public String show() {
userService.show();
return "show";
}
}
测试结果:
只需要在web.xml中配置一下就可以了,就相当于配置一下前端控制器
Archetype Created Web Application
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
1
springmvc
/
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
characterEncodingFilter
/*
404
/WEB-INF/pages/error/404.jsp
505
/WEB-INF/pages/error/505.jsp
测试输入:http://localhost:8080/SpringMVC-Exception/user/show1一个不存在的URL