XStream:工具:
1: 能够将javabean 序列化问xml 文件:
2: 导入jar包:
xstram-jar: 核心jar包:
强依赖:xpp3-min.jar:xml的解析器:
3: 使用步骤:
获得对象:
XStream xstream = new XStream();
String xml = xstream.toXML(javaBean);
4: 代码实现: 如何将javaBean转换成xml文件:
(1)导入jar包:
(2)准备javaBean对象;
(3)获得XStream对象:
(4)调用方法: 转换成xml。 文件。
5:XStream的使用细节:
a:别名的使用:
xstream.alias(“china”, List.class); 将List 类型转换成china标签:
xstream.alias(“province”, Province.class);将Province实体类转换成province标签:
b:让实体类当中的属性不单独的生成一个标签, 而是生成元素的一个属性。
xstream.useAttributeFor(Province.class, “name”);
解析: 将Province类当中name属性在生成元素的时候, 将name作为一个province的属性存在。
c:去重Collection类型的无用的标签。
xstream.addImplicitCollection(Province.class, “cities”);
解析: 在生成元素的时候, 让Province的cities属性不单独的生成一个元素。
d:实体的某个属性不生成到xml当中:
xstream.omitField(City.class, “description”);
City当中的description不生成元素。
代码如下:
package com.yidongxueyuan.domain;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.thoughtworks.xstream.XStream;
public class TestXStream {
//准备数据:
public List<Province> getProvince(){
List<Province> list = new ArrayList<Province>();
//准备省:
Province pro= new Province();
pro.setName("山东");
pro.getCities().add(new City("青岛市","美丽的滨海城市"));
pro.getCities().add(new City("济南市","这是一个美丽的大泉城"));
Province pro2= new Province();
pro2.setName("河北省");
pro2.getCities().add(new City("廊坊市","这是一个很好的大都市"));
pro2.getCities().add(new City("石家庄","这是河北的省会"));
//将省装进list集合当中:
list.add(pro);
list.add(pro2);
return list;
}
/*
<list> ---->解析的是一个list集合: list集合做了跟标签: set :
<com.yidongxueyuan.domain.Province> ----->list集合当中的实体, 生成了一个标签: 实体的全路径名称承当标签:
<name>山东</name> name: province 实体的属性:
<cities> cities: 也是province 实体的属性:
<com.yidongxueyuan.domain.City> ---->City:这是集合当中实体的类型:
<name>青岛市</name> ---->City:实体的属性:
<description>美丽的滨海城市</description> City:实体的属性:
</com.yidongxueyuan.domain.City>
<com.yidongxueyuan.domain.City>
<name>济南市</name>
<description>这是一个美丽的大泉城</description>
</com.yidongxueyuan.domain.City>
</cities>
</com.yidongxueyuan.domain.Province>
<com.yidongxueyuan.domain.Province>
<name>河北省</name>
<cities>
<com.yidongxueyuan.domain.City>
<name>廊坊市</name>
<description>这是一个很好的大都市</description>
</com.yidongxueyuan.domain.City>
<com.yidongxueyuan.domain.City>
<name>石家庄</name>
<description>这是河北的省会</description>
</com.yidongxueyuan.domain.City>
</cities>
</com.yidongxueyuan.domain.Province>
</list>
*/
@Test
public void testXStream1() throws Exception {
List<Province> provinces = getProvince();
//创建XStream对象:
XStream xstream = new XStream();
String xml = xstream.toXML(provinces);
System.out.println(xml);
}
/*
* 1:生成的xml 并不是我们理想型:
* 希望: list 集合: ---->china
* <com.yidongxueyuan.domain.Province>---<province>
*
* 此时就需要使用xstream当中的别名:
*
*/
//使用别名替换后的结果:
/*
<china>
<province>
<name> 山东 </name>
<cities>
<city >
<name>青岛市</name>
<description>美丽的滨海城市</description>
</city>
<city>
<name>济南市</name>
<description>这是一个美丽的大泉城</description>
</city>
</cities>
</province>
<province>
<name>河北省</name>
<cities>
<city>
<name>廊坊市</name>
<description>这是一个很好的大都市</description>
</city>
<city>
<name>石家庄</name>
<description>这是河北的省会</description>
</city>
</cities>
</province>
</china>
*/
@Test
public void testXStream2() throws Exception {
List<Province> provinces = getProvince();
XStream xstream = new XStream();
/*
* 使用别名:
* xstream.alias()
*/
xstream.alias("china", List.class);// class类型:
xstream.alias("province", Province.class);
xstream.alias("city", City.class);
String xml = xstream.toXML(provinces);
System.out.println(xml);
}
/*
* 希望: name 这个标签当中的内容,设置成 province的属性:
* <province>
* <name> 山东 </name>
* </province>
*
* 转换成: 如下格式:
* <province name="山东"/>
* <city name="xx"/>
*/
//准换后的结果:
/* <china>
<province name="山东">
<cities> ---
<city name="青岛市">
<description>美丽的滨海城市</description>
</city>
<city name="济南市">
<description>这是一个美丽的大泉城</description>
</city>
</cities>
</province>
<province name="河北省">
<cities>
<city name="廊坊市">
<description>这是一个很好的大都市</description>
</city>
<city name="石家庄">
<description>这是河北的省会</description>
</city>
</cities>
</province>
</china>*/
@Test
public void testXStream3() throws Exception {
List<Province> provinces = getProvince();
XStream xstream = new XStream();
xstream.alias("china", List.class);// class类型:
xstream.alias("province", Province.class);
xstream.alias("city", City.class);
/*
* 将实体的属性转换成 标签的属性: 不让其生成一个单独的标签: ..
* xstream.
*/
xstream.useAttributeFor(Province.class, "name");
xstream.useAttributeFor(City.class, "name");
String xml = xstream.toXML(provinces);
System.out.println(xml);
}
/*
<province name="山东">
<cities> ---
<city name="青岛市">
<description>美丽的滨海城市</description>
</city>
<city name="济南市">
<description>这是一个美丽的大泉城</description>
</city>
</cities>
</province>
分析: cities 标签是province 的一个属性标签: 这个属性标签, 没实质型的作用: 不要让其生成:
cities 属性:是一个list 集合类型: 在生产元素的时候, 只需要生成集合当中的实体。 list 这个类型没有必要在生成一个单独的标签。,
*/
//生成的结果:
/* <china>
<province name="山东">
<city name="青岛市">
<description>美丽的滨海城市</description>
</city>
<city name="济南市">
<description>这是一个美丽的大泉城</description>
</city>
</province>
<province name="河北省">
<city name="廊坊市">
<description>这是一个很好的大都市</description>
</city>
<city name="石家庄">
<description>这是河北的省会</description>
</city>
</province>
</china>*/
@Test
public void testXStream4() throws Exception {
List<Province> provinces = getProvince();
XStream xstream = new XStream();
xstream.alias("china", List.class);// class类型:
xstream.alias("province", Province.class);
xstream.alias("city", City.class);
xstream.useAttributeFor(Province.class, "name");
xstream.useAttributeFor(City.class, "name");
/*
* list集合的类型没有必要生成,只生成list集合当中的存放的实体:
* addImplicitCollection(Class, "fieldName")
*/
xstream.addImplicitCollection(Province.class, "cities");
String xml = xstream.toXML(provinces);
System.out.println(xml);
}
/*
* <city name="石家庄">
<description>这是河北的省会</description>
</city>
分析: city当中的标签 description这个标签, 不想让其生成到xml当中:
*/
/*
<china>
<province name="山东">
<city name="青岛市"/>
<city name="济南市"/>
</province>
<province name="河北省">
<city name="廊坊市"/>
<city name="石家庄"/>
</province>
</china>
*/
@Test
public void testXStream5() throws Exception {
List<Province> provinces = getProvince();
XStream xstream = new XStream();
xstream.alias("china", List.class);// class类型:
xstream.alias("province", Province.class);
xstream.alias("city", City.class);
xstream.useAttributeFor(Province.class, "name");
xstream.useAttributeFor(City.class, "name");
xstream.addImplicitCollection(Province.class, "cities");
/*
* 不想生成到xml当中:
* omitField(Class,field);
*/
xstream.omitField(City.class, "description");
String xml = xstream.toXML(provinces);
System.out.println(xml);
}
}
JSON的使用:
1: json 数据交换格式:js当中的:
2:数据传输:
XML: 这是一种重量级别的数据交换格式:
json: 这是一个轻量级别的数据交换格式:
3: js当中定义一个json对象:
//js当中创建了一个json对象:
var person = {“username”:“binbin”,“age”:78,“gender”:“nan”};
var value = person.属性名称; //获得了属性名称对应的属性值:
细节: 创建的{}对象必须使用{}引起来。
{}当中分为属性名称和属性值: 属性的名称必须使用双引号引起来。
属性值:属性可以是
字符串类型:
数值类型:
布尔类型:
数组:
null
//复杂的json对象:
var value= {"username":"lisi","address": [
{
address:[{},{},{}]
},{
},{
}
]}
下面的例子演示客户端发送ajax请求,服务器端接收。
JSP代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'json1.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<script>
/* var person ={"username":"binchen","age":29,"gender":"nan"};
alert(person.username); */
//定义了一个字符串:
var str ="{\"username\":\"binchen\",\"age\":29,\"gender\":\"nan\"}";
//函数: eval();模拟了浏览器的引擎。 能够解析js代码:
var person = eval("("+ str +")");// str 解析成一个json对象:
alert(person.username);
// var str1="ab\"c";
</script>
</body>
</html>
服务端代码:
package com.yidongxueyuan.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//给客户端响应了一个json串:
String str ="{\"username\":\"binchen\",\"age\":29,\"gender\":\"nan\"}";
response.getWriter().println(str);
}
}
将 javaBean转换成json 对象:
工具: Apache组织提供:
使用步骤:
(1)导入jar包:
核心jar包:
依赖jar包: xxx
(2)核心类:
JSONObject: map集合:
JSONArray: list集合:
解析:
核心类: 作为map集合或者是list集合使用的比较少: 应用比较广泛的是, 将准备好的javaBean转换成json对象:
代码如下:
package com.yidongxueyuan.domain;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.junit.Test;
public class TestJson {
@Test
public void test1() throws Exception {
//作为一个map集合使用:
JSONObject json = new JSONObject();
json.put("username", "lisi");
json.put("age", "21");
json.put("gender", "nan");
System.out.println(json.toString());//[输出为:{"name":"zhangSan","age":"18","sex":"male"}]
//创建一个Person对象:
Person p= new Person("wangwu","nan","21");
JSONObject json2 = JSONObject.fromObject(p);
System.out.println(json2);
// {"age":"21","gender":"nan","username":"wangwu"}// json
JSONArray list = new JSONArray();//能够list集合使用:
Person p3= new Person("wangwu","nan","21");
list.add(p3);//作为list集合使用: p装进list集合当中:
System.out.println(list);// [{"age":"21","gender":"nan","username":"wangwu"}]
//转换javaBean : 广泛应用:
JSONArray json3 = JSONArray.fromObject(p3);
System.out.println(json3);
//发送到前段解析:
}
}