2022-1-18 SpringMVC 数据回显和JSON处理


数据交错了,如果没有回显,需要重新填写。(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

两方面的功能:

  1. 数据回显时,给变量定义别名
  2. 定义全局数据

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消息转换器。
功能:

  1. 将返回的对象转为json(给前端)
  2. 将前端提交上来的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测试:
设置:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值