请求转发与请求重定向

空~2022年11月8日
  • note
大约 3 分钟

请求转发与请求重定向

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;
}

路径问题

绝对路径与相对路径的区分:

绝对路径为前面加上了 “/” 的路径,而相对路径则前面没有加上 “/”。

转发与重定向中的具体讨论:

转发:转发当中使用带 “/” 的绝对路径时,表示的是当前 web 应用的根目录再加上传入的目录,因为转发是在服务器内部进行的,写绝对路径 / 开头指的是当前的 Web 应用程序

假设当前的 web 应用目录为 http://localhost:8080/web-appopen in new window 执行 req.getRequestDispatcher("/login.jsp") 则这个时候转到的目录为 http://localhost:8080/web-app/login.jspopen in new window

而当转发中使用的是不带 “/” 的相对路径的时候,表示的是当前的路径再加上传入的路径

假如当前的路径为 http://localhost:8080/web-app/abcopen in new window 执行 req.getRequestDispatcher("login.jsp") 则这个时候转到的目录为 http://localhost:8080/web-app/abc/login.jspopen in new window

重定向:重定向中使用带 “/” 的绝对路径时,表示的是当前服务器的根目录再加上传入的目录!

假设当前的 web 应用目录为 http://localhost:8080/web-appopen in new window 执行 res.sendRedirect("/login.jsp") 则这个时候转到的目录为 http://localhost:8080/login.jspopen in new window

而当转发中使用的是不带 “/” 的相对路径的时候,表示的是当前的路径再加上传入的路径 (和转发的时候一样)

假如当前的路径为 http://localhost:8080/web-app/abcopen in new window 执行 req.getRequestDispatcher("login.jsp") 则这个时候转到的目录为 http://localhost:8080/web-app/abc/login.jspopen in new window

绝对路径中的 “/” 代表的不同情况下的不同意思的再总结

“/” 代表站点路径 即 http://localhost:8080open in new window 的情况

  1. 超链接的时候
  2. action 表单提交的时候
  3. 请求重定向的时候

“/” 代表的时 web 应用的根目录

http://localhost:8080/Contextopen in new window 的情况(可利用 request.getContext(), 或者 application.getContext() 来获取)

  1. 请求转发的时候
  2. 在 web.xml 文件中进行配置的时候,例如 URL 的配置的时候