技术标签: # Spring MVC spring java maven ssm框架 mvc
目录
在系统当中, Dao、Service、Controller层代码出现都可能抛出异常。如果哪里产生异常就在哪里处理,则会降低开发效率。所以一般情况下我们会让异常向上抛出,最终到达DispatcherServlet中,此时SpringMVC提供了异常处理器进行异常处理,这样可以提高开发效率
处理单个Controller的异常:
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
// 处理单个Controller异常
@RequestMapping("/t1")
public String t1(){
String str = null;
// str.length();
// int flag = 1/0;
int []arr = new int[1];
arr[2] = 10;
return "index";
}
/**
* 异常处理方法
* @param ex 异常对象
* @param model 模型对象
* @return
*/
// 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
public String exceptionHandler1(Exception ex, Model model){
// 向模型中添加异常对象
model.addAttribute("msg",ex);
// 跳转到异常页面
return "error";
}
// 方法一不能处理的异常交给方法二处理
@ExceptionHandler({java.lang.Exception.class})
public String exceptionHandler2(Exception ex,Model model){
model.addAttribute("msg",ex);
return "error2";
}
}
从控制器方法我们可以知道,如果出现算术错误类的话则返回错误页面1,否则都返回给错误页面2.。并且把错误信息传到前端。
这里编写两个错误页面,为了是测试控制器是否成功知道出现的是哪一个错误。
错误页面1
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>出错了!</title>
</head>
<body>
<h3>ERROR 发生异常! ${msg}</h3>
</body>
</html>
严重错误页面2
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>出错了!</title>
</head>
<body>
<h3>ERROR2 发生严重异常! ${msg}</h3>
</body>
</html>
OK,这里测试运行一下,上面的应该返回的是错误页面2,因为出现的错误是数组越界访问。
OK,我们再换一个错误,注释掉以下几行,再重新运行一遍是否跳到错误页面1,因为这里出现的算术错误。
OK,可以看到这里确实返回错误页面1出来了
在控制器中定义异常处理方法只能处理该控制器类的异常,要想处理所有控制器的异常,需要定义全局异常处理类。如何体现这个全局异常处理呢,我们需要新建一个异常类,一个全局异常处理类,错误页面就按照上面两个即可。
这里就用一个数组越界的错误类。
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// 编写另一个有异常的控制器类
@Controller
public class MyController2 {
@RequestMapping("/t2")
public String t1(){
String str = null;
// str.length();
// int flag = 1/0;
int []arr = new int[1];
arr[2] = 10;
return "index";
}
}
从控制器方法我们可以知道,如果出现算术错误类的话则返回错误页面1,否则都返回给错误页面2.。并且把错误信息传到前端。
package com.example.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
// 全局异常处理类:添加@ControllerAdvice
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 异常处理方法
* @param ex 异常对象
* @param model 模型对象
* @return
*/
// 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
public String exceptionHandler1(Exception ex, Model model){
// 向模型中添加异常对象
model.addAttribute("msg",ex);
// 跳转到异常页面
return "error";
}
// 方法一不能处理的异常交给方法二处理
@ExceptionHandler({java.lang.Exception.class})
public String exceptionHandler2(Exception ex,Model model){
model.addAttribute("msg",ex);
return "error2";
}
}
OK,访问路径:http://localhost:8080/t2
OK,确实和我们预料的一样,全局异常处理类发挥了作用。
以上方式都是使用的SpringMVC自带的异常处理器进行异常处理,我们还可以自定义异常处理器处理异常:
package com.example.controller;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 自定义异常处理器实现HandlerExceptionResolver接口,并放入Spring容器中
@Component
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if(e instanceof NullPointerException){
modelAndView.setViewName("error");
}
else {
modelAndView.setViewName("error2");
System.out.println("我自己的异常处理器");
}
modelAndView.addObject("msg",e);
return modelAndView;
}
}
OK,为了体现自定义的异常处理器,我把全局异常处理器删除再重新启动服务器,访问上面那个有异常控制类。可以看到自定义异常处理类发挥了作用。
大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。
Maven系列专栏 | Maven工程开发 |
Maven聚合开发【实例详解---5555字】 |
文章浏览阅读5.6k次,点赞2次,收藏5次。函数被多次定义的问题总是一直困扰着我,每次都耗费我大量的时间和精力去处理,实在令我头疼解决办法:编写一个头文件(里面放置你的一些函数和变量的声明),在你的.cpp文件中#include “XX.h”这样使得你的工程能通过编译,最后编译器在XX.h寻找其中函数定义时,会去每个文件中查找相关的函数定义。出现问题的原因另外函数重定义的原因是,在多个文件中直接包含了有同一个函数定义的文件,这样链接的时候就会出问题,就会报告多个函数定义,原因不用我细说也懂..._被多次定义
文章浏览阅读1.9w次,点赞87次,收藏439次。项目介绍1、为什么要做这样一个项目?2、介绍下你的项目_webserver面试
文章浏览阅读6.8k次。AndroidXAndroidX 是对 android.support.xxx 包的整理后产物。由于之前的 support 包过于混乱,所以,Google 推出了AndroidX。在后续版本中,会逐步放弃对 support 的升级和维护,所以,我们必须迁移到 AndroidX 。如何迁移到AndroidX在 AndroidStudio 3.2 或更高版本(截图中 AndroidStudio..._androidx.jar
文章浏览阅读541次,点赞22次,收藏16次。最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
文章浏览阅读10w+次,点赞762次,收藏4.7k次。到微软官网下载SQL Server Developer版本,现在的最新版本是SQL Server 2019 Developer。微软官网传送门:点击此处直达下载完成之后,在文件夹中找到刚才下载的文件,双击打开,打开之后的界面如下图所示。我们选择自定义安装,之后再选择要安装的位置,再点击安装,如下图所示点了安装之后会出现如下图所示的界面,我们需要等待它下载安装包,此过程等待的时间可能较长..._sqlserver在哪里写sql语句
文章浏览阅读1k次。var appName = navigator.appName; //浏览器的正式名称 var appVersion = navigator.appVersion; //浏览器的版本号 var cookieEnabled = navigator.cookieEnabled; // 返回用户浏览器是否启用了..._浏览器获取客户端基本信息
文章浏览阅读2.5k次。问题描述在以jpa的方式访问oracle数据库时发现关联表的数据查询不到解决方法大体意思是:hibernate的懒加载出现异常,由于seesion被释放了。自己调试了发现是在找下一级关系的时候,无法找到目标实体类导致的。网上找过一些方法都是让你把hibernate实体映射的由fetch=FetchType.LAZY改为这种FetchType.EAGER但是也是无补于事。看到stackoverflow上一个解决方案在service层的方法添加@Transactional开启事务,最后完美解决了_unable to evaluate the expression method threw 'org.hibernate.lazyinitializa
文章浏览阅读9k次,点赞2次,收藏31次。**一、css3新增边框属性**1、css3新增属性之border-color:为边框设置多种颜色p {border-style:solid;border-color:#ff0000 #0000ff;} 需要注意:“border-width” 属性如果单独使用的话是不会起作用的。请首先使用 “border-style” 属性来设置边框。2、css3新增属性之border-image:图片边框div {-webkit-border-image:url(border.png) 30 30 r_css3新增属性
文章浏览阅读1.6w次。An unknown error occurred during solution. Check the Solver Output on the Solution Information object for possible causes._an unknown error occurred during solution. check the solver output on the so
文章浏览阅读1.8k次。VUE项目里配置eslint lessless安装 less 和less-loader ,npm install less less-loader --save**修改webpack.base.config.js文件,配置loader加载依赖,让其支持外部的less,在原来的代码上添加 // 此种方法在控制台中标签样式显示的是style标签样式{ test: /\.less$/, loader: "style-loader!css-loader!less-loader",}_eslint less
文章浏览阅读1.4w次,点赞27次,收藏21次。大家好,我是Leo哥,上一节我们通过源码剖析以及图文分析,了解了关于委派筛选器代理和过滤器链代理的原理和作用。这节课我们接着学习SpringSecurity的过滤器,了解SpringSecurity中都有哪些核心过滤器。好了,话不多说让我们开始吧。以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。
文章浏览阅读128次。面试 一般会叫你填两个表 1个是你的详细信息表 1个是面试题答卷 两个都要注意反正面是否都有内容不要遗漏,如果考你机试一般也有两种,就是程序连接数据库或一些基本的算法(二分查找,递归等),公司一般都是测试你的基本功是否扎实,如果你基本功好就游刃有余不必紧张! asp.net面试题 1.new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX()..._.net面试机试题