zoukankan      html  css  js  c++  java
  • 六、与json交互

    1、两种交互模式

      

      上图显示了客户端请求数据的两种格式,一种是 直接请求 json 数据,另一种是 key/value 数据。但是不管请求是哪种数据,为了在前端页面方便对结果进行解析。最终我们都转换为 json 数据格式。

    2、导入相应的 jar 包(详情参看源码)

       

    3、在 springmvc.xml 文件中配置 json 转换器

      第一种方法:

    1
    <mvc:annotation-driven ></mvc:annotation-driven>

      第二种方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!-- 用于将对象转换为 JSON  --> 
    <bean id="stringConverter" 
        class="org.springframework.http.converter.StringHttpMessageConverter"
        <property name="supportedMediaTypes"
            <list> 
                <value>text/plain;charset=UTF-8</value> 
            </list> 
        </property> 
    </bean> 
    <bean id="jsonConverter"   class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> 
     
    <bean      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"
        <property name="messageConverters"
            <list> 
                <ref bean="stringConverter" /> 
                <ref bean="jsonConverter" /> 
            </list> 
        </property> 
    </bean>

      

    4、请求为 json 数据测试

      这里我们需要注意两个注解:

      @ResponseBody把后台pojo转换json对象,返回到页面。

      @RequestBody接受前台json数据,把json数据自动封装pojo。

      ①、jsp 页面

    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
    35
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>SpringMVC和 json 交互</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-2.1.4.min.js" ></script>
    </head>
    <script type="text/javascript">
        var dataJson = {
                'username':'Bob',
                'sex':'男'
        };
        function requestJson(){
            $.ajax({
                type:"POST",
                url:"${pageContext.request.contextPath}/requestJson",
                //指定数据格式为 json
                contentType:"application/json;charset=UTF-8",
                data:JSON.stringify(dataJson),
                dataType:"json",
                success:function(data){
                    console.log(data.username);
                    console.log(data.sex);
                }
            });
        }
         
    </script>
    <body>
        <button onclick="requestJson()" value="请求是json,返回json">请求是json,返回json</button>
         
    </body>
    </html>

      

      ②、Controller

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package com.ys.controller;
     
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
     
    import com.ys.po.User;
     
    @Controller
    public class UserController {
         
         
        //请求为json,返回json
        @RequestMapping("/requestJson")
        //@RequestBody将请求信息的json串转成user对象
        //@ResponseBody将user对象转成json输出
        @ResponseBody
        public User requestJson(@RequestBody User user) throws Exception{
            System.out.println(user);
            return user;//由于@ResponseBody注解,将user转成json格式返回
        }
         
    }

      ③、测试

      我们访问上面的jsp页面,然后点击按钮,进入到 Controller

      

      然后我们查看返回的数据:

      

    5、请求为 key/value 数据测试

      ①、JSP 页面

       ②、Controller

    1
    2
    3
    4
    5
    6
    7
    8
    //请求为key/value,返回json
        @RequestMapping("/requestKeyValue")
        //@RequestBody将请求信息的json串转成user对象
        @ResponseBody
        public User requestKeyValue(User user) throws Exception{
            System.out.println(user);
            return user;
        }

      ③、测试

      

      然后返回数据:

      

    6、遇到的问题

      ①、如下代码,由于我们使用 Ajax 提交,我们在 JSP 页面引入了jquery  文件,发现无论使用绝对路径还是相对路径,系统总是找不到这个文件?

    1
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-2.1.4.min.js" ></script>

      原因:因为你在web.xml 文件中,对于过滤器的配置是拦截所有请求。所以类似于*.js,或者*.css这样的文件也被拦截了,故访问不到。

      

      解决办法:

        第一种办法:我们可以使用上面配置的拦截器只拦截 *.do,或者*.action,而不是 “/”。那么SpringMVC容器将不会拦截*.js,*.css这样的文件。但是这种风格不支持 Restful,建议不采用。

        第二种方法:在web.xml中配置拦截器的过滤请求

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!--要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了,我想性能是最好的吧。--> 
        <servlet-mapping> 
            <servlet-name>default</servlet-name> 
            <url-pattern>*.css</url-pattern> 
        </servlet-mapping> 
        <servlet-mapping> 
            <servlet-name>default</servlet-name> 
            <url-pattern>*.js</url-pattern> 
        </servlet-mapping> 

        第三种方法:在spingmvc.xml 中配置对静态资源不过滤

    1
    2
    3
    <!-- 配置静态文件过滤器 -->
        <mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
        <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>

      

      ②、也是比较容易犯的错误 415

      

      

       这个错误产生的原因有很多。我们需要一步一步的排查:

      第一步:必须保证导入的 jackson相关的jar包是全的。

      第二步:在springmvc.xml文件中的配置的json转换器一定不能缺少,如何配查看本篇博客的第三点

      第三步:书写 Ajax 请求时。contentType:"application/json;charset=UTF-8",不要不写 contentType 这个属性

      第四步:Ajax传给后台的不要直接传字符串,要转换成json,即 data:JSON.stringify(dataJson),

  • 相关阅读:
    嵌入式C程序基础与编程结构
    英特尔图形处理器第8代架构
    用servlet打内容到网页上
    servlet获取多个同名参数
    JAVA之复制数组
    用JAVA写一个简单的英文加密器
    Tomcat使用
    JAVA,字符串替换
    使用自己的域名解析博客园地址(CSDN也可以)
    错误笔记20181124
  • 原文地址:https://www.cnblogs.com/zhoanghua/p/9292246.html
Copyright © 2011-2022 走看看