版权声明:本文为博主原创文章,用来记录学习过程,欢迎交流学习。 https://blog.csdn.net/k_young1997/article/details/88846872
写一个商城的项目,需要在跳转的时候实现一些需求,通过查看资料总结一下。
1、通过return 字符串的方式映射到目标controller
这种方式是浏览器给服务器发一个response,服务器接收后向浏览器回复一个request,所以最后在浏览器显示的url是你请求时的url,对应下边的"/login_check"。
@RequestMapping("/login_check")
public String login() {
return "/login";
}
如果需要传递参数给浏览器的话可以用Model
@RequestMapping("/login_check")
public String login(Model model) {
model.addAttribute("参数名", "参数值");
return "/login";
}
2、通过return "redirect:xxx"的方式映射到目标controller
这种方式是浏览器向服务器发送一个response,请求的是/login_check,服务器向浏览器回复一个request,然后浏览器再次向服务器发送一个response,请求的是/login,服务器再次向其回复一个request,所以,最后url显示的是你要重定向的url,也就是下边的/login
@RequestMapping("/login_check")
public String login() {
return "redirect:/login";
}
所以采用这种方式重定向的话,如果跟上一种方式一样用Model传递参数的话是无法通过request.getAttribute()的方式来获取参数的。这里推荐使用拦截器(Interceptor)+ThreadLocal的方式来传递参数(我在验证用户登录时通过将ticket添加到cookie的,然后通过这种方式判断)
3、通过forward的方式映射到controller
forward 的转发过程只发生在服务端。Servlet 容器会直接把源请求打向目标 URL,而不会经由客户端发起请求,因此客户端接收到的响应是来自转发后的目标方法,但是浏览器呈现的 URL 却并不会改变,且 forward 不能将参数转发出去。
@RequestMapping("/login_check")
public String login(RedirectAttributes attrs) {
attrs.addAttribute("参数名", "参数值");
return "forward:/login";
}
4、通过RedirectAttributes的方式将参数传递到目标controller
这种方式是通过GET的方式的,在跳转后url会变为/login?参数名=参数值的形式
@RequestMapping("/login_check")
public String login(RedirectAttributes attrs) {
attrs.addAttribute("参数名", "参数值");
return "/login";
}