springMVC带参数请求重定向
SpirngMVC返回逻辑视图名可以分下⾯⼏种情况:
1. servlet进⾏请求转发,返回到jsp页⾯,如  return "index.jsp" ;
2. servlet 返回结果,让请求重定向到某个jsp页⾯,此时servlet 返回语句类似:  return  " redirect : index.jsp ";
3. servlet 的返回结果是请求另外⼀个servlet  此时servlet 返回语句类似:  return  " redirect : goIndex.do ";
4. servlet 的返回结果是请求另外⼀个servlet,并且还需要带上请求参数,也就是Controller 间的带参数重定向,此时servlet 返回语句就不能直接写了,需要进⾏url拼接再返回:
类似:String url="redirect: goSeeComment.do?newsId="+newsid;      return url;
举个例⼦,下⾯的代码⽚段实现这么⼀个功能,从⼀个新闻显⽰列表中,点击添加评论按钮(跳转到goAddComment.do,把新闻newsId 转发到addComment.jsp),为该条新闻添加评论,添加完评论进⾏表单的提交(提交到addComment.do),然后再返回到这条新闻对应的评论列表:
1//添加评论步骤1:获取newsId,转发到addComment.jsp
2    @RequestMapping("goAddComment.do")
3public String goAddComment(Model model,Integer newsId){
4        model.addAttribute("newsId", newsId);
5return "addComment.jsp";//把newsId发送到添加评论页⾯,页⾯添加评论,提交时,再把这个id⼀起提交到servlet,以便后⾯重定向时作为参数
6    }
7
8//添加评论步骤2:表单数据提交;保存成功,重新请求"goSeeComment.do"显⽰评论
9    @RequestMapping("addComment.do")
10public String addComment(Model model,NewsComment comment){//NewsComment类中定义了newsId这个属性
11        Integer newsid = NewsId();
12        //System.out.println("newsid:"+newsid);
13        service.addComment(comment);
18 String url="redirect: goSeeComment.do?newsId="+newsid;
19        System.out.println("请求重定向url"+url);
20//添加成功,返回到原来那条新闻对应的评论列表页
21 return url;//需要前端页⾯把newsId传过来
22    }
其他⼀些介绍SpringMVC带参数请求重定向的⽂章链接如下:
spring MVC框架controller间跳转,需重定向。有⼏种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页⾯也能显⽰。
⾸先先来介绍⼀下不带参数的重定向:
我在后台⼀个controller跳转到另⼀个controller,为什么有这种需求呢,是这样的。我有⼀个列表页⾯,
然后我会进⾏新增操作,新增在后台完成之后我要跳转到列表页⾯,不需要传递参数,列表页⾯默认查询所有的。
el表达式获取session中的值
⽅式⼀:使⽤ModelAndView(这是Spring 2.0的时候所⽤到的⽅法)
return new ModelAndView("redirect:/toList");
这样可以重定向到toList这个⽅法
⽅式⼆:返回String
return "redirect:/ toList ";
然后在说⼀下带参数的重定向
第⼆种情况,列表页⾯有查询条件,跳转后我的查询条件不能丢掉,这样就需要带参数的了,带参数可以拼接url
⽅式⼀:⾃⼰⼿动拼接url
new ModelAndView("redirect:/toList?param1="+value1+"¶m2="+value2);
这样有个弊端,就是传中⽂可能会有乱码问题。
⽅式⼆:⽤RedirectAttributes,这个是发现的⼀个⽐较好⽤的⼀个类
这⾥⽤它的addAttribute⽅法,这个实际上重定向过去以后你看url,是它⾃动给你拼了你的url。
使⽤⽅法:
public String test(RedirectAttributes attributes)
{
attributes.addAttribute("test", "hello");
return "redirect:/test/test2";
}
这样在toController这个⽅法中就可以通过获得参数的⽅式获得这个参数,再传递到页⾯。过去的url还是和⽅式⼀⼀样的。如果你细⼼的看重定向之后的url地址的话,你就会发现其实和上⾯的地址是⼀样的,这样也会出现上⾯那个⽅法出现的问题。
重点来了,咱们介绍⼀个不会出现中⽂乱码,⽽且不会在你的Url上出现你所要传递的数据的,这样就可以保证你在传递数据的安全
public String red(RedirectAttributes attributes)
{
attributes.addFlashAttribute("test", "hello");
return "redirect:/test/test2";
}
咱们⽤上⾯的⽅法进⾏数据传递你就会发现不会再Url上出现你要传递的数据,那么数据放到哪⾥去了,我们就来看看这是Spring 3.0新出现的特性,attributes.addFlashAttribute("test", "hello")实际存储的属性在flashmap,那么flashmap⼜是什么呢?
Flash 属性和 RedirectAttribute:通过FlashMap存储⼀个请求的输出,当进⼊另⼀个请求时作为该请求的输⼊,典型场景如重定向(POST-REDIRECT-GET模式,1、POST时将下⼀次需要的数据放在FlashMap;2、重定向;3、通过GET访问重定向的地址,此时FlashMap会把1放到FlashMap的数据
取出放到请求中,并从FlashMap中删除;从⽽⽀持在两次请求之间保存数据并防⽌了重复表单提交)。
Spring Web MVC提供FlashMapManager⽤于管理FlashMap,默认使⽤SessionFlashMapManager,即数据默认存储在session中
既然知道了怎么回事,那么我们就可以把它提取出来,怎么提取呢,很多⼈会说,既然存在session中,那就从session中获取,结果发现没有,那怎么办?
下⾯我就给⼤家提供两个⽅法让⼤家把addFlashAttribute中的数据提取出来
⽅法⼀:利⽤httpServletRequest
public String test2(HttpServletRequest request)
{
Map<String,?> map = InputFlashMap(request);
System.out.("test").toString());
return "/test/hello";
}
⽅法⼆:利⽤Spring提供的标签@ModelAttribute
public String test2(@ModelAttribute("test") String str)
{
System.out.println(str);
return "/test/hello";
}
以上两种⽅法是在后台Controller层获取值的⽅法,如果是在前台页⾯的话,就会⽐较简单,直接利⽤el表达式就可以取到数据

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。