SpringMVC---转发与重定向、异常处理

转发与重定向

不仅Servlet存在转发与重定向,SpringMVC中也存在转发与重定向。一张图来解释他们的区别:

那么如何使用呢?

转发:

在使用ModelAndView时,默认情况下是转发,也可以显式的设置转发与重定向

demo:

 转发到jsp界面

/**
     * 转发到jsp界面
     * @return
     */
    @RequestMapping("/forward1.do")
    public ModelAndView handle1(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("type","转发的界面");
        mv.setViewName("result");
        return  mv;
    }

结果:

转发到另外的controller,用另外的controller处理这个请求

/**
     *转发到另外的controller
     * @return
     */
    @RequestMapping("/forward2.do")
    public ModelAndView handle(){
        ModelAndView mv = new ModelAndView();
        //当手动显示转发时   配置文件的使徒解析器会失效
        mv.setViewName("forward:other.do");
        return mv;
    }

另外的controller:

@RequestMapping("/other.do")
    public ModelAndView handle1(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("type","跳转到另外的controller发送的信息");
        mv.setViewName("result");
        return mv;
    }

结果:

这样返回给前端的数据就是不一样的。

重定向:

如果要实现重定向,则需在setViewName()指定的视图前添加redirect:,此时springmvc.xml文件中配置的视图解析器将会失效,即需要在setViewName中写上jsp相对于项目根的路径。重定向的方式在request域中的数据会失效,此时可以通过ModelAndView来传递数据,但是只能传递基本数据类型和String类型,因为spring mvc会将传递的数据以请求参数的方式放到url的后面,此时任何数据类型都会被转换为普通的字符串。另外,我们在jsp中取值的时候需要使用 EL 表达式中的请求参数param读取 。

demo:

/**
     * 重定向到jsp界面
     * @return
     */
    @RequestMapping("/redirect1.do")
    public ModelAndView handle2(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("type","重定向的结果");
        mv.setViewName("redirect:/result.jsp");
        return mv;
    }

jsp:

<%--
  Created by IntelliJ IDEA.
  User: yzg
  Date: 2019/11/28
  Time: 19:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

<h1>测试重定向问题</h1>
<h2>${param.type}</h2>
</body>
</html>

结果:

注意点:

重定向的jsp界面不能是WEB-INF下的

在jsp页面获取参数时,使用param.type才能获得 

转发和重定向的问题就解决了!

SpringMVC的异常处理方式

 

  • 使用spring mvc中的异常处理器 SimpleMappingExceptionResolver
  • 使用自定义异常处理器
  • 使用异常处理注解

 最好还是使用第二种方法:

倘若我们要在项目中捕获特定的异常,然后再根据捕获的异常做一些操作的时候,按照以前的写法,我们需要在每次捕获异常之后或者抛出之前进行操作,这段代码就会重复的出现在很多类里面,导致代码冗余,此时,我们可以通过自定义异常处理器来解决。
自定义异常处理器,需要实现org.springframework.web.servlet.HandlerExceptionResolver接口,并且该类需要在Springmvc.xml
配置文件中进行注册。

首先来自定义一个异常实现HandlerExceptionResolver接口,只要有异常发生,都会自动执行接口方法resolveException()。

 

public class MyExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("ex", ex);

        //设置默认异常处理页面
        mv.setViewName("error/error");

        //判断ex是否是MyException
        if (ex instanceof MyException) {
            //可以在这里面编写捕获到该异常之后的操作

            //设置跳转页面
            mv.setViewName("error/MyError");
        }

        return mv;
    }
}

在springmvc.xml中配置之后,就可以使用这个异常处理了,以后只要系统发生了异常就会执行resolveException方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值