@RequestMapping(value = "/submit")
public String submit(RedirectAttributes attr,HttpServletRequest request) throws IOException {
    /*通过RequestContextHolder获取request,(ServletRequestAttributes)(RequestContextHolder.getRequestAttributes())).getRequest()*/
    //方法1:通过request获取到flashMap,把参数设置到flashMap中,spring会自动将其设置到model中
    FlashMap flashMap = (FlashMap)request.
            getAttribute(DispatcherServlet.OUTPUT_FLASH_MAP_ATTRIBUTE);
    flashMap.put("name", "张三丰");
    //方法2:通过传入的attr参数的addFlashAttribute方法保存到FlashMap中,和方法一效果一样
    attr.addFlashAttribute("ordersId", "1234");
    //方法3:通过attr参数的addAttribute方法设置,这样设置的参数不会保存在FlashMap中,而是会保存到url中
    attr.addAttribute("local","zh-cn");
    return "redirect:showorders ";
}
@RequestMapping(value = "/showorders")//用注解ModelAttribute把model中的参数传入
public String showOrders(@ModelAttribute("name")String  name,@ModelAttribute("ordersId")String ordersId,Model model,String local) throws IOException {
    logger.info("name:{},ordersId:{},local:{}",new Object[]{name,ordersId,local});
    return "orders";
}

这个时候,运行会报错,报错如下:

<span style="font-size:18px;">Spring mvc redirect传递参数时异常</span>  
java.lang.IllegalStateException: Argument [RedirectAttributes] is of type Model or Map but is not assignable from the actual model. You may need to switch newer MVC infrastructure classes to use this argument.  
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:322)  
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)  
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:439)  
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:427)  
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)  
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)  
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915)  
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:822)  
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)  
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796)  
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)  
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)  

这个是页面获取参数使用EL表达式${bankcarNum}时出现了上述异常信息。

解决办法依次如下:

在spring配置文件里面加入:

xmlns:mvc="http://www.springframework.org/schema/mvc" 

xsi:schemaLocation中加入:

http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 

同时还需要加上

<mvc:annotation-driven/> 

此时,错误将不再出现了,但是页面并未取得预想的值。按照网上的说法应该是版本的问题了,将spring的配置文件版本均改为3.1支持。

还是没有取到值,但是发现在没改和改版本之前URL地址上多了一个参数:

http://localhost:8080/springMVC/account/bindCard.jsp?bankcarNum=6225476871951904

附加:

  • 这个问题一直放在草稿箱,也没有去处理,如今,算是搞清楚这里的意思了。
  • 前面已经提到,url地址有变化(附带着参数),其实已经成功了。不过要在页面取到值,需要做一点点变化
  • 要用到 EL 表达式就可以取到值了,同时如果传递中文,出现乱码的话(首先确保我的springMVC
  • 有设置过滤器,编码格式为UTF-8,这种其实只是设置了,前台往后台参数传递的编码过滤,而tomcat容器向页面传递参数却没有配置),那么这种情况需要修改tomcat安装目录下的server.xml中的<connector标签下(之前改过8080端口的那个地方)加上URIEncoding=”UTF-8″就OK了!
  • 还有一个问题就是,当redirect传递参数时,自定义的对象在页面好像取不到值。后面有机会再来解决!