SpringMVC第六章:SpringMVC的全局异常处理

目录

第一种:简单异常处理:SimpleMapping

第二种方法:HandlerException

第三种异常处理@ExceptionHandler注解:

第四种:处理404、505等异常


 

首先,我们还是来先建一个项目:Maven版本选择1.0

SpringMVC第六章:SpringMVC的全局异常处理_第1张图片SpringMVC第六章:SpringMVC的全局异常处理_第2张图片

然后等加载完项目后,添加到tomcat服务器里。

但我们有时候会看到JSP页面报了个莫名其妙的错误。说是没有找到servlet,那么我们需要在pom.xml中配置下这个jar包既可以。

SpringMVC第六章:SpringMVC的全局异常处理_第3张图片

往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

 

第一种:简单异常处理:SimpleMapping

第二步:我们接下来可以继续我们的步骤:全局异常,我们可以在程序中添加异常。

我在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页面

注意:这种只是简单的错误预警,很多我们是没办法解决的,比如重新登录,重新加载,重新连接。但这种简单异常,只是跳转了一个界面。

 

第二种方法:HandlerException

 

需要去实现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中配置一下即可。


   解析:配置一个名为exceptionHandler的异常解析器



	
	
	
	
	
		
		
	
	
	
	
	
	
	
	

测试结果:

所以它的优点是,只需要写一个实现类,在xml中调用就可以,不需要修改其他代码。而且比第一种更加灵活一些,第一种只能跳转页面,但是这种能进行业务逻辑处理。

 

第三种异常处理@ExceptionHandler注解:

系统会自动通过@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";
	}
}

测试结果:

SpringMVC第六章:SpringMVC的全局异常处理_第4张图片

 

第四种:处理404、505等异常

只需要在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

 

SpringMVC第六章:SpringMVC的全局异常处理_第5张图片

 

 

 

你可能感兴趣的:(SpringMVC,java,spring,java,springmvc,spring,boot)