概述
基本数据类型
以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):数据绑定所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复