Spring MVC 学习笔记 第三章 Spring MVC数据绑定
数据绑定:在后端的业务方法中直接获取客户端HTTP请求中的参数,将请求参数映射到业务方法的形参中,Spring MVC中数据绑定的工作是由HandlerAdapter来完成的。
1.基本数据类型
@RequestMapping("/baseType")
@ResponseBody
public String baseType(int id){
return id+"";
}
@ResponseBody表示Spring MVC会直接将业务方法的返回值响应给客户端,如果不加@ResponseBody注解,Spring MVC会将业务方法的返回值传递给DispatcherServlet,再由DispatcherServlet调用ViewResolve对返回值进行解析,映射到一个JSP资源。
2.包装类
@RequestMapping("/packageType")
@ResponseBody
public String packageType(@RequestParam(value="num",required = false,defaultValue = "0") Integer id){
return id+"";
}
包装类可以接收null,当HTTP请求没有参数时,使用包装类定义形参的数据类型,程序不会抛出异常。
@RequestParam
属性 | 说明 |
---|---|
value=”num” | 将HTTP请求中名为num的参数赋值给形参id。 |
requried | 设置num是否为必填项,true为必填,false为非必填,可以省略。 |
defaultValue = “0” | 如果HTTP请求中没有num参数,默认值为0。 |
3.数组
@RequestMapping("/arrayType")
public String arrayType(String[] name){
String str = Arrays.toString(name);
return str;
}
@RestController表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析。
@Controller表示该控制器的每一个业务方法的返回值都会交给视图解析器进行解析,如果只需要响应给客户端,而不需要在对应的业务方法定义处添加@ResponseBody。
在类名前添加@RestController注解
@RestController
@RequestMapping("/data")
public class DataBindHandler {
。。。
}
与在具体方法前添加@ResponseBody注解
@RequestMapping("/arrayType")
@ResponseBody
public String arrayType(String[] name){
。。。
}
是一样的。
4.JavaBean
方法参照上一章。
5.List集合
Spring MVC不支持List类型的的直接转换,需要对List集合进行包装。
集合封装类:
package com.fw.entity;
import lombok.Data;
import java.util.List;
@Data
public class UserList {
private List<User> users;
}
JSP:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/data/listType" method="post">
用户1编号:<input type="text" name="users[0].id"><br>
用户1名称:<input type="text" name="users[0].name"><br>
用户2编号:<input type="text" name="users[2].id"><br>
用户2名称:<input type="text" name="users[2].name"><br>
用户3编号:<input type="text" name="users[3].id"><br>
用户3名称:<input type="text" name="users[3].name"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
业务方法:
@RequestMapping("/listType")
public String listType(UserList userList){
StringBuffer str = new StringBuffer();
for(User user:userList.getUsers()){
str.append(user);
}
return str.toString();
}
处理@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"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
运行结果:
User(id=10, name=小红, address=null)User(id=0, name=null, address=null)User(id=20, name=小绿, address=null)User(id=30, name=小蓝, address=null)
6.Map
自定义封装类:
package com.fw.entity;
import lombok.Data;
import java.util.Map;
@Data
public class UserMap {
private Map<String,User> users;
}
业务方法:
@RequestMapping("/mapType")
public String mapType(UserMap userMap){
StringBuffer str = new StringBuffer();
for(String key:userMap.getUsers().keySet()){
User user = userMap.getUsers().get(key);
str.append(user);
}
return str.toString();
}
JSP:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/data/mapType" method="post">
用户1编号:<input type="text" name="users['a1'].id"><br>
用户1名称:<input type="text" name="users['a2'].name"><br>
用户2编号:<input type="text" name="users['b1'].id"><br>
用户2名称:<input type="text" name="users['b2'].name"><br>
用户3编号:<input type="text" name="users['c1'].id"><br>
用户3名称:<input type="text" name="users['c2'].name"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
name的users[‘a1’]的key值’a1’是可以自定义的。
for循环的每一次的user打印结果如下:
User(id=1, name=小红, address=null)
User(id=2, name=小黄, address=null)
User(id=3, name=小黑, address=null)
执行结果:
User(id=1, name=小红, address=null)User(id=2, name=小黄, address=null)User(id=3, name=小黑, address=null)
7.JSON
☼注:
需要事先导入jquery资源。例如:jquery-3.4.1.min.js。在网上自行下载,然后复制到webapp/js下即可。(js是自己建的package)
客户端发送JSON格式的数据,直接通过Spring MVC绑定到业务方法的形参中。
处理Spring MVC无法加载静态资源问题,在web.xml里添加配置即可。
web.xml:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
JSP:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$(function(){
var user={
"id":1,
"name":"张三"
};
$.ajax({
url:"/data/jsonType",
data:JSON.stringify(user),
type:"POST",
contentType:"application/json;charset=UTF-8",
dataType:"JSON",
success:function (data) {
alert(data.id + " / " + data.name);
}
})
});
</script>
</head>
<body>
</body>
</html>
业务方法:
@RequestMapping("/jsonType")
public User jsonType(@RequestBody User user){
System.out.println(user);
user.setId(123);
user.setName("小花");
return user;
}
Spring MVC中的JSON和JavaBean的转换需要借助fastjson,pom.xml引入相关依赖。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
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"></property>
</bean>
<!--配置fastjson-->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>