zoukankan      html  css  js  c++  java
  • SpringMVC异常处理器

    本节内容:

    • 异常处理思路
    • 自定义异常类
    • 自定义异常处理器
    • 异常处理器配置
    • 错误页面
    • 异常测试

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。(它负责捕获,将异常放到我们自己编写的处理类中)

    一、异常处理器思路

    系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

    系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

    二、自定义异常类

    为了区别不同的异常,通常根据异常类型进行区分,这里我们创建一个自定义系统异常。
    如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

    【示例】:MyException.java

    package com.wisedu.springmvc.exception;
    
    public class MyException extends Exception{
    
    	private String msg;
    
    	public MyException() {
    		super();
    	}
    
    	public MyException(String msg) {
    		super();
    		this.msg = msg;
    	}
    
    	public String getMsg() {
    		return msg;
    	}
    
    	public void setMsg(String msg) {
    		this.msg = msg;
    	}
    	
    }

    三、自定义异常处理器

    CustomExceptionResolver.java

    package com.wisedu.springmvc.exception;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.io.Writer;
    
    /**
     * 异常处理器的自定义的实现类
     * @author jkzhao
     *
     */
    public class CustomHandleException implements HandlerExceptionResolver{
    
    	public ModelAndView resolveException(HttpServletRequest request, 
    			HttpServletResponse response, Object obj, // obj是发生异常的地方。比如异常发生在 Serivce层的某个方法,obj是 包名+类名+方法名(形参)拼起来的一个字符串
    			Exception e) {
    
    		//记录日志
    		//...
    
    		// 定义异常信息
    		String msg;
    
    		//判断异常类型
    		if(e instanceof MyException){
    			//预期异常
    			msg = ((MyException) e).getMsg();
    		}else{
    			// 如果是运行时异常,则取错误堆栈,从堆栈中获取异常信息
    			Writer out = new StringWriter();
    			PrintWriter s = new PrintWriter(out);
    			e.printStackTrace(s);
    			msg = out.toString();
    		}
    
            // 返回错误页面,给用户友好页面显示错误信息
            ModelAndView mav = new ModelAndView();
            mav.addObject("msg", msg);
    		mav.setViewName("error");
    		return mav;
    	}
    
    }

    完整的写法,包含了预期异常和运行时异常。

    四、异常处理器配置

    在springmvc.xml中添加:

    <!-- 异常处理器 -->
    	<bean id="customHandleException"  class="com.wisedu.springmvc.exception.CustomHandleException"></bean>

    五、错误页面

    error.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!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>Insert title here</title>
    </head>
    <body>
    
    	<h1>系统发生异常了!</h1>
    	<br />
    	<h1>异常信息</h1>
    	<br />
    	<h2>${msg }</h2>
    
    </body>
    </html>
    

    六、异常测试

    修改ItemController方法“itemList”,抛出异常:

            @RequestMapping(value = "/item/itemlist.action")
    	public ModelAndView itemList() throws MyException {
    		
    		// 从MySQL中查询数据
    		List<Items> list = itemService.selectItemsList();
    
            //运行时异常
            int i = 1/0;
    
            //自定义异常
            if (true){
                throw new MyException("商品信息不能为空");
            }
    
    		// 创建ModelAndView,用来存放数据和视图
    		ModelAndView mav = new ModelAndView();
    		// 设置数据到模型中
    		mav.addObject("itemList", list); //页面上循环的是itemList
    		// 设置视图的路径,需要设置视图的物理地址
    		//mav.setViewName("/WEB-INF/jsp/itemList.jsp");
    		mav.setViewName("itemList"); //在springmvc.xml中替换掉默认的视图解析器
    
    		return mav;
    	}
  • 相关阅读:
    【漏洞分析】dedecms有前提前台任意用户密码修改
    关于t00ls的挂机脚本
    关于pocsuite的使用
    [代码审计]青云客Cms前台有条件注入至getshell,后台xss至getshell、至弹你一脸计算器
    警惕phpstudy等开发神器使用默认配置可能带来的危险
    [代码审计]DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入
    [代码审计]XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)
    对长短按设置不同反应 安卓
    如何数冲突域(collision domains)个数
    Computer Network Homework2’s hard question
  • 原文地址:https://www.cnblogs.com/zhaojiankai/p/8184526.html
Copyright © 2011-2022 走看看