(1)我在后台一个 controller 跳转到另一个 controller, 为什么有这种需求呢, 是这样的. 我有一个列表页面, 然后我会进行新增操作, 新增在后台完成之后我要跳转到列表页面, 不需要传递参数, 列表页面默认查询所有的.
方式一: 使用 ModelAndView
return new ModelAndView("redirect:/toList");
这样可以重定向到 toList 这个方法
方式二: 返回 String
return "redirect:/ toList";
其它方式: 其它方式还有很多, 这里不再做介绍了, 比如说 response 等等. 这是不带参数的重定向.
(2)第二种情况, 列表页面有查询条件, 跳转后我的查询条件不能丢掉, 这样就需要带参数的了, 带参数可以拼接 url
方式一: 自己手动拼接 url
new ModelAndView("redirect:/toList?param1="+value1+"¶m2="+value2);
这样有个弊端, 就是传中文可能会有乱码问题.
方式二: 用 RedirectAttributes, 这个是发现的一个比较好用的一个类
这里用它的 addAttribute 方法, 这个实际上重定向过去以后你看 url, 是它自动给你拼了你的 url.
使用方法:
- attr.addAttribute("param", value);
- return "redirect:/namespace/toController";
这样在 toController 这个方法中就可以通过获得参数的方式获得这个参数, 再传递到页面. 过去的 url 还是和方式一一样的.
(3)带参数不拼接 url 页面也能拿到值(重点是这个)
一般我估计重定向到都想用这种方式:
- @RequestMapping("/save")
- public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)
- throws Exception {
- String code = service.save(form);
- if(code.equals("000")){
- attr.addFlashAttribute("name", form.getName());
- attr.addFlashAttribute("success", "添加成功!");
- return "redirect:/index";
- }else{
- attr.addAttribute("projectName", form.getProjectName());
- attr.addAttribute("enviroment", form.getEnviroment());
- attr.addFlashAttribute("msg", "添加出错! 错误码为:"+rsp.getCode().getCode()+", 错误为:"+rsp.getCode().getName());
- return "redirect:/maintenance/toAddConfigCenter";
- }
- }
- @RequestMapping("/index")
- public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)
- throws Exception {
- return "redirect:/main/list";
- }
页面取值不用我说了吧, 直接用 el 表达式就能获得到, 这里的原理是放到 session 中, session 在跳到页面后马上移除对象. 所以你刷新一下后这个值就会丢掉.
3. 总结
最底层还是两种跳转, 只是 spring 又进行了封装而已, 所以说跳转的方式其实有很多很多种, 你自己也可以封一个, 也可以用最原始的 response 来, 也没有问题. 好了, 就到这儿.
其实也没有什么, 但是知道了这个就很简单了, 之前没搞懂, 现在搞懂了, 和大家分享. 有问题的给我留言.
spring mvc3 中的 addFlashAttribute 方法
url: http://www.software8.co/wzjs/java/2943.html
记得在 spring mvc2 中, 当保存 POJO 到数据库后, 要返回成功页面, 如果这个时候要带点信息,
则要这样:
Java 代码:
- // 第三个参数 (UserModel user) 默认为绑定对象
- @RequestMapping(value = "/user/save", method = RequestMethod.POST)
- public ModelAndView saveUser(HttpServletRequest request, HttpServletResponse response,UserModel user) throws Exception {
- ModelAndView mv = new ModelAndView("/user/save/result");// 默认为 forward 模式
- // ModelAndView mv = new ModelAndView("redirect:/user/save/result");//redirect 模式
- mv.addObject("message","保存用户成功!");
- return mv;
- }
而在 spring mvc 3.1 后, 可以这样
Java 代码:
- @RequestMapping(value = "/user/save", method = RequestMethod.POST)
- public ModelAndView saveUser(UserModel user, RedirectAttributes redirectAttributes) throws Exception {
- redirectAttributes.addFlashAttribute("message", "保存用户成功!");// 使用 addFlashAttribute, 参数不会出现在 url 地址栏中
- return "redirect:/user/save/result";
- }
来个稍微完整点的例子, 首先是一个表单, 在其中填入一些信息:
Java 代码:
- <form:form id="myform" action="saveUserDetails.action" method="POST" commandName="user">
- <form:input type="text" name="firstName" path="firstName"/>
- <form:input type="text" name="lastName" path="lastName"/>
- <form:input type="text" name="email" path="email"/>
- <input type="submit" value="submit">
- </form:form>
则在 controller 中, 可以这样:
Java 代码:
- @RequestMapping(value="/saveUserDetails.action", method=RequestMethod.POST)
- public String greetingsAction(@Validated User user,RedirectAttributesredirectAttributes){
- someUserdetailsService.save(user);
- redirectAttributes.addFlashAttribute("firstName", user.getFirstName());
- redirectAttributes.addFlashAttribute("lastName", user.getLastName())
- return "redirect:success.html";
- }
- success.html:
- <div>
- <h1>Hello ${firstName} ${lastName}. Your details stored in our database.</h1>
- </div><br>
但如果 F5 的时候, 会发现参数丢失, 因为 flash scope 其实只支持 redirect 的, 所以可以判断下:
Java 代码:
- @RequestMapping(value="/success.html", method=RequestMethod.GET)
- public String successView(HttpServletRequest request){
- Map<String,?> map = RequestContextUtils.getInputFlashMap(request);
- if (map!=null)
- return "success";
- else return "redirect:someOtherView"; // 給出其他提示信息
spring mvc 如何请求转发和重定向呢?
url: http://blog.sina.com.cn/s/blog_9cd9dc7101016abw.html
往下看
由于这部分内容简单, 一带而过了.
1. 请求转发:
(1)返回 ModelAndView :
- @RequestMapping(value="/model",method=RequestMethod.GET)
- public ModelAndView testForward(ModelAndView model,@RequestParam(value="id",defaultValue="1",required=false)Long id){
- User u = getBaseService().get(User.class, id);
- model.addObject("user", u);
- model.setViewName("forward:index.jsp");
- return model;
- }
如上代码, 如果返回 modelAndView 则可以如红色标注, 添加 forward 即可, 若想重定向, 可把 forward 替换成 redirect 便可达到目的.
(2)返回字符串
- @RequestMapping(value="/forward",method=RequestMethod.GET)
- public String testForward(){
- return "forward:/index.action";
- }
如上代码红色部分.
2. 请求重定向
对于请求转发可以分为: 1. 带参数 2. 不带参数
(1)带参数:
Java 代码
- @RequestMapping(value="/redirect",method=RequestMethod.GET)
- public String testRedirect(RedirectAttributes attr){
- attr.addAttribute("a", "a");
- attr.addFlashAttribute("b", "b");
- return "redirect:/index.action";
- }
带参数可使用 RedirectAttributes 参数进行传递:
注意: 1. 使用 RedirectAttributes 的 addAttribute 方法传递参数会跟随在 URL 后面, 如上代码即为 http:/index.action?a=a
2. 使用 addFlashAttribute 不会跟随在 URL 后面, 会把该参数值暂时保存于 session, 待重定向 url 获取该参数后从 session 中移除, 这里的 redirect 必须是方法映射路径, jsp 无效. 你会发现 redirect 后的 jsp 页面中 b 只会出现一次, 刷新后 b 再也不会出现了, 这验证了上面说的, b 被访问后就会从 session 中移除. 对于重复提交可以使用此来完成.
另外, 如果使用了 RedirectAttributes 作为参数, 但是没有进行 redirect 呢? 这种情况下不会将 RedirectAttributes 参数传递过去, 默认传 forward 对应的 model, 官方的建议是:
p:ignoreDefaultModelOnRedirect="true" />
设置下 RequestMappingHandlerAdapter 的 ignoreDefaultModelOnRedirect 属性, 这样可以提高效率, 避免不必要的检索.
(2)无参数
- @RequestMapping(value="/redirect",method=RequestMethod.GET)
- public String testRedirect(){
- return "redirect:/index.action";
- }
转自: https://blog.csdn.net/vydoo/article/details/49640275
来源: http://www.bubuko.com/infodetail-2567827.html