我是靠谱客的博主 英勇煎蛋,最近开发中收集的这篇文章主要介绍SpringMVC笔记(3):数据绑定,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基本数据类型


以int为例,后台需要int类型的参数,直接在业务方法定义处添加int类型的形参即可,http请求参数名必须与形参名一致。

@ResponseBody注解直接返回字符串到前端,不需要返回jsp页面。


    @RequestMapping(value="/baseType")
   @ResponseBody
   public String baseType(int id){
       return "id:"+id;
   }


测试,http请求不带参数,直接报500错误。




错误原因:




可选的参数“id”不能转为null,因为我们都知道,基本数据类型不能赋值null。


测试:参数类型为字符串。




400错误,错误原因:




String类型不能转换为int类型。


正确使用:




包装类


    @RequestMapping(value="/packageType")
   @ResponseBody
   public String packageType(Integer id){
       return "id:"+id;
   }


测试:不传参数。




没有报错,直接打印null,因为包装类可以赋值null。


测试:参数类型为字符串。




400错误,错误原因:



String类型不能转换为Integer类型。


正确使用:




参数列表添加@RequestParam注解,可以对参数进行相关设置。


    @RequestMapping(value="/packageType")
   @ResponseBody
   public String packageType(@RequestParam(value="id",required=false,defaultValue="1") Integer id){
       return "id:"+id;
   }


@RequestParam

value="id":将http请求中名为id的参数与形参进行映射。

required=false:id参数非必填,可省略。

defaultValue="1":若http请求中没有id参数,默认值为1。





修改代码:required=true,删除defaultValue参数。


    @RequestMapping(value="/packageType")
   @ResponseBody
   public String packageType(@RequestParam(value="id",required=true) Integer id){
       return "id:"+id;
   }


再次运行。




报错,因为id为必填参数,此时前端没有传id参数,同时业务方法中id也没有默认值,所以报错。

若前端传id或者id有dafaultValue,程序不会报错。


数组


    @RequestMapping(value="/arrayType")
   @ResponseBody
   public String arrayType(String[] name){
        StringBuffer sbf = new StringBuffer();
        for(String item:name) {
            sbf.append(item).append(" ");
        }
       return "name:"+sbf.toString();
   }



POJO


