来源:https://www.bilibili.com/video/BV1GE411d7KE?p=3
上一节:https://blog.csdn.net/qq_40893824/article/details/107055793
下一节:https://blog.csdn.net/qq_40893824/article/details/107229346
数据绑定由 HandlerAdapter 完成
绑定 基本数据类型
1 controller 中,新建 实现类 DataBindHandler,加入代码:
package com.southwind.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/data")
public class DataBindHandler {
@RequestMapping("/baseType")
@ResponseBody
public String baseType(int id){
return id + "";
}
}
![](https://img-blog.csdnimg.cn/20200706185923129.png)
有 @ResponseBody
,springMvc 会把值 直接返回给客户端
无 @ResponseBody
,springMvc 会把值传给 DispatcherServlet,DisptacherServlet 调用 ViewResolver,对解析返回值,映射 JSP 资源
2 重启 tomcat,进入 http://localhost:8080/data/baseType?id=1
绑定 包装类
绑定基本数据类型(int
),必须传参,绑定包装类(Integer
)可以不传参
1 DataBindHandler 中,添加代码:
@RequestMapping("/packageType")
@ResponseBody
public String packageType(Integer id){
return id + "";
}
![](https://img-blog.csdnimg.cn/20200707084919221.png)
包装类可接收 null,当 HTTP 请求无参数,包装类定义形参的数据类型,不会抛出异常
2 重启 tomcat,进入 http://localhost:8080/data/packageType
进入 http://localhost:8080/data/packageType?id=5
3 赋默认值
3.1 在 DataBindHandler 中,添加代码:
@RequestParam(value = "num", required = false, defaultValue = "0")
参数 | 解释 |
---|---|
value | http 请求时用的http://localhost:8080/data/packageType?num=4 |
required | true:value - num 必须赋值 false:value - num 可以不赋值,此时要有defaultValue |
defaultValue | value - num 没赋值时 的默认值 |
![](https://img-blog.csdnimg.cn/20200707085842958.png)
3.2 重启 tomcat,进入 http://localhost:8080/data/packageType
进入 http://localhost:8080/data/packageType?num=4
绑定 数组
包装类不能接收 1 个参数的多个值,数组可以
1 DataBindHandler 中,添加代码:
@RequestMapping("/array")
@ResponseBody
public String array(String[] name){
String str = Arrays.toString(name);
return str;
}
![](https://img-blog.csdnimg.cn/20200707092227326.png)
2 重启 tomcat,进入 http://localhost:8080/data/array?name=3&name=4&name=qwe
绑定 List
Spring MVC 不支持 List 类型的直接转换,List 集合需要进行包装
1
entity 中,新建 UserList,加入代码:
DataBindHandler
webapp 中,addList
重启 tomcat,进入 http://localhost:8080/addList.jsp
@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>
![](https://img-blog.csdnimg.cn/20200709072919835.png)
![](https://img-blog.csdnimg.cn/2020070907295874.png)
绑定 Map
1 entity 中,新建实体类 UserMap,加入代码:
package com.southwind.entity;
import lombok.Data;
import java.util.Map;
@Data
public class UserMap {
private Map<String, User> users;
}
![](https://img-blog.csdnimg.cn/20200709080457662.png)
2 DataBindHandler 中,添加代码:
@RequestMapping("/map")
@ResponseBody
public String map(UserMap userMap){
StringBuffer str = new StringBuffer();
for(String key:userMap.getUsers().keySet()){
User user = userMap.getUsers().get(key);
str.append(user);
}
return str.toString();
}
![](https://img-blog.csdnimg.cn/2020070908061815.png)
3 webapp 中,新建 addMap.jsp,加入代码:
<form action="/data/map" method="post">
用户1编号:<input type="text" name="users['a'].id" /><br/>
用户1名称:<input type="text" name="users['a'].name" /><br/>
用户2编号:<input type="text" name="users['b'].id" /><br/>
用户2名称:<input type="text" name="users['b'].name" /><br/>
用户3编号:<input type="text" name="users['c'].id" /><br/>
用户3名称:<input type="text" name="users['c'].name" /><br/>
<input type="submit" value="提交"/>
</form>
![](https://img-blog.csdnimg.cn/20200709080757848.png)
4 重启 tomcat,进入 http://localhost:8080/addMap.jsp
绑定 Json
1 webapp 中,新建文件夹 js,把 jquery-3.5.1.min.js 粘贴进 js 中
2 webapp 中,新建 json.jsp,加入代码:
<script type="text/javascript" src="js/jquery-3.5.1.min.js"></script>
<script type="text/javascript">
$(function(){
alert(123);
})
</script>
![](https://img-blog.csdnimg.cn/20200709085921130.png)
静态资源加载 会被拦截,解决:
3 WEB-INF/ web.xml 中,加入代码:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
![](https://img-blog.csdnimg.cn/20200709090059433.png)
4 rebuild 工程,再重启 tomcat,进入 http://localhost:8080/json.jsp
5 json.jsp 中,注释 +加入代码:
<script type="text/javascript">
$(function () {
var user = {
"id":1,
"name":"张三"
};
$.ajax({
url:"/data/json",
data:JSON.stringify(user),
type:"POST",
contentType:"application/json;charset=UTF-8",
dataType:"JSON", //返回数据
success:function(data){
alert(data.id + " --- " + data.name);
}
})
});
</script>
![](https://img-blog.csdnimg.cn/20200709093402739.png)
6 DataBindHandler 中,加入代码:
@RequestMapping("/json")
@ResponseBody
public User json(@RequestBody User user){
System.out.println(user);
user.setId(6);
user.setName("张六");
return user;
}
![](https://img-blog.csdnimg.cn/20200709093519583.png)
jsp 中 json 数据 无法转成 DataBindHandler 的 java 对象,解决:
7 pom 文件中,添加代码:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
![](https://img-blog.csdnimg.cn/20200709093612618.png)
依赖 爆红,解决:https://blog.csdn.net/goquesting/article/details/78422964
8 springmvc.xml 中,添加代码:
<!-- 配置 fastjson -->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean>
![](https://img-blog.csdnimg.cn/20200709093703819.png)
9 rebuild 工程,再重启 tomcat,进入 http://localhost:8080/json.jsp
上一节:https://blog.csdn.net/qq_40893824/article/details/107055793
下一节:https://blog.csdn.net/qq_40893824/article/details/107229346