controller 之间的跳转

在开发中,有时会遇到 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";
}
    
    
  • 1
  • 2
  • 3
  • 4

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

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

2. redirect

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

3. forward 和 redirect 比较

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

二、跳转时数据的传递

1. 方式一:手动拼接 URL

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

login.action:

@RequestMapping("/login")
    public String login(HttpServletRequest request, ModelMap model, RedirectAttributes attr ) {
       String name = request.getParameter("name");
       model.addAttribute("name",name);
       return "login";
    }
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后在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" 
    
    
  • 1
  • 2
  • 3

这种方法相当于在重定向链接地址追加传递的参数: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" ;
    
    
  • 1
  • 2
  • 3
  • 4

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


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

                                            <link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/markdown_views-68a8aad09e.css">
                                </div>

在开发中,有时会遇到 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";
}
  
  
  • 1
  • 2
  • 3
  • 4

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

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

2. redirect

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

3. forward 和 redirect 比较

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

二、跳转时数据的传递

1. 方式一:手动拼接 URL

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

login.action:

@RequestMapping("/login")
    public String login(HttpServletRequest request, ModelMap model, RedirectAttributes attr ) {
       String name = request.getParameter("name");
       model.addAttribute("name",name);
       return "login";
    }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后在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" 
  
  
  • 1
  • 2
  • 3

这种方法相当于在重定向链接地址追加传递的参数: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" ;
  
  
  • 1
  • 2
  • 3
  • 4

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


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

                                            <link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/markdown_views-68a8aad09e.css">
                                </div>

猜你喜欢

转载自blog.csdn.net/weixin_39805338/article/details/80879951
今日推荐