JSON&&Ajax

什么是JSON
JSON(javaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。

采用完全独立于编程语言文本格式来存储和表示数据,易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率。

在JS语言中,一切都是对象。因此,任何JS支持的类型都可以通过JSON来表示,例如字符串,数字,对象,数组等。它的要求和语法格式:

  • 对象表示为键值对
  • 数据有逗号分割
  • 花括号来保存对象
  • 方括号来保存数组

JSON和JS的关系:
JSON是JS对象的字符串表示形式,它使用文本表示一个JS对象的信息,本质是一个字符串。

var obj={a:‘Hello’,b:‘World’};是一个对象
var  json=‘’{“a”:“Hello”,“b”:“world“}’这是一个JSON字符串

JSON 和 JS 对象互转

要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}

要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    <!--编写一个对象-->
    var user={
        name:"NBA",
        age:3,
        sex:"杜兰特"
    };

    console.log(user);

    //将js对象转换为json字符串
    var str=JSON.stringify(user);
    console.log(str);

    var obj=JSON.parse(str);
    console.log(obj);
document.write(str);

</script>
</body>
</html>

控制台结果:
在这里插入图片描述
使用Controller实现返回JSON数据
1.导包
Jackson应该是目前比较好的json解析工具了,当然工具不止这一个,比如还有阿里巴巴的fastjson等等。

我们这里使用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.9.8</version>
    </dependency>

我们在来一个一个实体类,方便我们测试,

package com.wang.pojo;

public class User {
    private String name;
    private int age;
    private String sex;

    public User() {
    }

    public User(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

编写一个Controller类,需要 @ResponseBody,让它不去视图解析器,而直接返回一个字符串,

public class UserController {
    @RequestMapping("/json")
    @ResponseBody
    public String json1() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();

//        创建一个对象
        User user = new User("神州一号", 1, "男");

        System.out.println(user);

        //将Java对象转换为json字符串
        String str = mapper.writeValueAsString(user);
        System.out.println(str);
        return str;
    }

在这里插入图片描述
出现乱码,我们可以在springmvc配置文件中加入以下代码


    <context:component-scan base-package="com.wang.controller"/>
   <mvc:default-servlet-handler/>
    <mvc:annotation-driven>
  <!--      JSON格式乱码处理方式-->
        <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">
        <property name="prefix" value="/WEB_INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

在这里插入图片描述

这样就不回出现乱码了,配置之后,只用配置一次,还有一个解决方案,加注释但是不建议使用,因为它只对它注释的代码起作用,操作如下

  @RequestMapping(value = "/json",produces = "application/json;charset=utf-8")

打印集合试试

@ResponseBody
    @RequestMapping(value = "/json2")
    public String json2() throws JsonProcessingException {
        List<User> list=new ArrayList<>();
        User user = new User("神州一号", 1, "男");
        User user1 = new User("神州二号", 1, "男");
        User user2 = new User("神州三号", 1, "男");
        User user3 = new User("神州四号", 1, "男");
        list.add(user);
        list.add(user1);
        list.add(user2);
        list.add(user3);

        return new ObjectMapper().writeValueAsString(list);

    }

在这里插入图片描述
我们也可以在利用JSON打印出时间,不过他有时间戳,我们要处理

   @ResponseBody
    @RequestMapping(value = "/time1")
    public String json4() throws JsonProcessingException {
        Date date = new Date();
        System.out.println(date);
        return new ObjectMapper().writeValueAsString(date);
    }

在这里插入图片描述

默认日期格式会变成一个数字,是1970年1月1日到当前日期的毫秒数!Jackson 默认是转成timestamps形式解决方案:取消timestamps形式 , 自定义时间格式

 @RequestMapping(value = "/time2")
    @ResponseBody
    public String json5() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
//        1.如何让他不返回时间戳,所要关闭它的时间戳功能
        mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS,false);

        SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd HH-mm-ss");
        mapper.setDateFormat(format);
        Date date = new Date();
        return mapper.writeValueAsString(date);
    }

在这里插入图片描述
对于这些固定代码我么可以把他放在工具类里,用的时候就不用去写了,这就是封装的思想,
工具类:

public class JsonUtils {
    public static String getJson(Object object){
        return getJson(object,"yyyy-MM-dd HH-mm-ss");
    }
    public static String getJson(Object object,String dateFormat){
        ObjectMapper mapper = new ObjectMapper();

        mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS,false);

        SimpleDateFormat format = new SimpleDateFormat(dateFormat);
        mapper.setDateFormat(format);

        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

}

AJAX

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。

在 2005 年,Google 通过其 Google Suggest 使 AJAX 变得流行起来。

Google Suggest 使用 AJAX 创造出动态性极强的 web 界面:当您在谷歌的搜索框输入关键字时,JavaScript 会把这些字符发送到服务器,然后服务器会返回一个搜索建议的列表。

就和国内百度的搜索框一样:
在这里插入图片描述

传统的网页(即不用ajax技术的网页),想要更新内容或者提交一个表单,都需要重新加载整个网页。
使用ajax技术的网页,通过在后台服务器进行少量的数据交换,就可以实现异步局部更新。

