前言:本文旨在记录类型转换器的应用步骤,在实际开发中可能不具有使用意义。
一、案例分析
1、前端使用Ajax发送异步请求,请求方式POST,请求参数
student=小明_男_2019.5.18
2、实现类型转换器,将student字符串转换为student对象。
3、将转换的对象以json数据格式返回给前端,测试转换是否成功。
二、代码实现
student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生信息</title>
</head>
<body>
<label for="name">姓名:</label> <input id="name" type="text" ><br>
<label for="sex">性别:</label> <input id="sex" type="text" > <br>
<label for="birthday">生日</label> <input id="birthday" type="text" >
<button id="submit">提交</button>
<div id="submitResult"></div>
<script>
document.getElementById("submit").onclick = function () {
<!-- 组织参数为: student=小明_男_2019.5.18 格式-->
var params = "student=" + document.getElementById("name").value + "_" +
document.getElementById("sex").value + "_" +
document.getElementById("birthday").value;
<!-- 发送Ajax请求 -->
var req = new XMLHttpRequest();
req.open("POST", "/student", true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
req.send(params);
req.onreadystatechange = function () {
if (req.readyState === 4) {
if (req.status === 200) {
<!-- 显示请求处理结果 -->
document.getElementById("submitResult").innerText = req.responseText;
} else {
document.getElementById("submitResult").innerText = req.statusText;
}
}
}
}
</script>
</body>
</html>
Student.java
public class Student {
private String name;
private String sex;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
// 忽略 构造器和getter、setter方法;
}
Controller方法,为支持@ResponseBody需要添加jackson(或Gson、fastjson)依赖
@RequestMapping(value="/student", method = RequestMethod.POST)
@ResponseBody
public Student test(@RequestParam("student") Student student) {
return student;
}
以上代码主要目的是方便对类型转换器设计的理解,以下解释类型转化器使用的具体步骤。
使用类型转换器分为两步,
第一步:实现Converter<S, T>接口
org.springframework.core.convert.converter.Converter<S, T>,S表示源类型,T表示目标类型 在本案例中S:String ,T:Studentpublic class HttpParamsConverter implements Converter<String, Student> {
@Override
public Student convert(String params) {
Student student = new Student();
if (params != null && params.trim() != "") {
String[] val = params.split("_");
if (val != null && val.length == 3) {
student.setName(val[0]);
student.setSex(val[1]);
String[] date = val[2].split("\\."); // 点号需要转义
int y = Integer.parseInt(date[0]);
int m = Integer.parseInt(date[1]);
int d = Integer.parseInt(date[2]);
student.setBirthday(new Date(y - 1900, m - 1, d));
}
}
return student;
}
}
第一步:配置mvc:annotation-driven的属性conversionService
<bean id="httpParamsConverter" class="com.gzn.demo.convert.HttpParamsConverter"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="httpParamsConverter"/>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"/>
测试
请求参数: