spring mvc重定向

一.不带参数,直接重定向到另一个地址:

返回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的时候值到底在哪??????? 

你可能感兴趣的:(spring mvc重定向)