zoukankan      html  css  js  c++  java
  • 13、JavaEE--Ajax

    AJAX

    AJAX是Asynchronous JavaScript And XML的缩写,指异步JavaScript和XML。

    它是一种日渐流行的Web编程方式:

    Better
    Faster
    User-Friendly

    它不是一种语言,而是一种用于创建更好更快,以及交互性更强的Web应用程序的技术。是基于JavaScript、XML、HTML、CSS新用法。

    运用HTML和CSS来实现页面,表达信息。
    运用XHTMLHttpRequest和Web服务器进行数据的异步交换。
    运用JavaScript操作DOM,实现动态局部刷新。

    AJAX基础

    传统的网页,要想更新内容或提交一个表单,就要重新载入页面;使用AjAX技术的页面,通过后台跟服务器进行少量的数据交换,网页就

    可以实现异步局部更新。

    同步和异步

    • 传统Web交互方式-同步

    • Ajax Web交互方式-异步

    XMLHttpRequest对象

    XMLHttpRequest 对象用于在后台与服务器交换数据。它包含如下功能:

    在不重新加载页面的情况下更新网页
    在页面已加载后从服务器请求数据
    在页面已加载后从服务器接收数据
    在后台向服务器发送数据

    所有现代的浏览器都支持 XMLHttpRequest 对象。

    • XMLHttpRequest的属性和方法

      XMLHttpRequest对象包含如下属性:

    属性 描述
    readyState 表示XMLHttpRequest对象的状态:0:未初始化。对象已创建,未调用open;1:open方法成功调用,但Sendf方法未调用;2:send方法已经调用,尚未开始接受数据;3:正在接受数据。Http响应头信息已经接受,但尚未接收完成;4:完成,即响应数据接受完成。
    Onreadystatechange 请求状态改变的事件触发器(readyState变化时会调用这个属性上注册的javascript函数)。
    responseText 服务器响应的文本内容
    responseXML 服务器响应的XML内容对应的DOM对象
    Status 服务器返回的http状态码。200表示“成功”,404表示“未找到”,500表示“服务器内部错误”等。
    statusText 服务器返回状态的文本信息。

    XMLHttpRequest对象包含如下方法:

    方法 描述
    Open(string method,string url,boolean asynch,String username,string password) 指定和服务器端交互的HTTP方法,URL地址,即其他请求信息;Method:表示http请求方法,一般使用"GET","POST".url:表示请求的服务器的地址;asynch:表示是否采用异步方法,true为异步,false为同步;后边两个可以不指定,username和password分别表示用户名和密码,提供http认证机制需要的用户名和密码。
    Send(content) 向服务器发出请求,如果采用异步方式,该方法会立即返回。content可以指定为null表示不发送数据,其内容可以是DOM对象,输入流或字符串。
    SetRequestHeader(String header,String Value) 设置HTTP请求中的指定头部header的值为value.此方法需在open方法以后调用,一般在post方式中使用。
    getAllResponseHeaders() 返回包含Http的所有响应头信息,其中相应头包括Content-length,date,uri等内容。返回值是一个字符串,包含所有头信息,其中每个键名和键值用冒号分开,每一组键之间用CR和LF(回车加换行符)来分隔!
    getResponseHeader(String header) 返回HTTP响应头中指定的键名header对应的值
    Abort() 停止当前http请求。对应的XMLHttpRequest对象会复位到未初始化的状态。
    • 创建 XMLHttpRequest 对象

      所有现代浏览器 (IE7+、Firefox、Chrome、Safari 以及 Opera) 都内建了 XMLHttpRequest 对象。

    通过一行简单的 JavaScript 代码,我们就可以创建 XMLHttpRequest 对象。

    xmlhttp = new XMLHttpRequest();
    

    老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:

    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    

    同时兼容新版本和老版本的写法:

    var request;
    if(window.XMLHttpRequest) {
        request = new XMLHttpRequest();// IE7+、Firefox、Chrome、Opera、Safari
    }else {
        request = new ActiveXObject("Microsoft.XMLHTTP");// IE6、IE5
    }
    
    • AJAX编码步骤

      使用Ajax进行请求包含如下步骤:

    1、创建XMLHttpRequest对象。
    2、注册状态监控回调函数。
    3、建立与服务器的异步连接。
    4、发出异步请求

    首先创建Servlet用于接收html发送的请求:

    public class ServletDemo extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("Servlet执行啦!");
            response.getWriter().write("Hello Client!");
        }
    }
    

    配置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_3_1.xsd"
             version="3.1">
        <servlet>
            <servlet-name>ServletDemo</servlet-name>
            <servlet-class>com.legend.demo.ServletDemo</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>ServletDemo</servlet-name>
            <url-pattern>/servlet/ServletDemo</url-pattern>
        </servlet-mapping>
    </web-app>
    

    然后创建ajaxdemo.html文件,用于向向后台异步请求数据:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <meta charset="UTF-8">
            <title>异步请求的编码步骤</title>
            <script type="text/javascript">
                // 点击button1发出异步请求ServletDemo1
                window.onload = function () {
                    document.getElementById("button1").onclick = function () {
                        // 1、创建XMLHttpRequest对象
                        var request;
                        if(window.XMLHttpRequest) {
                            // IE7+、Firefox、Chrome、Opera、Safari
                            request = new XMLHttpRequest();
                        }else {
                            // IE6、IE5
                            request = new ActiveXObject("Microsoft.XMLHTTP");
                        }
                        // 2、注册状态事件监听器(响应结果)
                        request.onreadystatechange = function () {// 执行异步请求结束后的回调
                            if (request.readyState == 4 && request.status == 200) { // 异步请求执行成功,拿到请求结果。
                                alert("异步请求完毕!" + request.responseText);
                            }
                        }
                        // 3、建立与服务器的连接
                        request.open("GET", "/servlet/ServletDemo");
                        // 4、发出异步请求数据,GET方式没有请求正文
                        request.send(null);
                    };
                }
            </script>
        </head>
        <body>
            <input type="button" id="button1" value="异步请求"/>
        </body>
    </html>
    

    AJAX案例

    用户登录检查

    1、创建登录页面:login.html

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <meta charset="utf-8">
            <title>检测用户名是否可用</title>
            <script type="text/javascript">
                window.onload = function () {
                    // 当username失去焦点触发异步请求
                    document.getElementById("username").onblur = function () {
                        var request;
                        if(window.XMLHttpRequest) {
                            request = new XMLHttpRequest();
                        }else {
                            request = new ActiveXObject("Microsoft.XMLHTTP");
                        }
                        // 执行异步请求结束后的回调
                        request.onreadystatechange = function () {
                            if (request.readyState == 4 && request.status == 200) {
                                var htmlText = request.responseText;
                                document.getElementById("msg").innerHTML = htmlText;
                            }
                        }
                        // GET请求方式
                       request.open("GET", "/servlet/LoginServlet?username="
                            + this.value + "&time=" + new Date().getTime());
                        request.send(null);
                    }
                }
            </script>
        </head>
        <body>
            <!--可以:span显示绿色的提示;不可用:span显示红色的提示-->
            用户名:<input type="text" id="username" name="username"><span id="msg"></span>
        </body>
    </html>
    

    由于GET方式发中文数据需要进行URL编码,可以使用POST的方式提交数据,需要指明正文:

    // Post请求方式
    request.open("POST", "/servlet/LoginServlet");
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.send("username=" + this.value);
    

    2、编写LoginServlet处理登录的逻辑

    public class LoginServlet extends HttpServlet {
        private List<String> names = new ArrayList<String>();
        @Override
        public void init() throws ServletException {
            names.add("legend");
            names.add("vincent");
            names.add("uding");
            names.add("kevin");
        }
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter writer = response.getWriter();
            String username = request.getParameter("username");
            if (username.equals("") && username.length() <= 0) {
                return;
            }
            if (names.contains(username)) {
                writer.write("<font color='red'>用户名已存在</font>");
            }else {
                writer.write("<font color='green'>用户名可用</font>");
            }
        }
    }
    

    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_3_1.xsd"
             version="3.1">
        <servlet>
            <servlet-name>LoginServlet</servlet-name>
            <servlet-class>com.legend.demo.LoginServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>LoginServlet</servlet-name>
            <url-pattern>/servlet/LoginServlet</url-pattern>
        </servlet-mapping>
    </web-app>
    

    显示商品信息

    1、创建TableServlet处理类

    public class TableServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter writer = response.getWriter();
            List<Product> products = ProductDB.findProducts();
            // 列表展示信息交给jsp处理
            request.setAttribute("products", products);
            request.getRequestDispatcher("/listProduct.jsp").forward(request, response);
        }
    }
    

    web.xml中的配置如下:

    <servlet>
        <servlet-name>TableServlet</servlet-name>
        <servlet-class>com.legend.demo.TableServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TableServlet</servlet-name>
        <url-pattern>/servlet/TableServlet</url-pattern>
    </servlet-mapping>
    

    2、创建产品类和DB类:Product.java、ProductDB.java

    Product.java

    public class Product {
        private int id;
        private String name;
        private float price;
        public Product(int id, String name, float price) {
            this.id = id;
            this.name = name;
            this.price = price;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public float getPrice() {
            return price;
        }
        public void setPrice(float price) {
            this.price = price;
        }
    }
    

    ProductDB.java

    public class ProductDB {
        private static List<Product> products = new ArrayList<Product>();
        static {
            products.add(new Product(1, "相机", 1200));
            products.add(new Product(2, "冰箱", 800));
            products.add(new Product(3, "洗衣机", 960));
            products.add(new Product(4, "空调", 2300));
        }
        public static List<Product> findProducts() {
            return products;
        }
    }
    

    3、由于服务端输出表格用打印的形式会非常麻烦,可以使用 JSTL技术来用JSP处理一个表格:listProduct.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <table border="1">
        <tr>
            <th>选择</th>
            <th>名称</th>
            <th>价格</th>
        </tr>
        <c:forEach items="${products}" var="person">
            <tr>
                <td><input type="checkbox" name="ids" value="${person.id}"></td>
                <td>${person.name}</td>
                <td>${person.price}</td>
            </tr>
        </c:forEach>
    </table>
    

    4、编写product.html,展示商品列表

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <meta charset="UTF-8">
            <title>显示商品信息</title>
            <script type="text/javascript">
                function showProducts() {
                    var request;
                    if(window.XMLHttpRequest) {
                        request = new XMLHttpRequest();
                    }else {
                        request = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    // 执行异步请求结束后的回调
                    request.onreadystatechange = function () {
                        if (request.readyState == 4 && request.status == 200) {
                            var htmlText = request.responseText;
                            document.getElementById("div").innerHTML = htmlText;
                        }
                    }
                    // GET请求方式
                    request.open("GET", "/servlet/TableServlet?" + new Date().getTime());
                    request.send(null);
                }
            </script>
        </head>
        <body>
            <h1><a href="javascript:showProducts();">商品列表</a></h1>
            <hr/>
            <div id="div"></div>
        </body>
    </html>
    

    输出结果:

    XStream

    Xstream是一个简单类库,用来转换java对象成为XML和转换XML成为Java对象的库。

    在解析XML时需要用到如下库:

    xpp3_min-1.1.4c(xml pull解析)

    JavaBean -> XML

    1、首先创建JavaBean类

    public class Person {
        private String name;
        private String gender;
        public Person(String name, String gender) {
            this.name = name;
            this.gender = gender;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
    }
    

    2、然后编写测试方法:

    public class XStreamDemo {
        // 使用XStream将javaBean转换成xml
        @Test
        public void test1() {
            Person person = new Person("legend", "男");
            XStream xstream = new XStream();
            // 由于根标签默认是全包名,这里可以自己指定
            xstream.alias("person", Person.class);
            String s = xstream.toXML(person);
            System.out.println(s);
        }
    }
    

    输出结果:

    legend

    除此之外,XStream还可以解析一些复杂的Bean类型,都非常简单。这里主要说下XStream中对JavaBean使用的几种注解:

    @XStreamAlias:对类和变量设置别名。
    @XstreamAsAttribute:设置变量生成属性。
    @XStreamOmitField:设置变量不生成到XML。
    @XStreamImplicit(itemFieldName = hobbies):设置集合类型变量别名。

    在XStream生成XML使用注解需要设置如下方法:

    xStream.autodetectAnnotations(true)
    

    范例:使用注解的方式生成XML

    @XStreamAlias("person")
    public class Person {
        @XStreamAsAttribute
        private String name;
        @XStreamOmitField
        private String gender;
        @XStreamImplicit(itemFieldName = "addr")
        private List<Address> addresses = new ArrayList<Address>();
        public Person(String name, String gender) {
            this.name = name;
            this.gender = gender;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        public List<Address> getAddresses() {
            return addresses;
        }
        public void setAddresses(List<Address> addresses) {
            this.addresses = addresses;
        }
    }
    

    测试的方法:

    @Test
    public void test2() {
        Person person = new Person("legend", "男");
        person.getAddresses().add(new Address("广东", "深圳", "20000"));
        person.getAddresses().add(new Address("广西", "桂林", "30000"));
        XStream xstream = new XStream();
        xstream.autodetectAnnotations(true);
        String s = xstream.toXML(person);
        System.out.println(s);
    }
    

    输出结果:

    <person name="legend">
      <addr>
        <province>广东</province>
        <city>深圳</city>
        <zipcode>20000</zipcode>
      </addr>
      <addr>
        <province>广西</province>
        <city>桂林</city>
        <zipcode>30000</zipcode>
      </addr>
    </person>
    

    省市联动案例

    • 构造基础数据

    1、创建bean实体:Province.java 和 City.java

    Province.java

    @XStreamAlias("province")
    public class Province {
        @XStreamAsAttribute
        private String name;
        @XStreamAsAttribute
        private String prefix;
        private List<City> citys = new ArrayList<City>();
        public Province(String name, String prefix) {
            this.name = name;
            this.prefix = prefix;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPrefix() {
            return prefix;
        }
        public void setPrefix(String prefix) {
            this.prefix = prefix;
        }
        public List<City> getCitys() {
            return citys;
        }
        public void setCitys(List<City> citys) {
            this.citys = citys;
        }
    }
    

    City.java

    @XStreamAlias("city")
    public class City {
        @XStreamAsAttribute
        private String name;
        private String desc;
        public City(String name, String desc) {
            this.name = name;
            this.desc = desc;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getDesc() {
            return desc;
        }
        public void setDesc(String desc) {
            this.desc = desc;
        }
    }
    

    2、使用ProvinceDemo测试数据

    public class ProvinceDemo {
        @Test
        public void test() {
            List<Province> provinces = new ArrayList<Province>();
            Province province1 = new Province("广东", "GD");
            Province province2 = new Province("湖南", "HN");
            province1.getCitys().add(new City("广州", "金融城市"));
            province1.getCitys().add(new City("深圳", "科技城市"));
            province1.getCitys().add(new City("佛山", "工业城市"));
            province2.getCitys().add(new City("长沙", "省会城市"));
            province2.getCitys().add(new City("株洲", "工业城市"));
            province2.getCitys().add(new City("湘潭", "槟榔城市"));
            provinces.add(province1);
            provinces.add(province2);
            XStream xStream = new XStream();
            xStream.autodetectAnnotations(true);
            xStream.alias("provinces", List.class);
            String str = xStream.toXML(provinces);
            System.out.println(str);
        }
    }
    

    输出结果:

    <provinces>
      <province name="广东" prefix="GD">
        <citys>
          <city name="广州">
            <desc>金融城市</desc>
          </city>
          <city name="深圳">
            <desc>科技城市</desc>
          </city>
          <city name="佛山">
            <desc>工业城市</desc>
          </city>
        </citys>
      </province>
      <province name="湖南" prefix="HN">
        <citys>
          <city name="长沙">
            <desc>省会城市</desc>
          </city>
          <city name="株洲">
            <desc>工业城市</desc>
          </city>
          <city name="湘潭">
            <desc>槟榔城市</desc>
          </city>
        </citys>
      </province>
    </provinces>
    

    实现省市联动

    1、创建ProvinceServlet.java类响应数据给页面

    public class ProvinceServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            List<Province> provinces = new ArrayList<Province>();
            Province province1 = new Province("广东", "GD");
            Province province2 = new Province("湖南", "HN");
            province1.getCitys().add(new City("广州", "金融城市"));
            province1.getCitys().add(new City("深圳", "科技城市"));
            province1.getCitys().add(new City("佛山", "工业城市"));
            province2.getCitys().add(new City("长沙", "省会城市"));
            province2.getCitys().add(new City("株洲", "工业城市"));
            province2.getCitys().add(new City("湘潭", "槟榔城市"));
            provinces.add(province1);
            provinces.add(province2);
            XStream xStream = new XStream();
            xStream.autodetectAnnotations(true);
            xStream.alias("provinces", List.class);
            String str = xStream.toXML(provinces);
            // 解决XML中文乱码
            response.setContentType("text/xml;charset=UTF-8");
            response.getWriter().write(str);
        }
    }
    

    web.xml中的配置:

    <servlet>
        <servlet-name>ProvinceServlet</servlet-name>
        <servlet-class>com.legend.demo.ProvinceServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ProvinceServlet</servlet-name>
        <url-pattern>/servlet/ProvinceServlet</url-pattern>
    </servlet-mapping>
    

    2、在HTML中使用Ajax获取响应的XML数据,然后通过JS解析,并添加到Select标签中

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <meta charset="UTF-8">
            <title>省市二级联动</title>
            <script type="text/javascript">
                var xmlDoc;
                window.onload = function () {
                    // 异步请求,得到xml文档,遍历省份的名称给第一个select加opition
                    var request;
                    if(window.XMLHttpRequest) {
                        request = new XMLHttpRequest();
                    }else {
                        request = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    request.onreadystatechange = function () {
                        if (request.readyState == 4 && request.status == 200) {
                            xmlDoc = request.responseXML;
                            // DOM方式解析XML中的省份名称
                            var xmlProvincesTag = xmlDoc.getElementsByTagName("province");
                            for (var i = 0; i < xmlProvincesTag.length; i++) {
                                // 获取到省份名称,设置值给select标签
                                var provinceName = xmlProvincesTag[i].getAttribute("name");
                                var provincePrefix = xmlProvincesTag[i].getAttribute("prefix");
                                var opition = new Option(provinceName, provincePrefix);
                                document.getElementById("province").add(opition);
                            }
                        }
                    }
                    request.open("GET", "/servlet/ProvinceServlet?" + new Date().getTime());
                    request.send(null);
                }
                // 解析城市数据
                function selectCity(provideSelect) {
                    // 每次触发方法前清理数据
                    document.getElementById("city").innerHTML = "";
                    var prefixProvince = provideSelect.value;
                    // 遍历xml文档,找到省份的元素
                    var xmlProvinceTag = xmlDoc.getElementsByTagName("province");
                    for (var i = 0; i < xmlProvinceTag.length; i++) {
                        // 判断选中的缩写名称等于遍历的缩写属性时
                        if (prefixProvince == xmlProvinceTag[i].getAttribute("prefix")) {
                            var xmlCityTag = xmlProvinceTag[i].getElementsByTagName("city");
                            for (var j = 0; j < xmlCityTag.length; j++) {
                                var option = new Option(xmlCityTag[j]
                                    .getAttribute("name"), xmlCityTag[j].getAttribute("name"))
                                document.getElementById("city").add(option);
                            }
                        }
                    }
                }
            </script>
        </head>
        <body>
            <select id="province" name="province" onchange="selectCity(this)"></select>
            <select id="city" name="city"></select>
        </body>
    </html>
    

    这种解析方式比较复杂,后期会借助jQuery来进行操作就非常的方便。

    JSON格式数据

    在JavaScript中其实JSON格式的数据就是JavaScript中的对象。这里我们演示如何解析后台反馈的JSON数据。

    public class JsonServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/plain;charset=UTF-8");
            Person person = new Person("legend", "男性");
            PrintWriter writer = response.getWriter();
            writer.write("{name:'" + person.getName() + "',gender:'" + person.getGender() + "'}");
        }
    }
    

    然后HTML中获取后台反馈的JSON文本,将其转换为JSON串并显示:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <meta charset="UTF-8">
            <title>解析Json数据</title>
            <script type="text/javascript">
                window.onload = function () {
                    document.getElementById("button1").onclick = function () {
                        var request;
                        if(window.XMLHttpRequest) {
                            request = new XMLHttpRequest();
                        }else {
                            request = new ActiveXObject("Microsoft.XMLHTTP");
                        }
                        request.onreadystatechange = function () {
                            if (request.readyState == 4 && request.status == 200) {
                                // 获取到服务器反馈的Json数据
                                var jsonText = request.responseText;
                                //重点:JavaScript将文本转换为JSON
                                var person = eval("("+jsonText+")");
                                document.getElementById("div").innerHTML = person.name + ":" + person.gender;
                            }
                        }
                        request.open("GET", "/servlet/JsonServlet?" + new Date().getTime());
                        request.send(null);
                    };
                }
            </script>
        </head>
        <body>
            <input type="button" id="button1" value="获取数据"><br/>
            <div id="div"></div>
        </body>
    </html>
    

    上面服务端组织数据的方式非常的麻烦,我们可以通过Json_lib库来生成Json数据,需要引入如下Jar包:

    commons-beanutils-1.8.3.jar
    commons-collections-3.2.1.jar
    commons-lang-2.6.jar
    commons-logging-1.1.1.jar
    ezmorph-1.0.6.jar
    json-lib-2.4-jdk15.jar

    • 数组 -> JSON
    @Test
    public void test() {
        String strs[] = {"aaa", "bbb", "ccc"};
        JSONArray jsonArray = JSONArray.fromObject(strs);
        System.out.println(jsonArray);
    }
    

    输出结果:

    ["aaa","bbb","ccc"]

    注意:除数组外,List、Set都可以使用这种方式进行转换。

    • Map-> JSON
    @Test
    public void test() {
        Map<String, String> map = new HashMap<>();
        map.put("name", "legend");
        map.put("gender", "男");
        map.put("age", "28");
        JSONObject object = JSONObject.fromObject(map);
        System.out.println(object);
    }
    

    输出结果:

    "gender":"男","name":"legend","age":"28"}

    注意:除Map外,JavaBean也可以使用这种方式进行转换。

    如果想过滤掉JavaBean中某个字段不包含在生成的JSON中可以使用JsonConfig对象来操作:

    JsonConfig cfg = new JsonConfig();
    cfg.setExcludes(new String[]{"gender"});
    JSONObject object = JSONObject.fromObject(person, cfg);
    
  • 相关阅读:
    JNI中java类型的简写
    JNI 资源释放
    【翻译自mos文章】当指定asm disk 为FRA时,11.2.0.3的dbua hang住
    Codeforces 85D Sum of Medians(线段树)
    Win8.1应用开发之异步编程
    VC++的内联汇编
    WPF实现界面动态布局
    找唯一不出现三次而出现1次的数子O(n)位运算算法
    模块管理常规功能自己定义系统的设计与实现(31--第三阶段 权限设计[1])
    Codeforces Round #FF (Div. 2):C. DZY Loves Sequences
  • 原文地址:https://www.cnblogs.com/pengjingya/p/14992271.html
Copyright © 2011-2022 走看看