• SpringMVC中的请求重定向和转发


    一.概述

    	当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重
    定向。而根据所要跳转的资源类型,又可分为两类:跳转到页面与跳转到其它处理器。
    	注意,对于请求转发的页面,可以是WEB-INF中页面;而重定向的页面,是不能为WEB-INF
    中页的。因为重定向相当于用户再次发出一次请求,而用户是不能直接访问 WEB-INF 中资
    源的。
    
    SpringMVC 框架把原来 Servlet 中的请求转发和重定向操作进行了封装。现在可以使用简单的方式实现转发和重定向。
    forward:表示转发,实现 request.getRequestDispatcher("xx.jsp").forward()
    redirect:表示重定向,实现 response.sendRedirect("xxx.jsp")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二.请求转发

    处理器方法返回 ModelAndView 时,需在 setViewName()指定的视图前添加 forward:,且
    此时的视图不再与视图解析器一同工作,这样可以在配置了解析器时指定不同位置的视图。
    视图页面必须写出相对于项目根的路径。forward 操作不需要视图解析器。
    处理器方法返回 String,在视图路径前面加入 forward: 视图完整路径。
    
    • 1
    • 2
    • 3
    • 4

    访问位于/WEB-INF/view/下的other.jsp文件

    index.jsp代码
    
    • 1
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%
        String path = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
    %>
    <html>
    <head>
        <title>主页</title>
        <base href="<%=path%>">
    </head>
    <body>
    <form action="some.do" method="post">
        姓名:<input type="text" name="name"><br>
        年龄:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    处理器方法代码
    
    • 1
    /**
         * 处理器方法返回ModelAndView:实现转发到其他的视图页面
         * 语法:setViewName("forward:视图的完整路径")
         * forward关键字的特点:不和视图解析器一同工作,就当项目中没有视图解析器
         * @param name
         * @param age
         * @return
         */
        @RequestMapping(value = "/some.do",method = RequestMethod.POST)
        public ModelAndView doSome(String name,Integer age){
            ModelAndView mv = new ModelAndView();
            mv.addObject("name",name);
            mv.addObject("age",age);
            mv.setViewName("redirect:/WEB-INF/view/other.jsp");
            return mv;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    other.jsp代码
    
    • 1
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    姓名:${name}
    年龄:${age}
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    启动服务器运行结果如下
    
    • 1

    在这里插入图片描述

    三.请求重定向

    在处理器方法返回的视图字符串的前面添加 redirect:,则可实现重定向跳转。
    重点:重定向对于用户来说发送了两次请求,因此重定向之前第一次存的参数,在第二次请求的时候无法直接获取
    需要利用jsp的param,具体如下

    在webapp目录下添加redirect.jsp
    
    • 1
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>重定向界面</title>
    </head>
    <body>
    姓名:${param.name}<br>
    -------------------------<br>
    年龄:${param.age}
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    修改处理器方法代码如下
    
    • 1
    /**
         * 处理器方法返回ModelAndView:实现重定向到其他的视图页面
         * 语法语法:setViewName("redirect:视图的完整路径"),不能使用逻辑视图名称
         * @param name
         * @param age
         * @return
         */
        @RequestMapping(value = "/some.do",method = RequestMethod.POST)
        public ModelAndView testRedirect(String name,Integer age){
            ModelAndView mv = new ModelAndView();
            mv.addObject("name",name);
            mv.addObject("age",age);
    //        mv.setViewName("forward:/WEB-INF/view/other.jsp");
            mv.setViewName("redirect:/redirect.jsp");
            return mv;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    运行结果如下
    
    • 1

    在这里插入图片描述

    如果想访问/WEB-INF/view下的other.jsp可以吗

    更改处理器方法如下

    /**
         * 处理器方法返回ModelAndView:实现重定向到其他的视图页面
         * 语法语法:setViewName("redirect:视图的完整路径"),不能使用逻辑视图名称
         * @param name
         * @param age
         * @return
         */
        @RequestMapping(value = "/some.do",method = RequestMethod.POST)
        public ModelAndView testRedirect(String name,Integer age){
            ModelAndView mv = new ModelAndView();
            mv.addObject("name",name);
            mv.addObject("age",age);
    //        mv.setViewName("forward:/WEB-INF/view/other.jsp");
            mv.setViewName("redirect:/WEB-INF/view/other.jsp");
            return mv;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    运行结果如下
    
    • 1

    在这里插入图片描述

    重申结论:redirect无法访问/WEB-INF/下的文件
    结束啦!如果对您有用,给个赞呗

  • 相关阅读:
    递归:一维链表和数组
    12.1.5 将查询结果插入另一个表中
    数据结构——散列表
    Java学习笔记(十五)
    多级缓存基础架构组件设计
    JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来3 —— 解析Ehcache的各种集群方案,本地缓存如何变身分布式缓存
    Redis 非关系型数据库学习(一) ---- Redis 的安装
    vue之混入(mixin)的详解
    如何正确的中断线程?你的姿势是否正确
    SpringBoot面试题6:Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
  • 原文地址:https://blog.csdn.net/qq_63524487/article/details/132917621