1. 程式人生 > >JavaWeb筆記-23-XStream、JSON、json-lib

JavaWeb筆記-23-XStream、JSON、json-lib

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>