JavaWeb笔记-23-XStream、JSON、json-lib

版权声明:转载请联系作者本人!!! https://blog.csdn.net/qq_41307491/article/details/82585887

1、XStream


作用:把JavaBean转换为(序列化为)xml

jar包:
    核心JAR包:xstream-1.4.7.jar;
    依赖包:xpp3_min-1.1.4c(XML Pull Parser,一款速度很快的XML解析器);

使用步骤:
    1)XStream xstream = new XStream();   //创建XStream对象
    2)String xmlStr = xstream.toXML(javabean);   //将JavaBean为xml

方法:
    1).toXML(javabean);   //将JavaBean为xml

    2).alias("别名", 被修改的类型.class)   //使元素名显示为别名

    3).useAttributeFor(Province.class, "name")  //将类中成员生成的元素,设置到类元素属性中

    4).addImplicitCollection(Province.class, "cities")  //去除Collection类型的无用名

    5).omitField(City.class, "description")   //去除指定的类生成名
使用细节及方法示例
    一、别名:修改类型对应的元素名修改
        xstream.alias("china", List.class):让List类型生成的元素名为china
        xstream.alias("province", Province.class):让Province类型生成的元素名为province

    二、使用属性:让类的成员生成为元素的属性!
            背景:默认类的成员,生成的是元素的子元素
        eg:
            //把Province类的名为name成员,生成<province>元素的name属性
            xstream.useAttributeFor(Province.class, "name"):

    三、去除Collection类型的无用名:我们只需要Collection的内容,不希望Collection本身也生成一个元素
        eg:
            //让Province类的名为cities(它是List类型的,它的内容还会生成元素)的成名不生成元素
            xstream.addImplicitCollection(Province.class, "cities"):
    四、指定去除类的生成名,使其不生成xml元素
        eg:
        //在生成的xml中不会出现City类的名为description的对应的元素
        xstream.omitField(City.class, "description"):

2、JSON


1. json:js提供的一种数据交换格式!(如同xml)

2. 语法
    {}:表示为对象。
    属性名:必须使用双引号括起来!单引不行!!!
    属性值:
        1)null
        2)数值
        3)字符串
        4)数组:使用[]括起来
        5)boolean值:true和false

3. 应用json
    var person = {"name":"zhangSan", "age":18, "sex":"male"};

4. json与xml比较
    可读性:XML胜出
    解析难度:JSON本身就是JS对象(主场作战,不用解析),所以简单很多
    流行度:XML已经流行好多年,但在AJAX领域,JSON更受欢迎。


知识点:
    eval():JavaScript全局对象
        可计算某个字符串,并执行其中的的 JavaScript 代码。
    使用: 
    eval(" ("+ str+") ")   str为字符串代码
jsp代码:

window.onload = function() {
    // 获取btn元素
    var btn = document.getElementById("btn");
    btn.onclick = function() {//给按钮的点击事件上添加监听
        // 使用ajax得到服务器端响应,把结果显示到h3中
        //1. 得到request
        var xmlHttp = createXMLHttpRequest();
        //2. 连接
        xmlHttp.open("GET", "<c:url value='/AServlet'/>", true);
        //3. 发送
        xmlHttp.send(null);
        //4. 给xmlHttp的状态改变事件上添加监听
        xmlHttp.onreadystatechange = function() {
            //双重判断
            if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                var text = xmlHttp.responseText;//它是一个json串
                // 执行json串
                var person = eval("(" + text + ")");
                var s = person.name + ", " + person.age + ", " + person.sex;
                document.getElementById("h3").innerHTML = s;
            }
        };
    };
};
</script>
  </head>

  <body>
  <%-- 点击按钮后,把服务器响应的数据显示到h3元素中 --%>
<button id="btn">点击这里</button>
<h1>JSON之Hello World</h1>
<h3 id="h3"></h3>

  </body>

3、json-lib


  json-lib:可以把javabean转换成json串

2. jar包
  json-lib-2.4jdk15.jar

