SpringMVC return forward redirect疑问

我们都知道,在一般情况下,控制器方法返回的字符串都会被当做逻辑视图名来处理。

但是当字符串带有“forward”或者“redirect”前缀时,则对他们进行特殊处理。把“forward”与“redirect”当成指示符,其后的字符串

作为URL来处理。

redirect:会让浏览器发起一个新的请求。

forward:与当前请求同属一个。


遇到的一个问题:

@RequestMapping("/test1")
public String test1(@ModelAttribute("user") User user) {
    System.out.println("test1  " + user);
    return "forward:/test2";
}

@RequestMapping("/test2")
public String test2(ModelMap map) {
    System.out.println("test2  " + map.get("user"));
    return "user/success";
}

当我们请求/test1时,被转发到/test2了。

问题是:我们能够在test2中得到名称为user的User对象吗?

答案是否定的。

http://localhost:8080/SM/test1

test1  User{username='lgh', password='', realName='null'}
test2  null

原因:

1、SpringMVC在调用方法前会创建一个隐含的模型对象implicitModel,作为模型数据的存储容器。如果处理方法的入参为Map或者Model类型,则

SpringMVC会将implicitModel的引用传递给这些入参。

所以test1与test2有两个不同的implicitModel,test2不可以获得test1的implicitModel。

2、对于JSP视图来说,SpringMVC会将模型数据转存到ServletRequest的属性列表中,因为test1与test2同属一个请求,所以,我们在最终的视图页面可以得到

test1与test2的所有模型数据。

测试:

@RequestMapping("/test1")
public String test1(@ModelAttribute("user") User user) {
    System.out.println("test1  " + user);
    return "forward:/test2";
}

@RequestMapping("/test2")
public String test2(ModelMap map) {
    System.out.println("test2  " + map.get("user"));
    map.addAttribute("user1", new User("111", "222", "333"));
    return "user/success";
}
访问:http://localhost:8080/SM/test1

返回:

User{username='lgh1992314@qq.com', password='', realName='null'}
User{username='111', password='222', realName='333'}

当然改为redirect,则只会显示test2里的数据。


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

N3verL4nd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值