SpringMVC中使用forward和redirect进行转发和重定向以及重定向时如何传参详解
转自:http://blog.51cto.com/983836259/1877188
如题所示,在SpringMVC中可以使用forward和redirect关键字在Controller中对原请求进行转发或重定向到其他的Controller。比如可以这样使用:
package cn.zifangsky.controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView; import cn.zifangsky.model.User; @Controller
public class TestController { @RequestMapping("/user/index.html")
public ModelAndView userIndex() {
return new ModelAndView("user/index");
} @RequestMapping("/testForward.html")
public ModelAndView testForward(@RequestParam("username") String username){
ModelAndView mAndView = new ModelAndView("forward:/user/index.html"); User user = new User();
user.setName(username);
mAndView.addObject("user", user); return mAndView;
} @RequestMapping("/testRedirect.html")
public ModelAndView testRedirect(@RequestParam("username") String username){
ModelAndView mAndView = new ModelAndView("redirect:/user/index.html"); User user = new User();
user.setName(username);
mAndView.addObject("user", user); return mAndView;
}
}
然后项目启动后,在浏览器中访问:http://localhost:9180/CookieDemo/testForward.html?username=forward
页面显示效果如下:

可以看出,在使用forward进行转发时请求的URL链接是不会改变的
接着,在浏览器中访问:http://localhost:9180/CookieDemo/testRedirect.html?username=redirect
页面显示效果如下:

可以看出,在使用redirect进行重定向时请求的URL链接发生了改变,并且在controller中放置的参数并没有传递进行。那么,如果想要在重定向时把参数也传递过去应该怎么做呢?
方法一:常规做法,重定向之前把参数放进Session中,在重定向之后的controller中把参数从Session中取出并放进ModelAndView
示例代码如下:
@RequestMapping("/user/index.html")
public ModelAndView userIndex(HttpServletRequest request) {
ModelAndView mAndView = new ModelAndView("user/index");
HttpSession session = request.getSession();
mAndView.addObject("user", session.getAttribute("user"));
session.removeAttribute("user");
return mAndView;
}
@RequestMapping("/testRedirect.html")
public ModelAndView testRedirect(@RequestParam("username") String username,HttpServletRequest request){
ModelAndView mAndView = new ModelAndView("redirect:/user/index.html");
User user = new User();
user.setName(username);
request.getSession().setAttribute("user", user);
return mAndView;
}
方法二:使用RedirectAttributes类
示例代码如下:
@RequestMapping("/user/index.html")
public ModelAndView userIndex() {
return new ModelAndView("user/index");
}
@RequestMapping("/testRedirect.html")
public ModelAndView testRedirect(@RequestParam("username") String username,RedirectAttributes redirectAttributes){
ModelAndView mAndView = new ModelAndView("redirect:/user/index.html");
User user = new User();
user.setName(username);
// redirectAttributes.addAttribute("user", user); //URL后面拼接参数
redirectAttributes.addFlashAttribute("user", user);
return mAndView;
}
使用RedirectAttributes这个类来传递参数写法就很简单了,只需要在需要重定向的controller的方法参数中添加RedirectAttributes类型的参数,然后把需要重定向之后也能够获取的参数放进去即可
当然,据说RedirectAttributes本质上也是通过Session来实现的(PS:相关源代码我没看过,只能据说了)。实际上上面的代码是省略的写法,因为重定向之后就直接返回页面视图了,如果经过几次重定向的话估计上面那种写法就获取不到参数了,因此关于获取参数一般还有以下两种方式:
(1)使用@ModelAttribute注解获取参数:
@RequestMapping("/user/index.html")
public ModelAndView userIndex(@ModelAttribute("user") User user) {
ModelAndView mAndView = new ModelAndView("user/index");
mAndView.addObject("user", user);
return mAndView;
}
(2)使用RequestContextUtils类来获取:
@RequestMapping("/user/index.html")
public ModelAndView userIndex(HttpServletRequest request) {
ModelAndView mAndView = new ModelAndView("user/index");
Map<String, Object> map = (Map<String, Object>) RequestContextUtils.getInputFlashMap(request);
User user = (User) map.get("user");
mAndView.addObject("user", user);
return mAndView;
}
总结,这两种获取方式都可以成功获取到参数。但是还是略显麻烦,如果只是一次重定向之后就返回页面视图的话推荐使用最简单那种写法
SpringMVC中使用forward和redirect进行转发和重定向以及重定向时如何传参详解的更多相关文章
- Java中对象、对象引用、堆、栈、值传递以及引用传递的详解
Java中对象.对象引用.堆.栈.值传递以及引用传递的详解 1.对象和对象引用的差别: (1).对象: 万物皆对象.对象是类的实例. 在Java中new是用来在堆上创建对象用的. 一个对象能够被多个引 ...
- SpringMVC视图解析中的 forward: 与 redirect: 前缀
在 SpringMVC 中,可以指定画面的跳转方式.使用 forward: 前缀实现请求转发跳转,使用 redirect: 前缀实现重定向跳转.有前缀的转发和重定向操作和配置的视图解析器没有关系,视图 ...
- SpringMvc(4-1)Spring MVC 中的 forward 和 redirect
Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染.通过配置,我们配置某个 ViewResolver 如下: <b ...
- SpringMvc(4-1)Spring MVC 中的 forward 和 redirect(转)
Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染.通过配置,我们配置某个 ViewResolver 如下: <b ...
- Spring MVC 中的 forward 和 redirect
Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染.假设逻辑视图名为 hello,通过配置,我们配置某个 ViewRes ...
- jsp中jsp:forward 与 redirect区别
部分转载:http://hi.baidu.com/168zlf/item/2f4b2ad4351b881c20e2500c 在网上看到一些帖子,总结了一些区别,可以从以下几个方面来看: 1.从地址栏显 ...
- c++中的构造(包括移动),赋值(包括移动),析构详解
这五种操作:构造(包括移动),赋值(包括移动),析构其实就是定义了对一个对象进行构造,赋值,析构时的行为.理解这些行为并不复杂,复杂的是理解在继承下这些行为的表现.需要注意的是他们并不会被继承(传统意 ...
- servlet中的forward()和redirect()
从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器 浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏 ...
- jsp中的forward和redirect的区别
转自http://blog.163.com/tsing_hua/blog/static/139622224201101110836644/ 一.调用方式 我们知道,在servlet中调用转发.重定向的 ...
随机推荐
- <转载>Win x86-64 - Download & execute (Generator)
#Title: Obfuscated Shellcode Windows x86/x64 Download And Execute [Use PowerShell] - Generator #leng ...
- VC读取文件内容
// chopper.cpp : Defines the entry point for the console application. // #include "stdafx.h&quo ...
- LightOJ 1245 数学
Harmonic Number (II) Description I was trying to solve problem '1234 - Harmonic Number', I wrote the ...
- jsp实现浏览器全屏
在web系统中实现按钮控制浏览器全屏. <!DOCTYPE html> <%@ page contentType="text/html;charset=UTF-8" ...
- ActionContext实现原理
StrutsPrepareAndExecuteFilter [http://www.tuicool.com/articles/NVNbYn] struts2 和 struts1 的一个重要区别就是它进 ...
- C++中++i与i++
#include "stdafx.h" #include "string" #include "iostream" #include &qu ...
- javascript ArrayBuffer类型化数组和视图的操作
个人理解类型化数据就是内存分配区域,不同数据的存储就是视图DataView咯 var buffers = []; var json = {"id":100, "name& ...
- java重置Timer执行频率
public class BallUtil { public static Timer fisTimer ; public static void fisStartBall(){ long first ...
- Java企业微信开发_15_查询企业微信域名对应的所有ip
一.前言 二.方法 1.在线网站 百度搜索"域名查IP",可查到如下网站,输入域名即可查到所有IP: 站长工具 site.ip138.com tools.ipip.net 2.li ...
- 2018.7.26 学会说NO,拒绝道德绑架。
一.领导交给你一项不属于你工作范围的工作,是否需要拒绝,你可以考虑以下问题: 1.这是与我核心能力相关的工作吗?是,接受:否,进入下一条: 2.它能帮助我拓展我核心能力的边界,或是我感兴趣的吗?是,接 ...