【SpringMVC】SpringMVC基础教程(5)
前言:
本文内容:乱码问题解决、什么是JSON、Jackson使用
推荐免费SpringMVC基础教程视频:【狂神说Java】SpringMVC最新教程IDEA版通俗易懂_哔哩哔哩_bilibili
乱码问题解决
提交表单或者页面显示中文容易出现乱码问题
encoding.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
EncodingController.java
1 | package com.jokerdig.controller; |
运行,输入中文小王
提交表单,出现乱码
1 | å°ç |
我们发现在后端的时候数据就已经乱码
解决乱码
使用过滤器解决乱码
新建EncodingFilter.java
实现Filter,重写方法
1 | package com.jokerdig.filter; |
在web.xml
中配置过滤器
1 | <!-- 乱码过滤器 /*包括jsp页面 / 则不包括jsp页面--> |
运行之前的代码,乱码问题解决
1 | 小王 |
直接使用SpringMVC提供的过滤器,解决乱码问题
直接在web.xml
配置
1 | <!-- springMVC过滤器--> |
运行测试,乱码解决
1 | 小王 |
使用自定义过滤器解决乱码问题
没找到原作者地址,这是一个大佬写的鸭( •̀ ω •́ )✧
1 | /** |
在web.xml
配置该过滤器即可
什么是JSON
JSON概述
- JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,使用非常广泛
- 采用完全独立于编程语言的文本格式来存储和表示数据
- 简洁清晰的层次结构使得JSON称为理想的数据交换语言
- 方便阅读和编写,同时也方便机器解析和生成,有效提升网络传输效率
在JavaScript语言中,一切都是对象。因此JavaScript支持的类型都可以通过JSON来表示。(字符串,数字,对象,数组等)
- 对象表示为键值对,数据由逗号分隔
- 大括号
{}
保存对象 - 方括号
[]
保存数组
JSON键值对是用来保存JavaScript对象的一种方式,和JavaScript对象的写法也大同小异,书写格式:{"键名":"键值"}
1 | {"name":"小王"} |
JSON是JavaScript对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串
1 | var obj = {a:'hello',b:'world'}; // 这是一个js对象,键名也可以使用引号包裹 |
JSON和JavaScript对象互相转换
-
要实现从JSON字符串转换为JavaScript对象,使用
JSON.parase()
方法1
2var obj = JSON.parase('{"a":"hello","b":"world"}')
// 结果:{a:'hello',b:'world'} -
要实现从JavaScript对象转换为JSON字符串,使用
JSON.stringify()
方法1
2var json = JSON.STRINGIFY({a:'hello',b:'world'});
// 结果:'{"a":"hello","b":"world"}'
简单测试
-
新建Module
springmvc-06-json
-
新建
jsonTest.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
// 编写js对象 var -> let const
let obj = {a:"hello",b:"world"}
// 定义一个json字符串
const json = '{"a":"hello","b":"world"}'
// js对象转换 JSON
console.log(JSON.stringify(obj))
// JSON转换js对象
console.log(JSON.parse(json))
</script>
</head>
<body>
</body>
</html> -
运行测试
1
2
3
4
5
6浏览器控制台显示
{"a":"hello","b":"world"} //一个json字符串
Object
a: "hello"
b: "world"
[[Prototype]]: Object // js对象
Jackson使用
-
Jackson应该是目前比较好的json解析工具
-
当然工具不止这一个,比如fastjson等
-
这里使用Jackson,引入依赖
1
2
3
4
5<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency> -
配置SpringMVC需要的配置
web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- DispatcherServlet-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 过滤器-->
<filter>
<filter-name>EncodingFileter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFileter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app> -
新建
springmvc-servlet.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫包-->
<context:component-scan base-package="com.jokerdig.controller"/>
<!-- 过滤静态资源-->
<mvc:default-servlet-handler/>
<!-- 支持注解驱动-->
<mvc:annotation-driven/>
<!--<!– 视图解析器–> -->
<bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans> -
编写一个User实体类(这里使用lombok)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19package com.jokerdig.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Joker大雄
* @data 2022/6/4 - 20:15
**/
// 需要导入lombok
public class User {
private String name;
private int age;
private String sex;
} -
这里我们要使用两个新东西,一个是
@ResponseBody
,一个是ObjectMapper
对象,具体用法如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33package com.jokerdig.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jokerdig.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author Joker大雄
* @data 2022/6/4 - 20:20
**/
// @RestController 该注解表示所有的方法都只返回字符串
public class UserController {
// 原始解决json乱码方法,springmvc可以通过配置一次性解决json乱码
// 加这个注解就不会走视图解析器,会直接返回一个字符串
public String json1() throws JsonProcessingException {
// jackson ObjectMapper
ObjectMapper mapper = new ObjectMapper();
User user = new User("小王",18,"男");
// 把一个Value转换为String
String str = mapper.writeValueAsString(user);
return str;
}
} -
运行后浏览器显示
1
{"name":"小王","age":18,"sex":"男"}
解决乱码问题优化
使用原始的方法较为繁琐,我们可以在springmvc配置文件统一配置
1 |
|
将之前配置的原始方法去掉,运行项目
1 | {"name":"小王","age":18,"sex":"男"} |
测试集合输出
1 | // 测试集合的输出 |
运行结果
1 | [{"name":"小王1","age":18,"sex":"男"},{"name":"小王2","age":18,"sex":"女"},{"name":"小王3","age":18,"sex":"男"}] |
测试时间对象
1 | // 测试时间对象的输出 |
运行结果
1 | "2022-06-04 21:08:39" |
提取为工具类
1 | package com.jokerdig.untils; |
调用工具类
1 | // 传递时间 |
运行测试
1 | "2022-06-04 21:18:48" |