这份是给公司应届毕业生培训的一份文章,先规范一下公司的Spring MVC数据传输的方式,和绑定类的规则,并给他们了解一下用法;

 

SPring MVC 一下组件认识:

   在了解Spring MVC 参数传值之前,可以了解一下SPring MVC 一下组件:

     @Controller

       http://www.cnblogs.com/xiepeixing/p/4243288.html

      @RequestMapping("/session")

         http://blog.csdn.net/kobejayandy/article/details/12690041

      @SessionAttributes(value="user")

         http://blog.csdn.net/li_xiao_ming/article/details/8349178

      @ModelAttribute

         http://hbiao68.iteye.com/blog/1948380

      @RequestParam

           http://www.cnblogs.com/wangchuanfu/p/5913310.html

@RequestBody, @ResponseBody 注解详解(转)

@RequestParam @RequestBody @PathVariable 等参数绑定注解详解(转)

@RequestMapping 用法详解之地址映射(转)

首先介绍ModelMap和ModelAndView的作用 

   ModelMap 

      ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数: 
     map.addAttribute("p1", p1);//往页面传递
在页面上可以通过el变量方式

  ModelAndView 

 ModelAndView对象有两个作用: 
    作用一 设置转向地址,如下所示(这也是ModelAndView和ModelMap的主要区别) 
           ModelAndView view = new ModelAndView("path:ok"); 

      作用二 用于传递控制方法处理结果数据到结果页面,也就是说我们把需要在结果页面上需要的数据放到ModelAndView对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数: 

       addObject(String key,Object value); 

 

错误的传参方式及正确的写法:

  错误提示: WARN,http-apr-80-exec-37,05-17 17:18:50.835,csrf.CsrfFilter.doFilterInternal:93 – Invalid CSRF token null found for

       由于公司采用CSRF过滤, POST请求必须携带csrfc密钥参数过去,正确的使用方式是带上csrfc密钥参数  

错误写法一:

  前端写法:

   image.png

  后端接收:

@RequestMapping(value="user")
public void user(User user,ModelMap map){
    System.out.println(user.toString());
}

 输出的结果:

    User [userName=null, password=null]

    那么在后台接受到的参数中,user对象的userName 属性是null。 如果将input name换成 name="username",就可以获取到对象的属性值了,

这里必须用name="test"而不是user.name="test",因为默认情况下springMVC是不支持user.name这种传参方式的。

那怎么那么可以采用user.userName传值了???

   方式一:

@InitBinder("user")    
    public void initBinder(WebDataBinder binder) {    
            binder.setFieldDefaultPrefix("user.");    
  }

   这种方式就可以通过user.userName参数传递;

错误写法二:

     前端使用jQuery向后台传递数组类型的参数,Java后台直接通过list类型接收,会发现无法取到参数的情况。

     ERROR:Failed to instantiate [java.util.List]: Specified class is an interface

    image.png 

     以数组接收:是可以通过,但是没有带上@RequestParam("str[]") , 是获取不了值的,如下;

 image.png 

    那怎么写法才是对的了 ???

    正确方式:

  image.png 

   前端Form写法:

 image.png 

    前端JS写法:

    image.png 

错误写法三:

      "415 Unsupported Media Type" 后台采用Json格式介绍,Ajax未设定内容格式;

    image.png 

     这种方式必须是:post 请求参数设置,是不是必须的json 格式,

      否则:415 Unsupported Media Type

     前端写法:

    image.png

 
还有一些奇葩的写法:

image.png

image.png

 

错误写法四:如上雷同;

  image.png 

    ERROR:Failed to instantiate [java.util.List]: Specified class is an interface
   
spring在注入的时候,不允许注入一个List类型的对象。

   解决方式一:

       需要自己新建一个该对象数组的类用于引用。

   image.png

image.png

    切记:

          后台接收数据时,对象数组的命名一定要与前端传过来的参数命名一致,例如:前端对象数组的命名是users,后台接收数据时,在创建UserList实体类的时候,他的属性List<User>  users 命名必须也是users,否则参数无法成功传递。这种方式只能以 users[0].userName,格式传送参数,Ajax的方式也是一样的;

    方式二:

  在表单提交之前,把表单序列化成JSON格式传到后台,在来解析封装成List<User>,这样省下来的[][],繁琐方式,但是这种方式 要使用MappingJacksonHttpMessageConverter这个消息转换器

后端写法:

  image.png

     切记:这种方式需要在前端指明, contentType: 'application/json;charset=utf-8', 还有数据必须Json格式化;

  image.png

JS Json格式化:

   jQuery.parseJSON(result); 将String 转换成JSON格式

   JSON.stringify(product) 将Json 转换成String格式


简单的整理,不喜误喷!

 

发表评论