数据交错了,如果没有回显,需要重新填写。(AJAX没有这个问题,如果用表单填写则需要处理)
一、手动数据回显
eg. 一个表单页面addstudent.jsp
<%--
Created by IntelliJ IDEA.
User: 86133
Date: 2022/1/18
Time: 10:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/addstudent2" method="post" >
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="name" value="${name}"></td>
</tr>
<tr>
<td>email</td>
<td><input type="text" name="email" value="${email}"></td>
</tr>
<tr>
<td>年龄</td>
<td><input type="text" name="age" value="${age}"></td>
</tr>
<tr>
<td><input type="submit" value="添加"></td>
</tr>
</table>
</form>
</body>
</html>
服务端填入字段,手动数据回显
这是利用简单数据类型去接收的,框架没有做任何工作
@PostMapping("/addstudent2")
public String addStudent2(String name, String email, Integer age, Model model)
{
model.addAttribute("name",name);
model.addAttribute("email",email);
model.addAttribute("age",age);
return "addstudent";
}
二、自动数据回显
回显要返回一个视图
如果用对象接收的话…
预填数据多了一个student.前缀,这是服务端接收数据的变量名(后端接收数据,然后返回给前端!)
student是后端接收处的变量名:
可以对接收的变量进行重命名:
前端可以用s代替student
三、@ModelAttribute
两方面的功能:
- 数据回显时,给变量定义别名
- 定义全局数据
Controller中定义了很多接口,很多接口里都需要返回某一项数据给前端,那么可以定义一个全局数据,然后使用。
@ModelAttribute("info") //info是这个变量的名字,controller里的每一个接口都可以使用这个变量,将它返回给前端
public Map<String,Object> info()
{
Map<String,Object> map=new HashMap<>();
map.put("username","kkzzjx");
map.put("site","www.kk.com");
return map;
}
@GetMapping("/add")
public String addStudent3(){
return "addstudent";
}
映射到addstudent.jsp这个视图后,这里面是可以使用info这个变量的。
<a href="${info.site}">${info.username}</a>
四、返回JSON
return json:对象返回,转为json
主流的json处理工具:
- jackson
- gson
- fastjson
SpringMVC中,对jackson和gson都作了相应支持,使用这两个作为json转换器,只需添加相应的依赖。
使用fastjson:添加依赖+配置HttpMessageConverter转换器(前两个自动提供)
1. jackson
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
添加了jackson,就能够自动返回JSON,这个依赖于一个名为HttpMessageConverter的类,它的作用是http消息转换器。
功能:
- 将返回的对象转为json(给前端)
- 将前端提交上来的json转换为对象
eg.
Book
private String name;
private String author;
private Integer id;
@JsonFormat(pattern = "yyy-MM-dd",timezone = "Asia/Shanghai")
private Date date;
controller
@Controller
public class BookController {
@GetMapping("/book")
@ResponseBody
public Book getBookById(Integer id)
{
Book book=new Book();
book.setId(id);
book.setName("三国演义");
book.setAuthor("罗贯中");
book.setDate(new Date());
return book;//返回到前端来的是一个json
}
//这样返回的对象/数组会解析成json
@GetMapping("/books")
@ResponseBody
public List<Book> getAllBooks()
{
List<Book> books=new ArrayList<>();
Book b1=new Book();
b1.setName("三国演义");
b1.setId(1);
b1.setAuthor("罗贯中");
books.add(b1);
return books;
}
}
而对于日期,可以增加@JsonFormat属性
@JsonFormat(pattern = “yyy-MM-dd”,timezone = “Asia/Shanghai”)
那么如何定义全局设置呢?
IDEA中ctrl+N可以搜索类:
public MappingJackson2HttpMessageConverter(com.fasterxml.jackson.databind.ObjectMapper objectMapper) { /* compiled code */ }
driven中可以配置:
(全局配置)
<mvc:annotation-driven validator="validatorFactoryBean">
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" id="httpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg name="pattern" value="yyyy-MM-dd"/>
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
2. gson
安卓开发时使用较多
依赖:
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
如果同时存在jackson和gson,优先使用jackson
3. fastjson
号称最快的json解析器
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
在SpringMVC中并没有针对fastjson提供相应的HttpMessageConverter,所以fastjson使用时候需要进行配置HttpMessageConverter
driven里面配置:
<mvc:annotation-driven validator="validatorFactoryBean">
<mvc:message-converters>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" id="httpMessageConverter">
<property name="fastJsonConfig">
<bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
<property name="dateFormat" value="yyyy-MM-dd"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
如果中文乱码,可以添加属性
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=utf-8</value>
</list>
</property>
五、接收JSON @RequestBody
使用**@RequestBody**注解就可以接收json
@PostMapping("/book")
@ResponseBody
public Book addBook(@RequestBody Book book)
{
return book;
}
postman测试:
设置: