请选择 进入手机版 | 继续访问电脑版

[java] Java SpringMVC 非常 处理SimpleMappingExceptionResolver类详解

[复制链接]
查看110 | 回复19 | 2021-9-13 02:59:24 | 显示全部楼层 |阅读模式

Spring3.0 对非常 的处理方式统共 有两种:

一种是利用 HandlerExceptionResolver 接口,并且 Spring 已经提供默认的实现类 SimpleMappingExceptionResolver。

第二种方法是在 Controller 内部实现,机动 性更高。

从现在 的调查结果 来看,这两种方式不能共存。我们一样寻常 在项目中利用 第一种方法。

下面分别形貌 一下这两种利用 方式:

一、基于 HandlerExceptionResolver 接口的方式

利用 这种方式只必要 实现 resolveException 方法,该方法返回一个 ModelAndView 对象,在方法内部对非常 的范例 举行 判断 ,然后返回合适的 ModelAndView 对象,假如 该方法返回了 null,则 Spring 会继续探求 其他的实现了 HandlerExceptionResolver 接口的 Bean。换句话说,Spring 会搜索 全部 注册在其环境中的实现了 HandlerExceptionResolver 接口的 Bean,逐个实行 ,直到返回了一个 ModelAndView 对象。

  1. public class CustomExceptionHandler implements HandlerExceptionResolver {
  2. @Override
  3. public ModelAndView resolveException(HttpServletRequest request,
  4. HttpServletResponse response, Object object, Exception exception) {
  5. if(exception instanceof IOException){
  6. return new ModelAndView("ioexp");
  7. }else if(exception instanceof SQLException){
  8. return new ModelAndView("sqlexp");
  9. }
  10. return null;
  11. }
  12. }
复制代码

这个类必须声明到 Spring 设置 文件中,或者利用 @Component 标签,让 Spring 管理它。同时 Spring 也提供默认的实现类 SimpleMappingExceptionResolver,必要 利用 时只必要 利用 注入到 Spring 设置 文件举行 声明即可。自定义实现类与默认的实现类,可同时利用 。

示比方 下:

  1. <!-- 自定义的实现类 --><bean id="exceptionHandler" class="com.enh.test.CustomExceptionHandler"/><!-- 默认的实现类注入 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  2. <!-- 为所有的异常定义默认的异常处理页面,exceptionMappings未定义的异常使用本默认配置 -->
  3. <property name="defaultErrorView" value="error"></property>
  4. <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
  5. <property name="exceptionAttribute" value="ex"></property>
  6. <!--     定义需要特殊处理的异常,用类名或完全路径名作为key,异常页文件名作为值,    将不同的异常映射到不同的页面上。   -->
  7. <property name="exceptionMappings">
  8. <props>
  9. <prop key="IOException">error/ioexp</prop>
  10. <prop key="java.sql.SQLException">error/sqlexp</prop>
  11. </props>
  12. </property>
  13. </bean>
复制代码

一个典型的非常 表现 界面如下:

  1. <html>
  2. <head><title>Exception!</title></head>
  3. <body>
  4.   <% Exception ex = (Exception)request.getAttribute("exception"); %>
  5.   <H2>Exception: <%= ex.getMessage();%></H2>
  6.   <P/>
  7.   <% ex.printStackTrace(new java.io.PrintWriter(out)); %>
  8. </body>
  9. </html>
复制代码

exception 是在 SimpleMappingExceptionResolver 被存放到 request 中的,详细 可以查看源代码。

别的 这里设置 的非常 表现 界面均仅包括主文件名,至于文件路径和后缀已经在 viewResolver 中指定。假如 找不到页面,会根据错误提示再调整页面路径。

二、Controller 内部单独实现

该方法必要 定义在 Controller 内部,然后创建一个方法并用 @ExceptionHandler 注解来修饰用来处理非常 ,这个方法基本和 @RequestMapping 修饰的方法差不多,只是可以多一个范例 为 Exception 的参数,@ExceptionHandler 中可以添加一个或多个非常 的范例 ,假如 为空的话则以为 可以触发全部 的非常 范例 错误。

  1. @Controller
  2. public class ExceptionHandlerController {
  3. @ExceptionHandler(value={IOException.class,SQLException.class})
  4. public String exp(Exception ex,HttpServletRequest request) {
  5. request.setAttribute("ex", ex);
  6. return "/error.jsp";
  7. }
  8. }
复制代码

三、相干 标题

HandlerExceptionResolver 和 web.xml 中设置 的 error-page 会有冲突吗?

web.xml 中设置 error-page 同样是设置 出现错误时表现 的页面:

  1. <error-page>
  2. <error-code>500</error-code>
  3. <location>/500.jsp</location>
  4. </error-page>
复制代码

假如 resolveException 返回了 ModelAndView,会优先根据返回值中的页面来表现 。不过,resolveException 可以返回 null,此时则展示 web.xml 中的 error-page 的500状态码设置 的页面。

API 文档中对返回值的表明 :

  1. return a corresponding ModelAndView to forward to, or null for default processing.
复制代码

到此这篇关于SpringMVC 非常 处理SimpleMappingExceptionResolver类详解的文章就先容 到这了,更多相干 SpringMVC 非常 处理SimpleMappingExceptionResolver类内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar poney | 2021-9-22 09:54:31 | 显示全部楼层
我和我的小伙伴都惊呆了!
回复

使用道具 举报

avatar 圣道 | 2021-9-27 13:25:48 | 显示全部楼层
admin楼主内心很强大!
回复

使用道具 举报

avatar wb47 | 2021-9-28 00:13:43 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

avatar 未注册的粽子邑 | 2021-10-1 22:01:51 | 显示全部楼层
精华帖的节奏啊!
回复

使用道具 举报

avatar fys24680 | 2021-10-10 06:02:16 | 显示全部楼层
我默默的回帖,从不声张!
回复

使用道具 举报

avatar WY20172017 | 2021-10-10 14:47:27 | 显示全部楼层
大神好强大!
回复

使用道具 举报

avatar 阳子1989 | 2021-10-14 00:07:30 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,影视频道的网站所有电影和连续剧都可以免费看的。访问地址:http://tv.mxswl.com
回复

使用道具 举报

avatar 后会无期846 | 2021-10-14 01:13:37 | 显示全部楼层
坚持回帖!
回复

使用道具 举报

avatar 天蝎孤星等 | 2021-10-15 20:41:57 | 显示全部楼层
我回帖admin楼主给加积分吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则