1.不带参数跳转
1.1
同一个controller内部跳转
return "redirect:/toList"; //可以省略一层路径
等价于
return new ModelAndView("redirect:/toList");
1.2
不同controller内部跳转
return return "redirect:/MESBcElectric/list"; //两层路径必须齐全
2.拼接参数跳转
2.1 自己拼接参数
RedirectAttributes attr
return "redirect:/MESBcElectric/list?name="+name+"&password="+password;
//自己在路径后拼接需要传递到另一个controller中的参数
缺点:自己拼接的参数,若是中文,会出现乱码
2.2 利用类拼接参数
RedirectAttributes attr;
attr.addAttribute(“name”, value);
public String findlist(MESBcElectric mESBcElectric,RedirectAttributes attr){
//自动拼接参数
attr.addAttribute("process", mESBcElectric.getProcess());
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM");
Date date1 = mESBcElectric.getDate();
String date=sdf.format(date1);
attr.addAttribute("date",date);//将date由日期类型转化为字符串类型再进行拼接
return "redirect:/MESBcElectric/list";
跳转后链接地址为:
return "redirect:/MESBcElectric/list?process="+mESBcElectric.getProcess()+"&date="+date;
利用类拼接的参数,不会出现中文乱码
3.带参数不拼接url页面
RedirectAttributes attr;
attr.addFlashAttribute(“name”, form.getName());
页面取值,直接用el表达式就能获得到,这里的原理是放到session中,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢掉。
@RequestMapping("/save")
public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)
throws Exception {
String code = service.save(form);
attr.addFlashAttribute("name", form.getName());//暂时存在session中
attr.addFlashAttribute("success", "添加成功!");
return "redirect:/index";
}
@RequestMapping("/index")
public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)
throws Exception {
return "redirect:/main/list";
}
注意
attr.addAttribute(“a”, “a”); 和 attr.addFlashAttribute(“b”, “b”);的区别
1.使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如上代码即为http:/index.action?a=a 。
2.使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,这里的redirect必须是方法映射路径,jsp无效。你会发现redirect后的jsp页面中b只会出现一次,刷新后b再也不会出现了,这验证了上面说的,b被访问后就会从session中移除。对于重复提交可以使用此来完成.
重要知识
通过Controller跳转controller所带的参数会自动封装在下一个Controller的实体类对象中,无需再进行request获取