zoukankan      html  css  js  c++  java
  • Spring mvc框架 controller间跳转 ,重定向 ,传参

     一、需求背景

       
    1. 需求:spring MVC框架controller间跳转,需重定向。有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示。
     
    @RequestMapping(value = "/activityType", method = RequestMethod.GET)
        public String activityType(HttpServletRequest request, ModelMap model,RedirectAttributes attr) throws Exception{
            logger.info("into  activityType");
            String id = request.getParameter("typeId");
            String activityId = request.getParameter("activityId");
    //         model.put("typeId", id);
    //         model.put("activityId",activityId);
            
    //        attr.addFlashAttribute("typeId", id);
    //        attr.addFlashAttribute("activityId", activityId);
            
            attr.addAttribute("typeId", id);
            attr.addAttribute("activityId", activityId);
            
            ActivityTypeInfo activityTypeInfo = activityTypeInfoBiz.get(Integer.valueOf(id));//根据活动ID查询活动类型对象
            Integer activityType=activityTypeInfo.getType();
            switch(activityType){//根据类型不同跳转不同的页面
                 case 1:
                    System.out.println("线上吸粉活动!"); 
                    return "redirect:/active/xsxf/baseInfo";
                 case 2:
                    System.out.println("你答我奖活动!");
                    return "forward:/active/ndwj/baseInfo";
                 default :
                    return "index";
              }
            
        }

     

    二、 解决办法

    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在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢掉。

    注意: attr.addAttribute("a", "a"); 和 attr.addFlashAttribute("b", "b"); 的区别。

    带参数可使用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属性,这样可以提高效率,避免不必要的检索。

  • 相关阅读:
    win7下的vxworks总结
    ubuntu 无法获得锁 /var/lib/dpkg/lock
    项目中用到了的一些批处理文件
    win7下安装 WINDRIVER.TORNADO.V2.2.FOR.ARM
    使用opencv统计视频库的总时长
    January 05th, 2018 Week 01st Friday
    January 04th, 2018 Week 01st Thursday
    January 03rd, 2018 Week 01st Wednesday
    January 02nd, 2018 Week 01st Tuesday
    January 01st, 2018 Week 01st Monday
  • 原文地址:https://www.cnblogs.com/liuhongfeng/p/5242046.html
Copyright © 2011-2022 走看看