欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-07 18:35:54
...

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).