81.【SpringMVC】(七)

简介: 81.【SpringMVC】

(十二)、JSON

1.什么是JSON?

前后端分离时代:

后端部署后端,提供接口,提供数据。

  • 对象
  • JSON

前端独立部署,负责渲染后端,展示数据。

  • HTML
(1).json的概念

JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率

2.JavaScript与JSON的区别

(1).JavaScript

在JavaScript 语言中,一切都是对象。因此,任何JavaScript支持的类型都可以通过JSON来表示,列入字符串,数字,对象,数组等。

  • 对象表示为键值对,数据由逗号分隔
  • 花括号表示为对象
  • 方括号表示数组
(2)JSON

JSON键值对是用来保存JavaScript对象的一种方式,和JavaScript对象的写法也大同小异,键/值对的键名写在前面并用双引号 " " 包裹,使用冒号 : 分割,然后接着是值

{"name": "吉士先生"}
{"age": 3}
(3).JavaScript与JSON的区别
  • JSON 是javaScript 对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串。
var obj={a: 'hello' , b: 'world'};  这是一个对象,注意见名也可以使用引号包裹
var json='{"a" : "hello" , "b" : "world"}';  这是一个JSON字符串,本质是一个字符串

JSON和JavaScript对象互转

  • 要实现从JSON字符串转换为JavaScript对象,使用JSON.parse()方法
var obj=JSON.parse('{"a" : "hello" , "b" : "world"}'); 
 结果是javaScript对象:   {a: 'hello' , b: 'world'};  
  • 要实现从JavaScript对象转换为JSON字符串,使用JSON.stringify()方法
var obj=JSON.stringify({a: 'hello' , b: 'world'});
结果是JSON字符串 '{"a" : "hello" , "b" : "world"}'
(4).测试演练
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <script type="text/javascript">
<!--    编写一个JavaScript对象-->
    var user={
        name : "吉士先生",
        sex : "26"
    };
    console.log(user);
  //  将js对象转换为JSON字符串
var json=JSON.stringify(user);
    console.log("js对象转换为JSON字符串为"+json);
  //  将JSON字符串转换为js对象
    var user2=JSON.parse(JSON.stringify(user));
    console.log(user2)
  </script>
</head>
<body>
</body>
</html>

(十三)、Controller转JSON数据

  • Jackson应该是目前比较好的json解析工具了
  • 当然工具不止这一个,比如还有阿里巴巴的fastjason
  • 我们这里使用Jackson,使用它需要导入它的jar包
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0</version>
</dependency>

1.搭配环境

(0).去Aftrical里面导入lib目录

不要忘记新添加的jar包也要导入进去

(1).导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringMVC</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>SpringMVC-07-JSON</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
<dependencies>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.10.0</version>
    </dependency>
</dependencies>
</project>
(2).配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>encoding</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>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
(3).配置spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.Jsxs.Controller"/>
<!--     默认处理器-->
    <mvc:default-servlet-handler/>
<!--    驱动器-->
    <mvc:annotation-driven/>
<!--    视图解释器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

2. toString

@ResponseBody   添加上此注解之后此方法就不会走视图解析器了,会返回你真实返回的东西,一般是字符串,实现了前后端分离
@RequestMapping(value = "/j1",produces = {"text/html;charset=UTF-8;","application/json;charset=UTF-8;"})
package Com.Jsxs.Controller;
import Com.Jsxs.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
    @RequestMapping(value = "/j1",produces = {"text/html;charset=UTF-8;","application/json;charset=UTF-8;"})
    @ResponseBody  // 添加上此注解之后此方法就不会走视图解析器了,会返回你真实返回的东西,一般是字符串,实现了前后端分离
    public String test(){
//        创建一个对象
        User user = new User("吉士先生",21,"男");
        String s = user.toString();
        return s;
    }
}

返回了对象的内容以字符串的形式;

3.解决JSON乱码的问题【必配】

过滤器解决的是字符集乱码的问题,这个解决的是JSON乱码问题

第一种决绝JSON乱码问题 【推荐】

<?xml version="1.0" encoding="UTF-8"?>
<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.Jsxs.Controller"/>
<!--     默认处理器-->
    <mvc:default-servlet-handler/>
<!--    驱动器-->
    <mvc:annotation-driven/>
<!--    JSON乱码问题配置-->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
<!--    视图解释器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

第二种解决JSON乱码问题 【不推荐】

@RequestMapping(value = "/j1",produces = {"text/html;charset=UTF-8;","application/json;charset=UTF-8;"})

4.@ResponseBody 注解

@ResponseBody 添加上此注解之后此方法就不会走视图解析器了,会返回你真实返回的东西,一般是字符串,实现了前后端分离. 搭配着@Controller进行实现。

package Com.Jsxs.Controller;
import Com.Jsxs.pojo.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@Controller   //这个注解直接不走视图解析器了,实现前后端分离
public class UserController {
    @RequestMapping("/j1")
    @ResponseBody
    public String test() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
//        创建一个对象
        User user = new User("吉士先生",21,"男");
        String s = mapper.writeValueAsString(user);
        return s;
    }
}

相关文章
|
4月前
|
Java API 网络架构
SpringMVC(一)(2)
SpringMVC(一)(2)
27 1
|
4月前
|
XML 前端开发 JavaScript
SpringMVC(一)(4)
SpringMVC(一)(4)
27 0
SpringMVC(一)(4)
|
4月前
|
前端开发 Java 数据格式
SpringMVC(三)
SpringMVC(三)
17 0
|
JSON 前端开发 Java
springMVC(2)
SpringMVC_JSR303数据校验
53 0
|
6月前
|
JSON 前端开发 Java
SpringMVC
SpringMVC
|
6月前
|
前端开发 Java API
|
6月前
|
存储 JSON 前端开发
|
存储 前端开发 应用服务中间件
|
前端开发 应用服务中间件
SpringMVC2
SpringMVC2
38 0