3. 核心类
    1)JSONObject:相当于(Map)
        额外方法:
                .toString() //额外方法
                .fromObject(类)
            eg:
            //把对象转换成JSONObject对象
            JSONObject map = JSONObject.fromObject(person)
    2)JSONArray :相当于(List)
        额外方法
            .toString()
            .fromObject(集合)
        eg:
        //把list转换成JSONArray对象
        JSONArray jsonArray = JSONObject.fromObject(list)

使用XStream把JavaBean转换为(序列化为)xml案例:

public class XStreamTest {
    //返回JavaBean集合
    public List<Province> getProvinceList(){
        Province p1 = new Province();
        p1.setName("北京");
        p1.addCity(new City("东城区", "DongChengQu"));
        p1.addCity(new City("昌平区", "ChangPingQu"));

        Province p2 = new Province();
        p2.setName("辽宁");
        p2.addCity(new City("沈阳", "shenYang"));
        p2.addCity(new City("葫芦岛", "huLuDao"));

        //组装出JavaBean
        List<Province> provinceList = new ArrayList<Province>();
        provinceList.add(p1);
        provinceList.add(p2);

        return provinceList; 
    }
    @Test
    public void fun1(){
        //得到List<Province> 
        List<Province> proList = getProvinceList();
        /*
         * 一、创建XStream对象
         * 二、调用toXML把集合转换成xml字符串
         * 三、输出xml字符串
         */
        XStream xstream = new XStream();
        String s = xstream.toXML(proList);  //把proList集合转为xml
        System.out.println(s);
    }


    /* 针对fun1的输出结果进行改动
     * 别名(alias):
     * 
     * 目的:使得转换后的xml字符串中
     *          默认List类型对应的<List>元素,改名为<china>
     *      默认元素名称为 包名.类型 :
     *          <xstream.Province>,改名为<province>
     *          <xstream.City>,改名为<province>
     */
    @Test
    public void fun2(){

        //得到JavaBean集合
        List<Province> proList = getProvinceList();

        //创建XStream对象
        XStream xstream = new XStream();

        //给指定类型指定别名
        xstream.alias("china",List.class);  //给List类型指定别名
        xstream.alias("province",Province.class);  //给province类型指定别名
        xstream.alias("city",City.class);   //给city类型指定别名

        //调用toXML把集合转换成xml字符串,并输出
        String s = xstream.toXML(proList);  //把proList集合转为xml
        System.out.println(s);
    }


    /* 针对fun2的输出结果进行改动
     * 
     * 改动一、把Province类型的name属性,转化为元素<province>的属性
     *      
     *  将       <province>
     *          <name>辽宁</name>
     *   改动为:
     *      <province name="辽宁">
     *      
     * 改动二、 去除Collection类型的属性
     *      eg:<cities>
     * 
     * 改动三、 去除不想要的JavaBean属性
     *          使指定JavaBean属性,不生成对应的xml元素
     */
    @Test
    public void fun3(){
        //得到JavaBean集合
        List<Province> proList = getProvinceList();
        //创建XStream对象
        XStream xstream = new XStream();    
        //给指定类型指定别名
        xstream.alias("china",List.class);  //给List类型指定别名
        xstream.alias("province",Province.class);  //给province类型指定别名
        xstream.alias("city",City.class);   //给city类型指定别名

        //改动一、
        //把Province类型的name属性,转化为元素<province>的属性
        xstream.useAttributeFor(Province.class, "name");

        /* 改动二、
         * 去除<cities>这样的Collection类型的属性
         *      传参为(类型,集合名)
         *      Provice类的名为cities的List类型的属性!
         */
        xstream.addImplicitCollection(Province.class, "cities");

        //改动三、不生成<description>元素
        xstream.omitField(City.class, "description");

        //调用toXML把集合转换成xml字符串,并输出
        String s = xstream.toXML(proList);  //把proList集合转为xml
        System.out.println(s);

    }
}

