6.4 自定义类型转换器(以日期为例)
(1)问题场景
前端传递日期字符串(如2024-01-01),后端用Date类型接收时会报错,需自定义转换器。
(2)实现转换器
java
import org.springframework.core.convert.converter.Converter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.parse(source);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
(3)配置转换器
XML
<!-- 开启注解驱动并指定转换器 -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 配置转换器工厂 -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.hg.converter.DateConverter"></bean>
</set>
</property>
</bean>
6.5 ServletAPI 接收参数
java
@RequestMapping("/findAccount8")
public String findAccount8(HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("username");
String age = request.getParameter("age");
request.setAttribute("msg", username + " " + age);
return "success";
}
七、数据传递方式
7.1 ModelAndView 传递
java
@RequestMapping("/findAccount9")
public ModelAndView findAccount9(ModelAndView mv) {
mv.addObject("msg", "ModelAndView传递数据");
mv.setViewName("success");
return mv;
}
7.2 Model 传递
java
@RequestMapping("/findAccount10")
public String findAccount10(Model model) {
model.addAttribute("msg", "Model传递数据");
return "success";
}
7.3 ServletAPI 传递
java
@RequestMapping("/findAccount11")
public String findAccount11(HttpServletRequest request) {
request.setAttribute("msg", "ServletAPI传递数据");
return "success";
}
八、JSON 数据交互
8.1 添加 JSON 依赖
XML
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
8.2 核心注解
@RequestBody:接收前端 JSON 字符串,转为 Java 对象@ResponseBody:将 Java 对象转为 JSON 字符串,响应给前端
8.3 案例实现
(1)控制器方法
java
@RequestMapping("/saveAccount2")
@ResponseBody
public Map<String, Object> saveAccount2(@RequestBody Account account) {
Map<String, Object> map = new HashMap<>();
map.put("status", 200);
map.put("msg", account);
return map;
}
(2)前端 AJAX 请求
html
<input type="button" value="测试JSON交互" onClick="testJson()"/>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script type="text/javascript">
function testJson() {
axios.post('/account/saveAccount2', {
"id": 1,
"name": "张三",
"money": 999.0,
"address": {
"provinceName": "北京",
"cityName": "朝阳区"
}
}).then(response => {
if (response.data.status === 200) {
alert(response.data.msg.name);
}
}).catch(error => console.error('请求失败:', error));
}
</script>
九、总结
本文详细讲解了 SpringMVC 的入门核心知识点,包括:
- SpringMVC 的核心优势与 MVC 设计模式
- 从零搭建 SpringMVC 工程环境
- 核心组件与执行流程
- RequestMapping 注解、参数接收、数据传递
- JSON 数据交互
掌握这些知识点,即可完成 SpringMVC 基础开发。后续将继续讲解拦截器、文件上传、异常处理等高级特性,敬请关注!
附:常见问题解决
- 中文乱码:POST 请求配置 CharacterEncodingFilter,GET 请求配置 Tomcat 的 uriEncoding
- 日期转换失败:自定义类型转换器并配置
- 404 错误:检查视图解析器前缀 / 后缀、文件路径、访问 URL 是否正确
- 405 错误:请求方式与 @RequestMapping 的 method 属性不匹配