8. 请求重定向和转发

空~2022年9月15日
  • SpringMVC
大约 1 分钟

8. 请求重定向和转发

forward: 表示转发

redirect: 表示重定向

forward 和 redirect 都是关键字, 有一个共同的特点不和视图解析器一同工作

相关信息

forward 和 redirect 他们都可以访问视图文件, 比如某个 jsp, html

forward:/hello.jsp forward:/main.html

forward 和 redirect 他们都可以访问其它的 controller

forward:/some.do , redirect:/other.do

处理器方法可以返回 ModelAndView, String, void 时, 都可以使用 forward, redirect

请求转发

处理器方法返回 ModelAndView,实现转发 forward

语法: setViewName("forward:视图文件完整路径")

forward 特点: 不和视图解析器一同使用, 无视视图解析器

@Controller
public class MyController {
    @RequestMapping(value = "/doForward.do")
    public ModelAndView doSome(){
        ModelAndView mv  = new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc做web开发");
        mv.addObject("fun","执行的是doSome方法");
        //显示转发
        //mv.setViewName("forward:/WEB-INF/view/show.jsp");

        mv.setViewName("forward:/hello.jsp");
        return mv;
    }

请求重定向

语法: setViewName("redirect:视图完整路径")

redirect 特点: 不和视图解析器一同使用, 无视视图解析器

框架对重定向的操作:

  1. 框架会把 Model 中的简单类型的数据, 转为 string 作为 hello.jsp 的 get 请求参数使用

    目的是在 doRedirect.do 和 hello.jsp 两次请求之间传递数据

  2. 在目标 hello.jsp 页面可以使用参数集合对象${param}获取请求参数值

    ${param.myname}

提示

重定向不能访问/WEB-INF 资源

@RequestMapping(value = "/doRedirect.do")
public ModelAndView doWithRedirect(String name,Integer age){
    ModelAndView mv = new ModelAndView();
    //数据放入到 request作用域
    mv.addObject("myname",name);
    mv.addObject("myage",age);
    // 重定向
    mv.setViewName("redirect:/hello.jsp");
    // http://localhost:8080/ch08_forard_redirect/hello.jsp?myname=lisi&myage=22

    // 重定向不能访问/WEB-INF资源
    // mv.setViewName("redirect:/WEB-INF/view/show.jsp");
    return mv;
}