/* 
 --- fun1 输出结果:

 <list>       -->List类型显示为List
  <xstream.Province>   --> 元素名称为 包名.类型   JavaBean的类型为Province 
    <name>北京</name>   -->JavaBean的属性名
    <cities>        -->JavaBean的属性名
      <xstream.City>  -->包名.类型
        <name>东城区</name>   --属性名
        <description>DongChengQu</description>   --属性名
      </xstream.City>
      <xstream.City>
        <name>昌平区</name>
        <description>ChangPingQu</description>
      </xstream.City>
    </cities>
  </xstream.Province>
  <xstream.Province>
    <name>辽宁</name>
    <cities>
      <xstream.City>
        <name>沈阳</name>
        <description>shenYang</description>
      </xstream.City>
      <xstream.City>
        <name>葫芦岛</name>
        <description>huLuDao</description>
      </xstream.City>
    </cities>
  </xstream.Province>
</list>


---fun4 输出结果:
<china>
  <province name="北京">
    <city>
      <name>东城区</name>
    </city>
    <city>
      <name>昌平区</name>
    </city>
  </province>
  <province name="辽宁">
    <city>
      <name>沈阳</name>
    </city>
    <city>
      <name>葫芦岛</name>
    </city>
  </province>
</china>


 * 
 */

ajaxutils.js 工具封装及简单使用

ajaxutils.js 

// 创建request对象
function createXMLHttpRequest() {
    try {
        return new XMLHttpRequest();//大多数浏览器
    } catch (e) {
        try {
            return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
        } catch (e) {
            try {
                return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本  
            } catch (e) {
                alert("哥们儿,您用的是什么浏览器啊?");
                throw e;
            }
        }
    }
}
/*
 * option对象有如下属性
 */
        /*请求方式*/method, 
        /*请求的url*/ url, 
        /*是否异步*/asyn, 
        /*请求体*/params, 
        /*回调方法*/callback,
        /*服务器响应数据转换成什么类型*/type

function ajax(option) {
    /*
     * 1. 得到xmlHttp
     */
    var xmlHttp = createXMLHttpRequest();
    /*
     * 2. 打开连接
     */
    if(!option.method) {//默认为GET请求
        option.method = "GET";
    }
    if(option.asyn == undefined) {//默认为异步处理
        option.asyn = true;
    }
    xmlHttp.open(option.method, option.url, option.asyn);
    /*
     * 3. 判断是否为POST
     */
    if("POST" == option.method) {
        xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }
    /*
     * 4. 发送请求
     */
    xmlHttp.send(option.params);

    /*
     * 5. 注册监听
     */
    xmlHttp.onreadystatechange = function() {
        if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//双重判断
            var data;
            // 获取服务器的响应数据,进行转换!
            if(!option.type) {//如果type没有赋值,那么默认为文本
                data = xmlHttp.responseText;
            } else if(option.type == "xml") {
                data = xmlHttp.responseXML;
            } else if(option.type == "text") {
                data = xmlHttp.responseText;
            } else if(option.type == "json") {
                var text = xmlHttp.responseText;
                data = eval("(" + text + ")");
            }

            // 调用回调方法
            option.callback(data);
        }
    };
};


json简单使用

<script type="text/javascript" src="<c:url value='/ajax-lib/ajaxutils.js'/>">
</script>

<script type="text/javascript">
window.onload = function() {
    var btn = document.getElementById("btn");
    btn.onclick = function() {
        /*
        1. ajax对象
        */
        ajax(
            {
                url:"<c:url value='/AServlet'/>",
                type:"json",
                callback:function(data) {
                    document.getElementById("h3").innerHTML = data.name + ", " + data.age + ", " + data.sex;
                }
            }
        );
    };
};
</script>
  </head>

  <body>
<%-- 点击按钮后,把服务器响应的数据显示到h3元素中 --%>
<button id="btn">点击这里</button>
<h1>显示自己封装的ajax小工具</h1>
<h3 id="h3"></h3>
  </body>

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/82585887