spring mvc controller间跳转 重定向 传参及常见错误的处理(转载+个人总结)
转载内容转自:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/
1. 需求背景
需求:spring MVC框架controller间跳转,需重定向。有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示。
2. 解决办法
需求有了肯定是解决办法了,一一解决,说明下spring的跳转方式很多很多,我这里只是说一些自我认为好用的,常用的,spring分装的一些类和方法。
(1)我在后台一个controller跳转到另一个controller,同时传递参数
方式一:使用ModelAndView
@RequestMapping("/list") public ModelAndView list(Model model, @RequestParam Map<String, Object> paramMap, @RequestParam Long adGroupId, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "5") int pageSize){ Map<String, Object> context = getRootMap(); StudentModel model = new StudentModel(); context.put("model", model); return ModelAndView("stu/studentList", context); }ModelAndView有7个构造方法,在这里使用ModelAndView(viewName, model) 这个方法:
ModelAndView(viewName, model):
第一个参数:指定页面要跳转的view视图路径
第二个参数:指定了要项前台传递的参数,在前台可以这样取值 ${xxxx!}
也可以自己手动拼接,类似于redirect
方式二:返回String
@RequestMapping("/list") public String list(Model model, @RequestParam Map<String, Object> paramMap, @RequestParam Long adGroupId, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "5") int pageSize){ return "redirect:/toList?page="+page+"&pageSize="+pageSize; }
注意:这种方式在传输汉字时,会出现接收方取值为空或乱码的问题,解决办法为:
java.net.URLEncoder.encode(String,"UTF-8");
String searchValue = ""; try{ searchValue =java.net.URLEncoder.encode(String.valueOf(paramMap.get("searchValue")),"UTF-8"); } catch (UnsupportedEncodingException e1){ // TODO Auto-generated catch block e1.printStackTrace(); }
方式三:使用RedirectAttributes(要求:spring版本3.1及以上)
RedirectAttributes是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的,他有两种带参的方式:
第一种:
attr.addAttribute("param", value);
这种方式就相当于重定向之后,在url后面拼接参数,这样在重定向之后的页面或者控制器再去获取url后面的参数就可以了,但这个方式因为是在url后面添加参数的方式,所以暴露了参数,有风险,例:@RequestMapping("/list") public String list(Model model, @RequestParam Map<String, Object> paramMap, @RequestParam Long adGroupId, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "5") int pageSize, RedirectAttributes redirectAttributes){ redirectAttributes.addAttribute("page",page,); redirectAttributes.addAttribute("pageSize",pageSize,); return "redirect:/toLis"; }第二种:
attr.addFlashAttribute("param", value);
这种方式也能达到重新向带参,而且能隐藏参数,其原理就是放到session中,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢掉
@RequestMapping("/list") public String list(Model model, @RequestParam Map<String, Object> paramMap, @RequestParam Long adGroupId, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "5") int pageSize, RedirectAttributes redirectAttributes){ redirectAttributes.addFlashAttribute("page", page); redirectAttributes.addFlashAttribute("pageSize", pageSize); return "redirect:/toLis"; }
使用RedirectAttributes传参的好处在于:第一,不用再url后面拼接参数;第二中文传值不会出现乱码或空值,也就不需要用“java.net.URLEncoder.encode(String,"UTF-8");”进行字符格式转译
如果在使用RedirectAttributes时报以下错误:
java.lang.IllegalStateException: Argument [RedirectAttributes] is of type Model
解决方法:在spring-mvc.xml文件里加上这个标签:<mvc:annotation-driven />
该解决办法的详细网址:http://blog.csdn.net/zzj806683450/article/details/24598803