SpringMVC中的请求重定向和转发

一.概述

复制代码
	当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重
定向。而根据所要跳转的资源类型,又可分为两类:跳转到页面与跳转到其它处理器。
	注意,对于请求转发的页面,可以是WEB-INF中页面;而重定向的页面,是不能为WEB-INF
中页的。因为重定向相当于用户再次发出一次请求,而用户是不能直接访问 WEB-INF 中资
源的。

SpringMVC 框架把原来 Servlet 中的请求转发和重定向操作进行了封装。现在可以使用简单的方式实现转发和重定向。
forward:表示转发,实现 request.getRequestDispatcher("xx.jsp").forward()
redirect:表示重定向,实现 response.sendRedirect("xxx.jsp")

二.请求转发

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

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

复制代码
index.jsp代码
java 复制代码
<%@ 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>
复制代码
处理器方法代码
java 复制代码
/**
     * 处理器方法返回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;
    }
复制代码
other.jsp代码
java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
姓名:${name}
年龄:${age}
</body>
</html>
复制代码
启动服务器运行结果如下

三.请求重定向

在处理器方法返回的视图字符串的前面添加 redirect:,则可实现重定向跳转。

重点:重定向对于用户来说发送了两次请求,因此重定向之前第一次存的参数,在第二次请求的时候无法直接获取

需要利用jsp的param,具体如下

复制代码
在webapp目录下添加redirect.jsp
java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>重定向界面</title>
</head>
<body>
姓名:${param.name}<br>
-------------------------<br>
年龄:${param.age}
</body>
</html>
复制代码
修改处理器方法代码如下
java 复制代码
/**
     * 处理器方法返回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;
    }
复制代码
运行结果如下

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

更改处理器方法如下

java 复制代码
/**
     * 处理器方法返回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;
    }
复制代码
运行结果如下

重申结论:redirect无法访问/WEB-INF/下的文件

结束啦!如果对您有用,给个赞呗

相关推荐
Otaku love travel38 分钟前
老系统改造增加初始化,自动化数据源配置(tomcat+jsp+springmvc)
java·tomcat·初始化·动态数据源
DKPT1 小时前
Java设计模式之行为型模式(责任链模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
L_autinue_Star1 小时前
手写vector容器:C++模板实战指南(从0到1掌握泛型编程)
java·c语言·开发语言·c++·学习·stl
晨岳1 小时前
CentOS 安装 JDK+ NGINX+ Tomcat + Redis + MySQL搭建项目环境
java·redis·mysql·nginx·centos·tomcat
执笔诉情殇〆1 小时前
前后端分离(java) 和 Nginx在服务器上的完整部署方案(redis、minio)
java·服务器·redis·nginx·minio
元气小嘉1 小时前
前端技术小结
开发语言·前端·javascript·vue.js·人工智能
YuTaoShao2 小时前
【LeetCode 热题 100】24. 两两交换链表中的节点——(解法一)迭代+哨兵
java·算法·leetcode·链表
励志的大鹰哥2 小时前
V少JS基础班之第七弹
开发语言·javascript·ecmascript
程序员的世界你不懂2 小时前
(20)Java+Playwright自动化测试- 操作鼠标拖拽 - 上篇
java·python·计算机外设
AI360labs_atyun2 小时前
Java在AI时代的演进与应用:一个务实的视角
java·开发语言·人工智能·科技·学习·ai