文档章节

Controller 之间的跳转

七弦桐
 七弦桐
发布于 01/05 23:34
字数 743
阅读 23
收藏 4

在开发中,有时会遇到 controller 之间跳转的情况,而且有时在跳转的时候需要把不同的参数传递过去,比如从controller a跳转到controller b,再从controller b到前端页面,并且把controller a里的数据比如StringListMap或者对象传递到页面,等等类似情况。结合查找网上的资料以及自己的试验,现总结如下。

注: 本文实例均在springmvc框架下,其他架构自行调整。


一、跳转方式

1. forward

使用返回 String 的方式: return "forward:Xxx.action";

@RequestMapping("/index")
public String logout(ModelMap model, RedirectAttributes attr) {
	return "forward:test.action";
}

如果使用ModelAndView方式: return new ModelAndView("forward:/tolist");

:此后,都以返回String的方式来叙述。

2. redirect

@RequestMapping("/index")
public String logout(ModelMap model, RedirectAttributes attr) {
	return "redirect:test.action";
}

3. forward 和 redirect 比较

**forward**是请求转发,是服务器端行为,相当于一次请求,地址栏的 URL 不会改变。 **redirect**是请求重定向,是客户端行为,相当于两次请求,地址栏的 URL 会改变。

二、跳转时数据的传递

1. 方式一:手动拼接 URL

return "redirect:/login.action?name="+ name;

login.action:

@RequestMapping("/login")
	public String login(HttpServletRequest request, ModelMap model, RedirectAttributes attr ) {
       String name = request.getParameter("name");
	   model.addAttribute("name",name);
	   return "login";
	}

然后在login.html接收,用${name}即可。

拼接url传参的缺点:

  • 参数包含中文字符的话,容易出现问题
  • 不能

2. 方式二:RedirectAttributes

RedirectAttributes 是 Spring mvc 3.1 版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的的工具类。 它有两种带参的方式:

第一种:redirectAttributes.addAttributie("prama",value);

redirectAttributes.addAttribute("prama1",value1);
redirectAttributes.addAttribute("prama2",value2);
return:"redirect:/path/list" 

这种方法相当于在重定向链接地址追加传递的参数:return:"redirect:/path/list?prama1=value1&prama2=value2(直接追加参数会将传递的参数暴露在链接的地址上,非常的不安全,慎用)

第二种:redirectAttributes.addFlashAttribute("prama",value);

redirectAttributes.addFlashAttribute("prama1",str);
redirectAttributes.addFlashAttribute("prama2",list);
redirectAttributes.addFlashAttribute("prama3",map);
return:"redirect:/path/list.jsp" ;

此方法隐藏了参数,链接地址上不直接暴露,但是能且只能在重定向的页面上获取prama的值。其原理是参数放到了sessionsession在跳转之后马上移除对象。如果重定向到一个controller,是取不到该prama的值的。


总的来说,controller之间跳转然后把参数传到前台页面,这种方式实现起来费力不讨好,对于数据传递以及前台页面的接收展示来说不是很友好,其实可以换成用ajax方式来做,调用后台数据更加灵活并且局部刷新功能也更加友好。But,多一种方式,多一种选择。

© 著作权归作者所有

七弦桐
粉丝 4
博文 10
码字总数 15076
作品 0
石景山
私信 提问
SpringMVC Redirect 跳转后保存Model中的数据

在做项目编码时,几乎都不可避免的要用到Redirect跳转并保存其中的参数。例如下面的需求: 在用户的列表页面删除一个用户,在删除后仍停留在列表页面,但是要显示删除成功或者相应的错误信息...

微小宝
2016/05/20
95
0
iOS对UIViewController生命周期和属性方法的解析

iOS对UIViewController生命周期和属性方法的解析 一、引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有条有理的展示...

珲少
2015/11/01
6.3K
3
Controller跳转

@JFinal 你好,想跟你请教个问题:如何在一个Controller里跳转到另一个Controller里?类似Struts的Action之间的跳转。谢谢、

dreamers
2012/11/05
555
1
关于webapi跳转、重定向的问题

现在项目在用WebAPI+MVC 但是关于跳转就总是感觉很别扭 原先MVC的跳转就只要Redirect(new {controller= ;action=})现在遇到以下几个问题: 1.两个api之间怎么互相跳转 比如 我想从aAPI跳...

难挡眼镜控
05/13
289
0
Zend Framework 跳转方法(render, forward, redirect)区...

一. render(最常见的,只能在当前控制器使用,用于跳转到不同的视图) 不指定render 结果: {当前Module}/{当前Controller}/{当前Action}.phtml $this->render(‘bar’) ; 结果: {当前Mod...

酸奶喝不完
2012/10/08
128
0

没有更多内容

加载失败,请刷新页面

加载更多

JS--function

一、声明提前(hoist) 在js程序开始执行前,引擎会查找所有var声明的变量和function声明的函数,集中到当前作用域顶部集中创建,赋值留在原地 二、三种创建函数的方式 1、声明方式创建函数-...

wytao1995
今天
4
0
微服务之间调用控制器注解类型的差异

今天在一个业务服务通过Feign调用文件服务上传文件时遇到了几个问题: 1. 提示http请求头过大的问题; 此时需要修改bootstrap.yml,加入 server: max-http-header-size: 10000000 用以放大...

不再熬夜
今天
6
0
用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
今天
6
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
今天
5
0
《Java实践指南》--读后

闲读《Java实践指南》... 1.lvy 某些项目中能够看到ivy.xml。早期使用ant的项目中,常常用ivy.xml来下载项目依赖。 2.ant 作为java程序员,应该都知道ant,虽然可能用过的人不多。为什么ant...

RippleChan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部