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