一.不带参数,直接重定向到另一个地址:
返回String直接跳转,如:
@RequestMapping(value = "/filehandle") public String upload(){
return "redirect:/upload.jsp";
}
或者使用使用ModelAndView跳转
@RequestMapping(value = "/filehandle") public ModelAndView upload(){
return new ModelAndView("redirect:/toList");
}
二.带参数重定向
1.手动拼接url
@RequestMapping(value = "/filehandle") public String upload(){ return "redirect:/test.jsp?a=2&b=fdf&c=flase&d=123"; }
jsp上用以下两种方式接收
${param.a}
<%=request.getParameter("a") %>
缺点:
a.参数都会被当成String,强制转换类型会报错
b.因为用get方式,中文中可能会乱码
2.用RedirectAttributes.addAttribute 传参
@RequestMapping(value = "/test") public String upload(RedirectAttributes attr,Model model){ attr.addAttribute("a",2); attr.addAttribute("b","镇耿"); attr.addAttribute("c",false); return "redirect:/test.jsp"; }
不能用Model.addAttribute,因为jsp接不到
jsp接收的方式跟上一个一样
实际上,这个方法实质上跟方法1是一样的,只是这个方法会自动拼接url,跳转之后的地址是一样的,所以缺点也跟方法1一样.
3.用RedirectAttributes.addFlashAttribute 传参(这个方法目前来说是最好的)
RedirectAttributes.addFlashAttribute 是 Spring MVC 3.1之后才有的,并且要在 spring-servlet.xml 文件中加入 mvc:annotation-driven。
<mvc:annotation-driven />
java:
@RequestMapping(value = "/test") public String upload(RedirectAttributes attr){ TestBean b=new TestBean(); b.setA("3"); b.setB("峰峰ff"); attr.addFlashAttribute("t",b); return "redirect:/test2"; } @RequestMapping(value = "/test2") public String upload2(){ return "test"; }
如果"/test2"里面需要对addFlashAttribute里的值处理可以在"/test2"里这么接
@RequestMapping(value ="/test2") public String upload2(@ModelAttribute("t") TestBean c) { System.out.println(c.getA()); System.out.println(c.getB()); c.setB("fFdf发的");
return "test"; }
可以不用保存,直接更改,jsp接到的是改后的值
jsp用以下方式接
${t.b }
<%=request.getAttribute("t") %>
addFlashAttribute 默认存放在session里,重定向后取值就会立马删除,所以不会占用session很多空间,但仍然有其他问题.
而且这方法也不能直接重定向到jsp,直接到jsp的话jsp取不到值,需要重定向到映射上
注意:RedirectAttributes.addAttribute和RedirectAttributes.addFlashAttribute最好不要一起用,尤其是两者添加到key和bean里属性的名字不要重复,会导致 FlashAttribute里面的值错乱
4.值放session里,跳转后从session取值再将值删除.
@RequestMapping(value = "/test") public String upload(HttpSession session){ TestBean b=new TestBean(); b.setA("3"); b.setB("峰峰ff"); session.setAttribute("u",b ); return "redirect:/test.jsp"; // return "redirect:/test2"; }
jsp接
session.u=<%=session.getAttribute("u") %><br/> sessionScope.u.a=${sessionScope.u.a}<br/> u.a=${u.a }<br/>
<% session.removeAttribute("u"); %>
现在我想直接跳到jsp并且传一个自定义的类作为参数,不知道怎么做.
方法1,2自定义的类被当成了字符,
方法3的话又要经过一个映射才能收,但我要跳转的文件不在定义的jsp位置(配置定义在web-inf下),我想跳转到webapp下的jsp,又不想在web-inf和webapp两边都放同一个jsp,
方法4不知道怎么样,存在session,然后再jsp上读完后删除
明明说是addFlashAttribute 默认存放在session里,但直接跳jsp,然后在jsp直接去session里的值却读不到,遍历session也没看到,不知道具体存哪,action接的时候也是用注解接的,但action以forward方式返回到jsp的时候值是在request里面的
所以,直接跳jsp的时候值到底在哪???????