一、请求重定向和转发
SpringMVC框架把原来的Servlet中的请求转发和重定向操作进行了封装。现在可以使用简单的方式实现转发和重定向。
forward:表示转发,实现request.getRequestDispatcher(“xx.jsp”).forward()
redirect:表示重定向,实现response.sendRedirect(“xxx.jsp”)
1.1请求转发
处理器方法返回ModelAndView时,**需在setViewName()指定的视图前添加 forward:,且此时的视图不再与视图解析器一同工作,这样可以在配置了解析器时指定不同位置的视图。**视图页面必须写出相对于项目根的路径。forward操作不需要视图解析器。
处理器方法返回String,在视图路径前面加入forward:视图完整路径。
forward :表示转发
redirect :表示重定向
forward和redirect都是关键字,有一个共同的特点不和视图解析器一同工作
#1.1.1显示转发
打开项目:
编写jsp首页
<%--
Created by IntelliJ IDEA.
User: Hou
Date: 2021/8/2
Time: 21:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath = request.getScheme()+"://"+
request.getServerName()+":"+request.getServerPort()+
request.getContextPath()+"/";
%>
<html>
<head>
<title>功能入口</title>
<base href="<%=basePath%>"/>
</head>
<body>
<p>当处理器方法返回ModelAndView实现forward</p>
<form action="doForward.do" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
<input type="button" value="提交请求">
</form>
</body>
</html>
编写MyController.java文件
package com.hjs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
/*
* 处理器方法返回ModelAndView实现转发forward
* 语法:setViewName(forward:视图文件完整路径)
* forward特点:不和视图解析器一同使用,就当项目中没有视图解析器
* */
@RequestMapping(value = "/doForward.do")
public ModelAndView doSome(){
/*
* 处理some.do请求了。相当于service调用处理完成了。
* */
ModelAndView mv = new ModelAndView();
mv.addObject("msg","欢迎使用springmvc做web开发");
mv.addObject("fun","执行的是doSome方法");
mv.setViewName("forward:/WEB-INF/jsp/show.jsp");
return mv;
}
}
项目结构
当前项目存在springmvc.xml配置文件中存在视图解析器
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
运行项目得到此结果
以上我们使用的显示转发
如果我们项目中有视图解析器,但我们的页面没在WEB-INF目录之下 我需要使用显示转发,这样就可以不被视图解析器限制了。
#1.1.1重定向
在MyController中添加新的方法
/*
* 处理器方法返回ModelAndView,实现重定向redirect
* 语法:setViewName("redirect:路径")
* redirect特点:不和视图解析器同一使用,就当项目中没有视图解析器
* */
@RequestMapping(value = "/doRedirect.do")
public ModelAndView doWithRedirect(){
/*
* 处理some.do请求了。相当于service调用处理完成了。
* */
ModelAndView mv = new ModelAndView();
//数据放入到request作用域
mv.addObject("msg","欢迎使用springmvc做web开发");
mv.addObject("fun","执行的是doSome方法");
mv.setViewName("redirect:hello.jsp");
return mv;
}
index.jsp
<%--
Created by IntelliJ IDEA.
User: Hou
Date: 2021/8/2
Time: 21:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath = request.getScheme()+"://"+
request.getServerName()+":"+request.getServerPort()+
request.getContextPath()+"/";
%>
<html>
<head>
<title>功能入口</title>
<base href="<%=basePath%>"/>
</head>
<body>
<p>当处理器方法返回ModelAndView实现forward</p>
<form action="doForward.do" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
<input type="button" value="提交请求">
</form>
<p>当处理器方法返回ModelAndView实现forward</p>
<form action="doRedirect.do" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交请求">
</form>
</body>
</html>
hello.jsp中的代码
<%--
Created by IntelliJ IDEA.
User: Hou
Date: 2021/8/21
Time: 21:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>/WEB-INF/jsp/show.jsp从request作用域获取数据</h3>
<h3>msg数据:${msg}</h3>
<h3>fun数据:${fun}</h3>
</body>
</html>
运行项目显示不能获得数据
将Controller改为参数获取
/*
* 处理器方法返回ModelAndView,实现重定向redirect
* 语法:setViewName("redirect:路径")
* redirect特点:不和视图解析器同一使用,就当项目中没有视图解析器
* */
@RequestMapping(value = "/doRedirect.do")
public ModelAndView doWithRedirect(String name,Integer age){
/*
* 处理some.do请求了。相当于service调用处理完成了。
* */
ModelAndView mv = new ModelAndView();
//数据放入到request作用域
mv.addObject("myname",name);
mv.addObject("myage",age);
mv.setViewName("redirect:hello.jsp");
return mv;
}
将hello.jsp中的内容改为
<%--
Created by IntelliJ IDEA.
User: Hou
Date: 2021/8/21
Time: 21:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>/WEB-INF/jsp/show.jsp从request作用域获取数据</h3>
<h3>myname数据:${param.myname}</h3>
<h3>myage数据:${param.myage}</h3>
<h3>取参数数据:<%=request.getParameter("myname")%></h3>
</body>
</html>
param代表参数集合 在目标hello.jsp页面可以使用参数集合对象${param}获取请求参数值 ${param.myname}
验证定向到redirect:/WEB-INF/jsp/show.jsp中
@RequestMapping(value = "/doRedirect.do")
public ModelAndView doWithRedirect(String name,Integer age){
/*
* 处理some.do请求了。相当于service调用处理完成了。
* */
ModelAndView mv = new ModelAndView();
//数据放入到request作用域
mv.addObject("myname",name);
mv.addObject("myage",age);
mv.setViewName("redirect:/WEB-INF/jsp/show.jsp");
// http://localhost:8080/ssm03_war/hello.jsp?myname=lisi&myage=324
return mv;
}
**
#处理器方法返回ModelAndView,实现重定向redirect
语法:setViewName(“redirect:路径”)
redirect特点:不和视图解析器同一使用,就当项目中没有视图解析器
框架对重定向的操作:
1.框架会把Model中的简单类型的数据,转为String使用, 作为hello.jsp和get请求参数使用 目的是在doRedirect.do 和hello.jsp两次请求之间传递数据
2.在目标hello.jsp页面可以使用参数集合对象${param}获取请求参数值 ${param.myname}
3.重定向不能访问/WEB/INF资源