JSON

1.Ajax请求 ---> Servlet(返回一个json格式的字符串{name:河北,jiancheng:"冀","shenghui":"石家庄"})

2.json概念:json是一种轻量级的数据格式

3.json分类:
    
    1.json对象:{名称:值}    例如,{name:河北,jiancheng:"冀","shenghui":"石家庄"}
    
    2.json数组:[json对象,json对象...]    例如,[name:河北,jiancheng:"冀","shenghui":"石家庄"},name:河北,jiancheng:"冀","shenghui":"石家庄"}]

4.为什么用json数据格式而不用xml

    1.读写速度快
    
    2.结构简单,生成和解析比较方便

    3.轻量级的数据格式,兼容各个平台的语言

5.将Java对转换为json格式 示例
    1.创建一个表对应的实体类 
    2.所需要的jar包
        1.jackson-annotations-2.9.0.jar
        2.jackson-core-2.9.0.jar
        3.jackson-databind-2.9.0.jar

1.表对应的实体类

package com.bjpowernode.com.bjpowernode.entity;
public class Province {
    private Integer id;
    private String name;
    private String jiancheng;
    private String shenghui;  
    + getter + setter               
}

2.测试类

package com.bjpowernode.com.bjpowernode.entity;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class TestJSON {
    public static void main(String[] args) throws JsonProcessingException {
        Province p = new Province();
        p.setId(1);
        p.setName("河北");
        p.setJiancheng("冀");
        p.setShenghui("石家庄");

        // 将java对象转换为json格式
        ObjectMapper om = new ObjectMapper();
        String json = om.writeValueAsString(p); // 将参数java对象转换为json格式的字符串
        System.out.println(json);
    }
}

3.测试结果:{"id":1,"name":"河北","jiancheng":"冀","shenghui":"石家庄"}

6.异步对象与数据库联合使用 案例

1.基本步骤

1.前端页面
2.dao类
3.后端Servlet
4.写完Servlet以后,要进行测试,再继续写Ajax的代码
    1.输入网址:localhost:8080/myweb/queryjson?proid=1
5.在JS中,把json格式的字符串转为json对象。json中的key就是json对象的属性名

1.index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Title</title>
  <script type="text/javascript">
        function doSearch(){
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.onreadystatechange = function(){
              if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
                var data = xmlHttp.responseText;
                // eval:执行括号中的代码 注意:这个函数只做了解,后面还有更优雅的替代品
                var jsonObj = eval("(" + data +")"); // 它是一个json对象,key就是对象的属性
                  // 更新dom对象
                  document.getElementById("proname").value = jsonObj.name;
                  data = document.getElementById("projiancheng").value = jsonObj.jiancheng;
                  data = document.getElementById("proshenghui").value = jsonObj.shenghui;
              }
            }
            var proid = document.getElementById("proid").value;
            xmlHttp.open("get","queryjson?proid=" + proid,true);
            xmlHttp.send();
        }
    </script>
</head>
<body>
<table>
  <tr>
    <td>省份编号</td>
    <td><input id="proid">
      <input type="button" value="搜索" onclick="doSearch()">
    </td>
  </tr>
  <tr>
    <td>省份名称</td>
    <td><input id="proname"></td>
  </tr>
  <tr>
    <td>省份简称</td>
    <td><input id="projiancheng"></td>
  </tr>
  <tr>
    <td>省会名称</td>
    <td><input id="proshenghui"></td>
  </tr>
</table>
</body>
</html>

2.dao类

    // 根据id获取一个完整的province对象
    public Province selectCity(Integer provinceId){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Province province = null;
        String sql = "select id,name,jiancheng,shenghui from province where id = ?";
        try{
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1,provinceId);
            rs = ps.executeQuery();
            if (rs.next()){
                province = new Province();
                province.setId(rs.getInt("id"));
                province.setName(rs.getString("name"));
                province.setJiancheng(rs.getString("jiancheng"));
                province.setShenghui(rs.getString("shenghui"));
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,ps,rs);
        }
        return province;
    }
}

3.JDBC工具类

package com.bjpowernode.util;

import java.sql.*;

public class DBUtil {
    /**
     * 工具类的构造方法都是私有的
     * 因为工具类中的方法都是私有的,不需要new对象,直接使用类名调用即可
     */
    private DBUtil(){};
    /**
     * 把注册驱动放到静态代码块中
     * 这样类加载的时候就会注册驱动
     * 而且驱动只会注册一次,放在静态代码块里最合适不过了
     */
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    // 获取连接对象
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bjpowernode","root","root");
    }
    // 释放资源
    public static void close(Connection conn, Statement stat, ResultSet rs){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(stat != null){
            try {
                stat.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

4.实体类

package com.bjpowernode.entity;
public class Province {
    private Integer id;
    private String name;
    private String jiancheng;
    private String shenghui;

    + getter + setter

5.Servlet

public class QueryJsonServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String strProid = request.getParameter("proid");
        // 表示不管查不查得到,都会返回一个json数据的格式
        String json = "{}";
        if(strProid != null && strProid.trim().length() >0 ){
            UserDao dao = new UserDao();
            Province p = dao.selectCity(Integer.valueOf(strProid));
            ObjectMapper om = new ObjectMapper();
            json = om.writeValueAsString(p);

            // 利用响应对象输出数据
            response.setContentType("application/json;charset=utf-8");
            PrintWriter pw = response.getWriter();
            pw.write(json); // 输出的数据会赋给Ajax的responseText属性
            pw.flush();
            pw.close();
        }
    }
}

6.web.xml

 <servlet>
        <servlet-name>QueryJsonServlet</servlet-name>
        <servlet-class>com.bjpowernode.controller.QueryJsonServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>QueryJsonServlet</servlet-name>
        <url-pattern>/queryjson</url-pattern>
    </servlet-mapping>

同步核异步的区别:

异步:在send方法之后,还可以执行其他的代码,可以同时执行多个异步请求。
同步:一次只能执行一个异步请求,必须请求处理完成后,才能执行其他的请求处理。

posted @ 2021-02-28 16:20  兵长砍猴  阅读(111)  评论(0)    收藏  举报