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方法之后,还可以执行其他的代码,可以同时执行多个异步请求。
同步:一次只能执行一个异步请求,必须请求处理完成后,才能执行其他的请求处理。

浙公网安备 33010602011771号