Spring mvc Controller间跳转/重定向/传参

Spring mvc Controller常用写法

1.ModelAndView

@RequestMapping(value = "/getxxxList.html")
public ModelAndView getxxxList(XxxDTO xxxDTO,WebPage webPage){
    //ModelAndView modelAndView = new ModelAndView("/xxx/xxxList");//跳转
    ModelAndView modelAndView = new ModelAndView("redirect:/xxx/xxxList");//重定向
    try{
        //检索参数回显
        modelAndView.addObject("xxxDTO",xxxDTO);
        //执行查询
        modelAndView.addObject("xxxList",xxxList);
    }catch (Exception e){
        e.printStackTrace();
    }
    return modelAndView;
}

2.String

@RequestMapping(value = "/getxxxList.html")
public String getxxxList(XxxDTO xxxDTO,WebPage webPage,Model model){
    try{
        //检索参数回显
        model.addAttribute("xxxDTO",xxxDTO);
        //执行查询
        model.addAttribute("xxxList",xxxList);
    }catch (Exception e){
        e.printStackTrace();
    }
    //return "/xxx/xxxList";//跳转
    return "redirect:/xxx/xxxList";//重定向
}

返回地址参数拼接

1.手动拼接URL

"redirect:/xxx/xxxList?param1="+value1+"¶m2="+value2"

2-1.使用RedirectAttributes自动拼接重定向URL

@RequestMapping(value = "/getxxxList.html")
public String getxxxList(RedirectAttributes redirectAttributes){
    redirectAttributes.addAttribute("param1", value1);
    redirectAttributes.addAttribute("param2", value2);
    return "redirect:/xxx/toController";//重定向
}

Tip:曾经在项目中遇到过很诡异的重定向问题,业务代码执行无错无异常并且顺利到达 return,重定向结果就是页面报错500,后台并未有异常抛出,且在众多Controller方法中,只有两三个Controller方法遇到了这样的问题,使用RedirectAttributes后解决了这个重定向异常的问题。

2-2.使用RedirectAttributes的addFlashAttribute方法

@RequestMapping("/save")
public String save(@ModelAttribute("form") XxxBean 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:/xxx/toController";
    }
}

注意:

  1. 在2-1中使用addAttribute方法传参,参数会自动拼接在URL后面,而使用addFlashAttribute方法会把参数值暂存于session,待重定向URL获取该参数后从session中移除,这里的redirect必须是方法映射路径,jsp无效。重定向后参数值只会出现一次,刷新页面后不再出现。
  2. 如果使用了RedirectAttributes作为参数,但是没有进行redirect,这种情况下不会将RedirectAttributes参数进行传递,默认还是传递forward对应的model,官方的建议是可以设置RequestMappingHandlerAdapter的ignoreDefaultModelOnRedirect属性,这样可以提高效率,避免不必要的检索。

你可能感兴趣的:(SpringMVC)