JavaWeb筆記-23-XStream、JSON、json-lib
阿新 • • 發佈:2018-11-03
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>