SpringMVC数据绑定二(自定义数据类型与复杂数据类型对象)

1、自定义数据类型
实体类:

public class Dog  {
  private Float weight;
  private Integer age;
  private String sex;
  ......(set get 方法)
  }

JSP页面:

  <label>Ajax</label>
  <br>
  <label>体重:</label><input type="text" id="dweight" name="weight">
  <label>年龄:</label><input type="text" id="dage" name="age">
  <label>性别:</label><input type="text" id="dsex" name="sex">
  <input type="button" id="subDog" value="提交">

JS中ajax提交方法:

  $("#subDog").click(function(){
      console.log($("#age").val());
      $.ajax({
          url:'dog.do',
          type:'post',

          data:{
              weight:$("#dweight").val(),
              age:$("#dage").val(),
              sex:$("#dsex").val()
          },
          success:function(){
              alert('success');
          },
          error:function(){
              alert('error');
          }
      });
  });

Controller:

     @RequestMapping(value="dog.do")
     @ResponseBody
     public String dogInf(Dog dog){
         System.out.println("体重:"+dog.getWeight());
         System.out.println("年龄:"+dog.getAge());
         System.out.println("性别:"+dog.getSex());
        return "";
     }

自定义简单数据类型使用ajax传输,并与SpringMVC进行交互数据绑定,其实现与原理都简单易懂,与用名称绑定对应规则类似,就是ajax传递的json数据键值对 key要与后台实体类的属性名称一样。(与后台数据绑定不一定非名称一致可以使用@RequesParam())
可以发现其实自定义数据类型对象绑定比较容易理解。
2、自定义复杂数据类型对象:
实体类:

public class Dog  {
  private Float weight;
  private Integer age;
  private String sex;
  ......(set get 方法)
  }
public class UserDog {
   private String name;
   private Integer age;
   private String address;
   private Dog dog;
     ......(set get 方法)
  }

JSP页面:

     <label>主人姓名:</label> <input type="text" id="name" name="name"> 
     <label>主人年龄:</label> <input type="text" id="age" name="age">
     <label>主人地址:</label> <input type="text" id="address" name="address">  <br>
     <label>狗的重量:</label> <input type="text" id="dweight" name="dweight">
     <label>狗的年龄:</label> <input type="text" id="dage" name="dage">
     <label>狗的性别:</label> <input type="text" id="dsex" name="dsex">
      <br>
     <input type="button" id="subUserDog" value="提交" >

JS中ajax提交方法:

  $("#subUserDog").click(function(){
      $.ajax({
          url:'userdog.do',
          type:'post',
          contentType:"application/json",
          data:JSON.stringify({
              name:$("#name").val(),
               age:$("#age").val(),
               address:$("#address").val(),
               dog:{
                   age:$("#dage").val(),
                   weight:$("#dweight").val(),
                   sex:$("#dsex").val()
               }
          }),
          success:function(data){

              alert('success');
          },
          error:function(){
              alert('error');
          }

      });
  });

Controller:

  @RequestMapping(value="userdog.do")  
  @ResponseBody
   public String userDog(@RequestBody UserDog userDog){
       System.out.println("主人姓名:"+userDog.getName());
       System.out.println("主人年龄:"+userDog.getAge());
       System.out.println("主人地址:"+userDog.getAddress());
       System.out.println("狗的重量:"+userDog.getDog().getWeight());
       System.out.println("狗的年龄:"+userDog.getDog().getAge());
       System.out.println("狗的性别:"+userDog.getDog().getSex());
       System.out.println(userDog.toString());
      System.out.println("-----------");
       return "Y";
   }

这里说一下本人在这里遇到了很多坑,复杂类型网上也找了方法也成功,一直是415 不支持的媒体类型,后来引入前端引入接送json2.js或者后台导入Jackson包,突然发现数据绑定成功,后来想了哪个配置文件才是必要的,结果一试配置文件直到注消都可以运行,然后就顺着把导入的jackson包也remove 一切OK,说明上面代码可以顺利执行。
现在说一下上面的要点:

  1. 这里使用嵌套json字符串需要向后台指明传输的数据类型: contentType:”application/json”;
  2. 使用js自带支持json函数JSON.stringify(),它的作用是把json对象转化为对应的字符串(说明ajax data参数只能把简单的json对象转为对应的字符串),当然还有一个作用相反把json字符串转为对应的json对象的函数JSON.parse()。
  3. 关于ajax请求,在Controller中最好有返回值,如果有跳转页面就直接跳转页面,如果没有可以返回字符串(函数上面加注解标记@ResponseBody,来告诉SpringMVC这个返回的不是视图层页面,而是数据。否则有些操作明明后台已经执行结束,却一直进入ajax回调函数error中,通过前端调试发现有一个请求404找不到,就是ajax默认需要一个跳转页面)。

PS:对于上面的复杂自定义数据类型数据绑定,如果不使用ajax就比较方便多了。
实体类:class Dog{……},class UserDog{……}不变,后台Controller代码不变,只需要修改jsp页面即可,同时也不需要ajax代码段。
JSP页面:

  <br>
  <form action="userdog.do" method="post">
     <label>主人姓名:</label> <input type="text" id="name" name="name"> 
     <label>主人年龄:</label> <input type="text" id="age" name="age">
     <label>主人地址:</label> <input type="text" id="address" name="address">  <br>
     <label>狗的重量:</label> <input type="text" id="dog.weight" name="dog.weight">
     <label>狗的年龄:</label> <input type="text" id="dog.age" name="dog.age">
     <label>狗的性别:</label> <input type="text" id="dog.sex" name="dog.sex">
      <br>
     <input type="submit" id="subUserDog">
  </form>

这里同样需要注意的是,绑定是根据Form表单里面文本框的属性值name进行绑定的,name值要与UserDog属性值名称一样,对于属性是对象的属性,name值为属性对象名.属性对象的属性(比如:dog.weight).

猜你喜欢

转载自blog.csdn.net/qq_26564827/article/details/78279189