1.创建User类。


    public class User {
   private String name;
   private int age;
   public int getAge() {
       return age;
   }
   public void setAge(int age) {
       this.age = age;
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   @Override
   public String toString() {
       return "User [name=" + name + ", age=" + age + "]";
   }

}


2.JSP页面input标签的name值与实体类的属性名对应。


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   <form action="pojoType" method="post">
       姓名:<input type="text" name="name"/><br/>
       年龄:<input type="text" name="age"/><br/>
       <input type="submit" value="提交"/>
   </form>
</body>
</html>


3.业务方法。


    @RequestMapping(value="/pojoType")
   @ResponseBody
   public String pojoType(User user){
       return "注册用户信息:"+user;
   }


4.运行。






处理@ResponseBody中文乱码:


在springmvc.xml中配置消息转换器。


    <mvc:annotation-driven >
       <!-- 消息转换器 -->
       <mvc:message-converters register-defaults="true">
         <bean class="org.springframework.http.converter.StringHttpMessageConverter">
           <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
         </bean>
       </mvc:message-converters>
   </mvc:annotation-driven>


POJO级联关系


1.创建Address类。


    public class Address {
   private int id;
   private String name;
   public int getId() {
       return id;
   }
   public void setId(int id) {
       this.id = id;
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   @Override
   public String toString() {
       return "Address [id=" + id + ", name=" + name + "]";
   }

}


2.修改User类,添加address属性。


    public class User {
   private String name;
   private int age;
   private Address address;

   public Address getAddress() {
       return address;
   }
   public void setAddress(Address address) {
       this.address = address;
   }
   public int getAge() {
       return age;
   }
   public void setAge(int age) {
       this.age = age;
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   @Override
   public String toString() {
       return "User [name=" + name + ", age=" + age + ", address=" + address
               + "]";
   }

}


3.修改JSP,添加address信息,为input标签的name设置属性级联,即先关联User的address属性,再级联address的id和name。


    <form action="pojoType" method="post">
       姓名:<input type="text" name="name"/><br/>
       年龄:<input type="text" name="age"/><br/>
       地址编号:<input type="text" name="address.id"/><br/>
       地址:<input type="text" name="address.name"/><br/>
       <input type="submit" value="提交"/>
   </form>


4.运行。






List


SpringMVC不支持List类型的直接转换,需要包装成Object。

List的自定义包装类:


    public class UserList {
   private List<User> users;

   public List<User> getUsers() {
       return users;
   }

   public void setUsers(List<User> users) {
       this.users = users;
   }

}


业务方法:


    @RequestMapping(value="/listType")
   @ResponseBody
   public String listType(UserList userList){
       StringBuffer sbf = new StringBuffer();
       for(User user:userList.getList()){
           sbf.append(user);
       }
       return "用户:"+sbf.toString();
   }


创建addList.jsp,同时添加三个用户信息,input的name指向自定义包装类UserList中的users属性,级联到name和age,同时以下标区分集合中不同的对象。


    <form action="listType" method="post">
       用户1姓名:<input type="text" name="users[0].name"/><br/>
       用户1年龄:<input type="text" name="users[0].age"/><br/>
       用户2姓名:<input type="text" name="users[1].name"/><br/>
       用户2年龄:<input type="text" name="users[1].age"/><br/>
       用户3姓名:<input type="text" name="users[2].name"/><br/>
       用户3年龄:<input type="text" name="users[2].age"/><br/>
       <input type="submit" value="提交"/>
   </form>



执行代码。






Set


和List一样,需要封装自定义包装类,将Set集合作为属性。不同的是,使用Set集合,需要在包装类构造函数中,为Set添加初始化对象。


    public class UserSet {
   private Set<User> users = new HashSet<User>();

   public Set<User> getUsers() {
       return users;
   }

   public void setUsers(Set<User> users) {
       this.users = users;
   }

   public UserSet(){  
       users.add(new User());  
       users.add(new User());  
       users.add(new User());  
   }
}


业务方法:


    @RequestMapping(value="/setType")
   @ResponseBody
   public String setType(UserSet userSet){
       StringBuffer sbf = new StringBuffer();
       for(User user:userSet.getUsers()){
           sbf.append(user);
       }
       return "用户:"+sbf.toString();
   }


JSP,用法与List一样,input标签的name指向Set内对象的属性值,通过下标区分不同的对象。


   <form action="setType" method="post">
       用户1姓名:<input type="text" name="users[0].name"/><br/>
       用户1年龄:<input type="text" name="users[0].age"/><br/>
       用户2姓名:<input type="text" name="users[1].name"/><br/>
       用户2年龄:<input type="text" name="users[1].age"/><br/>
       用户3姓名:<input type="text" name="users[2].name"/><br/>
       用户3年龄:<input type="text" name="users[2].age"/><br/>
       <input type="submit" value="提交"/>
   </form>


执行代码。






Map


自定义包装类:


    public class UserMap {
   private Map<String,User> users;

   public Map<String, User> getUsers() {
       return users;
   }

   public void setUsers(Map<String, User> users) {
       this.users = users;
   }

}


业务方法,遍历Map集合的key值,通过key值获取value。


    @RequestMapping(value="/mapType")
   @ResponseBody
   public String mapType(UserMap userMap){
       StringBuffer sbf = new StringBuffer();
       for(String key:userMap.getUsers().keySet()){
           User user = userMap.getUsers().get(key);
           sbf.append(user);
       }
       return "用户:"+sbf.toString();
   }


JSP,与List和Set不同的是,不能通过下标区分不同的对象,改为通过key值区分。


    <form action="mapType" method="post">
       用户1姓名:<input type="text" name="users['a'].name"/><br/>
       用户1年龄:<input type="text" name="users['a'].age"/><br/>
       用户2姓名:<input type="text" name="users['b'].name"/><br/>
       用户2年龄:<input type="text" name="users['b'].age"/><br/>
       用户3姓名:<input type="text" name="users['c'].name"/><br/>
       用户3年龄:<input type="text" name="users['c'].age"/><br/>
       <input type="submit" value="提交"/>
   </form>


执行代码。





JSON


JSP:Ajax请求后台业务方法,并将json格式的参数传给后台。


<script type="text/javascript">
   var user = {
           "name":"张三",
           "age":22
   };
   $.ajax({
       url:"jsonType",
       data:JSON.stringify(user),
       type:"post",
       contentType: "application/json;charse=UTF-8",
       dataType:"text",
       success:function(data){
           var obj = eval("(" + data + ")");
           alert(obj.name+"---"+obj.age);
       }
   })
</script>


注意

1.json数据必须用JSON.stringify()方法转换成字符串。

2.contentType不能省略。

业务方法:


    @RequestMapping(value="/jsonType")
   @ResponseBody
   public User jsonType(@RequestBody User user){
       //修改年龄
       user.setAge(user.getAge()+10);
       //返回前端
       return user;
   }


@RequestBody注解

读取http请求参数,通过SpringMVC提供的HttpMessageConverter接口将读取的参数转为json,xml格式的数据,绑定到业务方法的形参。


@ResponseBody注解

将业务方法返回的对象,通过HttpMessageConverter接口转为指定格式的数据,json,xml等,响应给客户端。


我们使用的是阿里的fastjson来取代Spring默认的Jackson进行数据绑定。

fastjson的优势在于如果属性为空就不会将其转化为json,数据会简洁很多。


如何使用fastjson

1.pom.xml引入fastjson依赖jar包。


    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.18</version>
  </dependency>


2.springmvc.xml中配置fastjson。


   <mvc:annotation-driven >
       <!-- 消息转换器 -->
       <mvc:message-converters register-defaults="true">
         <bean class="org.springframework.http.converter.StringHttpMessageConverter">
           <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
         </bean>
         <!-- 阿里fastjson -->
         <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"/>
       </mvc:message-converters>
   </mvc:annotation-driven>


运行代码。





前端传给后台的数据age=22,后台对age进行修改,并将修改的结果返回给前端,我们在前端页面看到age=32,修改成功。


源码:


链接: https://pan.baidu.com/s/1nwLjpJb 

密码: i1rw

最后

以上就是英勇煎蛋为你收集整理的SpringMVC笔记(3):数据绑定的全部内容,希望文章能够帮你解决SpringMVC笔记(3):数据绑定所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部