SpringMVC几种重定向以及携带参数的处理

来源:互联网 发布:python中的str是什么 编辑:程序博客网 时间:2024/05/22 10:40

今天要学习的内容是SpringMVC的重定向,我将这个内容划分为两块。
1)不携带参数重定向;
2)携带参数重定向;

注意:本文没有考虑Spring2.0版本的写法,比如:

return new ModelAndView("/redirectPage");
modelAndView.setViewName("/secondJsp);

1 不携带参数的重定向
分为以下几种
1)返回redirect字符

return "redirect:/page/second";

这是比较常见的用法,redirect后面是映射地址
2)返回无redirect字符

return "second"

这是直接返回JSP视图的名称,这不属于重定向,但一定程度上可以达到一些效果,所以也把它记录进来。
3)调用当前控制器的方法

public class redirectDemo{    @RequestMapping("/first")    pubic String first(){        return second();    }    @RequestMapping("/second")    public String second(){        return "second";    }}

这个也不属于重定向,而是一般的方法调用,但用却很方便,例如:我想修改一个链接,但是这个链接却在很多地方用到了,我担心修改以后导致很多地方出现404错误。所以我在这里重写一个映射地址,原来的映射地址调用这个地址的方法,这样保证了两个映射地址都能使用。是不是很方便?

以上就是不带参数的重定向写法总的来说只有一行代码:

return "redirect:/page/second";

然后看一下,带参数的写法。
2 携带参数的重定向
这里有三种方式:
1)拼接字符串;
这种比较简单,就是将参数拼接到需要重定向的URL中;

return "redirect:/page/second?param1=lay&param2=lay2";

2)RedirectAttribute—–addAttribute()的用法
第二种方式直接看代码

public String first(RedirectAttribute redirectAttribute){    redirectAttribute.addAttribute("param1", "lay");    return "redirect:/page/second";}

我们看到,依旧是那个重定向的写法,但是参数从URL链接中拿出来了。采用RedirectAttribute来传参数。
这里注意,这种穿参数的方式,其实和拼接字符是一样的,因为最终,它都会被拼接到URL中。
3)RedirectAttribute—–addFlashAttribute()的用法

前两种用法有两个问题
1)参数中如果是中文的话会出现乱码,如果需要传中文可能需要进行编码和解码。这是很烦恼的一件事。
2)参数被拼接在URL中,也就意味着我们将参数暴露给了用户,对于有些参数来说,这是不安全的。可能需要做加密工作。

基于以上的问题,我们用第三种方案来解决。也就是

addFlashAttribute()的方法

这是Spring3.1添加的flash属性,具体用法和addAttibute()类似。

@Controller@RequestMapping("/page")public class redirectDemo{    @RequestMapping("/first")    public String first(RedirectAttribute redirectAttribute){        redirectAttribute.addFlashAttibute("param1", "lay");        return "redirect:/page/second";    }    @RequestMapping("/second")    public String second(@ModelAttribute("param1") String param1){        System.out.println(param1);        return "second";    }}

与前面的方法对比,我们发现有几个不同点:
1)URL中不再有参数显示,也就是说参数没有暴露出来。
2)中文乱码问题也不存在了。
3)参数接收需要使用@ModelAttribute注解
4)刷新页面以后,参数丢失了

关于第4点需要赘述一下,由于这种传输参数的方式,是将参数放入到session中,然后从中取值,而后就销毁了,所以当你刷新页面的时候,已经取不到值了。

注意:
本文只考虑了redirect没有说forward;但是forward的用法和redirect基本相同。
区别:
可能就是在于redirect是重定向,而forward是转发。什么意思?前者是等于让用户向另外一个URL请求资源,而后者则是我们服务器直接指向另一个URL的资源,然后返回给用户,在用户看来,URL没变。所以,可以在浏览器地址栏上看到,前者的URL是变化了,后者则是没有变化。

以上,仅是个人简单地学习和理解

0 0
原创粉丝点击