spring mvc controller间跳转 重定向 传参

url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/

1. 需求背景
    需求:spring MVC框架controller间跳转,需重定向。有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示。

本来以为挺简单的一件事情,并且个人认为比较常用的一种方式,一百度全都有了,这些根本不是问题,但是一百度居然出乎我的意料,一堆都不是我想要的结果。无奈啊,自己写一篇比较全都供以后大家一百度吧,哈哈哈。。。是这些写的不是很全都人们给了我写这篇博客的动力。
2. 解决办法
    需求有了肯定是解决办法了,一一解决,说明下spring的跳转方式很多很多,我这里只是说一些自我认为好用的,常用的,spring分装的一些类和方法。

    (1)我在后台一个controller跳转到另一个controller,为什么有这种需求呢,是这样的。我有一个列表页面,然后我会进行新增操作,新增在后台完成之后我要跳转到列表页面,不需要传递参数,列表页面默认查询所有的。
        方式一:使用ModelAndView
        return new ModelAndView("redirect:/toList");
        这样可以重定向到toList这个方法
        方式二:返回String
                    return "redirect:/ toList "; 
        其它方式:其它方式还有很多,这里不再做介绍了,比如说response等等。这是不带参数的重定向。

    (2)第二种情况,列表页面有查询条件,跳转后我的查询条件不能丢掉,这样就需要带参数的了,带参数可以拼接url

        方式一:自己手动拼接url

                    new ModelAndView("redirect:/toList?param1="+value1+"&param2="+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代码:  
  1.     //第三个参数(UserModel user)默认为绑定对象  
  2.     @RequestMapping(value = "/user/save", method = RequestMethod.POST)  
  3.     public ModelAndView saveUser(HttpServletRequest request, HttpServletResponse response,UserModel user) throws Exception {  
  4.         ModelAndView mv = new ModelAndView("/user/save/result");//默认为forward模式  
  5. //      ModelAndView mv = new ModelAndView("redirect:/user/save/result");//redirect模式  
  6.         mv.addObject("message","保存用户成功!");  
  7.         return mv;  
  8.     }  
而在spring mvc 3.1后,可以这样 
Java代码:  
  1. @RequestMapping(value = "/user/save", method = RequestMethod.POST)  
  2. public ModelAndView saveUser(UserModel user, RedirectAttributes redirectAttributes) throws Exception {  
  3.     redirectAttributes.addFlashAttribute("message", "保存用户成功!");//使用addFlashAttribute,参数不会出现在url地址栏中  
  4.     return "redirect:/user/save/result";  
  5. }  
来个稍微完整点的例子,首先是一个表单,在其中填入一些信息: 
Java代码: 
  1. <form:form id="myform" action="saveUserDetails.action" method="POST" commandName="user">  
  2.    <form:input type="text" name="firstName" path="firstName"/>  
  3.    <form:input type="text" name="lastName" path="lastName"/>  
  4.    <form:input type="text" name="email" path="email"/>  
  5.    <input type="submit" value="submit">  
  6. </form:form>  
则在controller中,可以这样: 
Java代码:  
  1.        @RequestMapping(value="/saveUserDetails.action", method=RequestMethod.POST)  
  2. public String greetingsAction(@Validated User user,RedirectAttributesredirectAttributes){  
  3.               
  4.                someUserdetailsService.save(user);  
  5.       
  6.                redirectAttributes.addFlashAttribute("firstName", user.getFirstName());  
  7.     redirectAttributes.addFlashAttribute("lastName", user.getLastName())  
  8.     return "redirect:success.html";  
  9. }  
  10.  
  11.  
  12.   success.html: 
  13. <div> 
  14. <h1>Hello ${firstName} ${lastName}. Your details stored in our database.</h1> 
  15. </div><br> 
但如果F5的时候,会发现参数丢失,因为flash scope其实只支持redirect的,所以可以判断下: 
Java代码: 
  1. @RequestMapping(value="/success.html", method=RequestMethod.GET)  
  2.     public String successView(HttpServletRequest request){  
  3.         Map<String,?> map = RequestContextUtils.getInputFlashMap(request);   
  4.         if (map!=null)  
  5.            return "success";  
  6.         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代码  收藏代码
  1. @RequestMapping(value="/redirect",method=RequestMethod.GET)  
  2. public String testRedirect(RedirectAttributes attr){  
  3.      attr.addAttribute("a", "a");  
  4.      attr.addFlashAttribute("b", "b");  
  5.      return "redirect:/index.action";  
  6. }  

 

 带参数可使用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://www.cnblogs.com/likeju/p/4702507.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寻找数组的中心索引

给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元素。这一点…

一个疏忽引发的思考!(strerror)

前几天写代码因为自己的疏忽导致一遍又一遍的Segmentation fault (core dumped)。该问题是因为strerror&#xff08;errno&#xff09;返回的指针指向非法的内存导致程序打印错误时崩溃。 尝试数次无果&#xff0c;为了进度。简单粗暴的换成了perror(str)。今天忙里偷闲&#x…

Java最佳实践–字符串性能和精确字符串匹配

在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论String性能调优。 我们将专注于如何有效地处理字符串创建&#xff0c; 字符串更改和字符串匹配操作。 此外&#xff0c;我们将提供我们自己的用于精确字符串匹配的最常用算法的…

keil里面填数据

编译后寄存器和堆栈的内存数据可以直接写进去的。 寄存器&#xff0c;双击就可以&#xff0c;注意里面是十六进制 堆栈&#xff0c;也是十六进制&#xff0c;八位的 00 00 00 00 &#xff0c;但这个是从右到左的&#xff0c;比如0x00000006 应该填 06 00 00 00 把数据取出来 取…

调试生产服务器– Eclipse和JBoss展示

您是否编写有错误的代码&#xff1f; 不&#xff0c;当然不。 对于我们其余的确实会编写带有错误的代码的凡人&#xff0c;我想解决一个非常敏感的问题&#xff1a;调试在生产服务器上运行的应用程序。 因此&#xff0c;您的应用程序已准备好进行部署。 单元测试全部成功&…

力扣151. 翻转字符串里的单词

给你一个字符串 s &#xff0c;逐个翻转字符串中的所有 单词 。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。 没思路&#xff0c;看到的官方给的&#xff0c;简洁明了&…

B/S和C/S架构图解

软件&#xff1a;B/S和C/S两种架构模式。接下来用三张图片解释&#xff0c;什么是B/S什么是C/S。 图片一&#xff1a;软件架构模式 图片二&#xff1a;C/S结构模式 图片三&#xff1a;B/S结构模式 相信图解胜过冗长文字的解释&#xff0c;什么是B/S什么是C/S一目了然。 转载于:…

HDU 5371 Hotaru's problem (Manacher,回文串)

题意&#xff1a;给一个序列&#xff0c;找出1个连续子序列&#xff0c;将其平分成前&#xff0c;中&#xff0c;后等长的3段子序列&#xff0c;要求【前】和【中】是回文&#xff0c;【中】和【后】是回文。求3段最长为多少&#xff1f;由于平分的关系&#xff0c;所以答案应该…

bash 与 dash

Ubuntu 的 bash和dash的区别 什么是bash &#xff1f; Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell&#xff0c;事实上&#xff0c;还有许多传统UNIX上用的Shell&#xff0c;像tcsh、csh、ash、bsh、ksh等 等&#xff0c;Shell Script大致都类同&#xff0c;当您学…

Eclipse:如何附加Java源代码

在Eclipse中&#xff0c;当您按Ctrl按钮并单击任何类名称时&#xff0c;IDE会将您带到该类的源文件。 这是项目中具有的类的正常行为。 但是&#xff0c;如果您也希望Java核心类具有相同的行为&#xff0c;则可以通过将Java源代码附加到Eclipse IDE来实现。 一旦附加了源代码&a…

h.264 去块滤波

块效应及其产生原因 我们在观看视频的时候&#xff0c;在运动剧烈的场景常能观察到图像出现小方块&#xff0c;小方块在边界处呈现不连续的效果&#xff08;如下图&#xff09;&#xff0c;这种现象被称为块效应&#xff08;blocking artifact&#xff09;。 首先我们需要搞清楚…

DataNucleus 3.0与Hibernate 3.5

如官方产品站点所述&#xff0c; DataNucleus Access Platform是现有的最符合标准的开源Java持久性产品。 它完全符合JDO1 &#xff0c; JDO2 &#xff0c; JDO2.1 &#xff0c; JDO2.2 &#xff0c; JDO3 &#xff0c; JPA1和JPA2 Java标准。 它还符合OGC简单功能规范&#xf…

AngularJS 的常用特性(二)

3、列表、表格以及其他迭代型元素 ng-repeat可能是最有用的 Angular 指令了&#xff0c;它可以根据集合中的项目一次创建一组元素的多份拷贝。 比如一个学生名册系统需要从服务器上获取学生信息&#xff0c;目前先把模型之间定义在 JavaScript 代码里面&#xff1a; 1 var stud…

Ruby,Python和Java中的Web服务

今天&#xff0c;我不得不准备一些示例来说明Web服务是可互操作的。 因此&#xff0c;我已经使用Metro使用Java创建了一个简单的Web服务&#xff0c;并在Tomcat上启动了它。 然后尝试使用Python和Ruby消耗它们。 这是全部完成的过程… Java中的Web服务 我从Java中的简单Web服…

用动画切换按钮的状态

用动画切换按钮的状态 效果 源码 https://github.com/YouXianMing/UI-Component-Collection // // BaseControl.h // BaseButton // // Created by YouXianMing on 15/8/27. // Copyright (c) 2015年 YouXianMing. All rights reserved. //#import <UIKit/UIKit.h> c…

Java泛型快速教程

泛型是Java SE 5.0引入的一种Java功能&#xff0c;在其发布几年后&#xff0c;我发誓那里的每个Java程序员不仅听说过它&#xff0c;而且已经使用过它。 关于Java泛型&#xff0c;有很多免费和商业资源&#xff0c;而我使用的最佳资源是&#xff1a; Java教程 Java泛型和集合…

876. 链表的中间结点

给定一个头结点为 head 的非空单链表&#xff0c;返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点 代码一&#xff1a; 自己想的一个方法 class Solution {public ListNode middleNode(ListNode head) {ListNode p1 head;ListNode p2 head;//i,j…

Spark系列—02 Spark程序牛刀小试

一、执行第一个Spark程序 1、执行程序 我们执行一下Spark自带的一个例子&#xff0c;利用蒙特卡罗算法求PI&#xff1a; 启动Spark集群后&#xff0c;可以在集群的任何一台机器上执行一下命令&#xff1a; /home/spark/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \ --class o…

JVM选项:-client vs -server

您是否曾经在运行Java应用程序时想知道-client或-server开关是什么&#xff1f; 例如&#xff1a; javaw.exe -client com.blogspot.sdoulger.LoopTest也显示在java.exe的“帮助”中&#xff0c;例如&#xff0c;其中的选项包括&#xff1a; -client选择“客户端” VM -serv…

3.1存储管理操作系统

存储器管理的对象是主存&#xff08;内存&#xff09;。其主要功能包含分配和回收主存空间、提高主存的利用率、扩充主存、对主存信息实现有效保护。存储器的结构为&#xff1a;寄存去、缓存、主存、外存。逻辑地址&#xff08;对用户角度。程序存放的位置&#xff09;、物理地…