使用Ajax,用户可以创建接近本地桌面应用的直接、高可用、更丰富、更动态的Web用户界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>伪造Ajax</title>
</head>
<body>
<script type="text/javascript">
    window.onload=function f() {
         var myDate=new Date();
         document.getElementById('currentTime').innerText=myDate.getTime();
    }

    function  loadPage() {
        var targetURL=document.getElementById('url').value;
        console.log(targetURL);
        document.getElementById('iframePosition').src=targetURL;

    }
</script>
<div>
    <p>请输入要加载的地址:<span id="currentTime"></span></p>
    <p>
        <input type="text" id="url" value="https:www.baidu.com/">
        <input type="button" value="提交" onclick="loadPage()">
    </p>
</div>
<div>
    <h3>
        加载页面的位置:
    </h3>
    <iframe style="width: 100%;height: 500px" id="iframePosition">
    </iframe>
</div>


</body>
</html>

在这里插入图片描述
jQuery Ajax本质就是 XMLHttpRequest,对他进行了封装,方便调用!我们来看下他的方法;
编写一个Controller类

@Controller
@RequestMapping("/ajax")
public class AjaxController {
    //第一种方式,服务器要返回一个字符串,直接使用response

    @RequestMapping("/a1")
    public void ajax(String name, HttpServletResponse response) throws IOException {
        if ("admin".equals(name)){
            response.getWriter().print("true");
        }else {
            response.getWriter().print("false");
        }
    }

编写一个index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<head>
    <title>ajax</title>
    <script src="${pageContext.request.contextPath}/statics/js/jquery-3.4.1.js"></script>
    <script>
        function a1() {
            $.post({
                url:"${pageContext.request.contextPath}/ajax/a1",
                data:{'name':$("#txtName").val()},
                success:function (data,status) {
                    console.log(data);
                    console.log(status);
                }
            });
        }
    </script>
</head>
<body>
用户名:<input type="text" id="txtName" onblur="a1()">
</body>

在这里插入图片描述
在前段展示集合
controller类

  @RequestMapping("/a2")
    @ResponseBody
    public List<User> ajax2(){

        List<User> list = new ArrayList<>();

        User user1 = new User("秦疆1号",1,"男");
        User user2 = new User("秦疆2号",1,"男");
        User user3 = new User("秦疆3号",1,"男");
        User user4 = new User("秦疆4号",1,"男");
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);

        return list; //由于加了@ResponseBody注解,他会返回一个字符串;
    }

jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<input type="button" id="btn" value="获取数据"/>
<table width="80%" align="center">
    <tr>
        <td>姓名</td>
        <td>年龄</td>
        <td>性别</td>
    </tr>
    <tbody id="content">
    </tbody>
</table>

<script src="${pageContext.request.contextPath}/statics/js/jquery-3.4.1.js"></script>

<script>
    $(function () {
        $("#btn").click(function () {
            $.post("${pageContext.request.contextPath}/ajax/a2",function (data) {
                console.log(data);
                var html = "";
                for (var i=0;i<data.length;i++){
                    html += "<tr>" +
                        "<td>"+data[i].name + "</td>" +
                        "<td>"+data[i].age + "</td>" +
                        "<td>"+data[i].sex + "</td>" +
                        "</tr>"
                }
                $("#content").html(html);
            })
        })
    })
</script>

</body>
</html>

输出结果:
在这里插入图片描述

注册显示,正确提示Ok,不正确提示错误
controller类:

   @RequestMapping("/a3")
    @ResponseBody
    public String ajax3(String name,String pwd){
        String msg="";
        if (name!=null){
            if ("admin".equals(name)){
                msg="ok";
            }else {
                msg="用户名有误";
            }
        }
        if (pwd!=null){
            if ("123456".equals(pwd)){
                msg="ok";
            }else {
                msg="密码输入有误";
            }
        }
        return msg;
    }
}

前端jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="${pageContext.request.contextPath}/statics/js/jquery-3.4.1.js"></script>

    <script>
        function a1() {
            $.post({
                url:"${pageContext.request.contextPath}/ajax/a3",
                data:{"name":$("#name").val()},
               success: function(data) {
                    if (data.toString()=='ok') { //信息核对成功
                        $('#userInfo').css("color","green");
                    }else {
                        $('#userInfo').css("color","red");
                    }
                    $("#userInfo").html(data);
                }
            })

        }
        function a2() {
            $.post("${pageContext.request.contextPath}/ajax/a3",
            {"pwd": $("#pwd").val()},
                function (data) {
                    if (data.toString()=='ok'){
                        $('#pwdInfo').css("color","green");
                    } else {
                        $('#pwdInfo').css("color","red");
                    }
                    $("#pwdInfo").html(data);
                }
            )
        }
    </script>

</head>
<body>
<p>
    用户名:
    <input type="text" id="name" onblur="a1()">
    <span id="userInfo"></span>
</p>
<p>
    密码:
    <input type="text" id="pwd" onblur="a2()">
    <span id="pwdInfo"></span>
</p>
</body>
</html>

效果:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值