Ajax学习(三):XML及Json与Ajax配合使用

目录:

1、XML的序列化与反序列化定义:

2XStream的作用:

3XStream的必导jar包:

4XStream使用步骤:

5、XStream常用方法:

6、Json定义:

7、eval函数转化Json字符串的时候外面为什么要包装一层圆括号?

8、Json的语法:

9、将Ajax打包生成小工具进行Json测试:

10、服务器端将Java对象转换为Json字符串:

11、JSON-lib常用方法测试:

12、Json与XML比较:

13、java.lang.NoClassDefFoundError解决:


1、XML的序列化与反序列化定义:

序列化:将对象状态转换为可保持或传输的格式的过程。

比如:Json序列化、XML序列化、二进制序列化、SOAP序列化等等。

反序列化:将流转换为对象。

2、XStream的作用:

把JavaBean转换为(序列化为)xml。

3、XStream的必导jar包:

①核心jar包:xstream-1.4.9.jar

②必须依赖包:xpp_3min-1.1.4c(XML Pull Parser,一款速度很快的XML解析器)

4、XStream使用步骤:

XStream xstream = new XStream();

String xmlStr = xstream.toXML(JavaBean);

5、XStream常用方法:

①xstream.alias("China",List.class);

//让List类型生成的元素名为China

②xstream.alias(“Province”,Province.class);

//让Province类型生成的元素名为Province

③xstream.useAttributeFor(Province.class,“ProvinceName”);

//把Province类中的名为ProvinceName的成员变量,生成<Province>元素的ProvinceName属性

④xstream.addImplicitCollection(Province.class,“cityList”);

//让Province类的名为cityList的成员变量不生成元素,但是List中的内容还会生成元素

⑤xstream.omitField(City.class,“description”);

//在生成的xml中不会出现City类的名为description的对应元素。

示例代码:

(a)Province.java实体类

package com.remoa.XStreamTest;

import java.util.ArrayList;
import java.util.List;

public class Province {
	private String provinceName;
	private List<City> cityList = new ArrayList<City>();
	public String getProvinceName() {
		return provinceName;
	}
	public void setProvinceName(String provinceName) {
		this.provinceName = provinceName;
	}
	public List<City> getCityList() {
		return cityList;
	}
	public void setCityList(List<City> cityList) {
		this.cityList = cityList;
	}
	@Override
	public String toString() {
		return "Province [provinceName=" + provinceName + ",cityList=" + cityList + "]";
	}
	
	public void addCity(City city){
		cityList.add(city);
	}
	
}
(b)City.java实体类:

package com.remoa.XStreamTest;

public class City {
	private String cityName;
	private String description;
	public String getCityName() {
		return cityName;
	}
	public void setCityName(String cityName) {
		this.cityName = cityName;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	@Override
	public String toString() {
		return "City [cityName=" + cityName + ",description=" + description + "]";
	}
	public City(String cityName,String description) {
		super();
		this.cityName = cityName;
		this.description = description;
	}
}
(c)Demo.java演示类

package com.remoa.XStreamTest;

import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.XStream;

public class Demo {
	public List<Province> getProvinceList(){
		Province p = new Province();
		p.setProvinceName("广东省");
		p.addCity(new City("广州市","GuangZhou City"));
		p.addCity(new City("深圳市","Shenzhen City"));
		Province p2 = new Province();
		p2.setProvinceName("江西省");
		p2.addCity(new City("南昌市","NanChang City"));
		p2.addCity(new City("景德镇市","JingDeZhen City"));
		List<Province> list = new ArrayList<Province>();
		list.add(p);
		list.add(p2);
		return list;
	}
	
	public static void main(String []args){
		Demo demo = new Demo();
		List<Province> list = demo.getProvinceList();
		XStream xstream = new XStream();
		//1、基本输出:
		String xmlStr = xstream.toXML(list);
		System.out.println("1、基本输出结果为:");
		System.out.println(xmlStr);
		//2、使用别名:
		xstream.alias("China",List.class);
		xstream.alias("Province",Province.class);
		xstream.alias("City",City.class);
		xmlStr = xstream.toXML(list);
		System.out.println("2、使用别名输出结果为:");
		System.out.println(xmlStr);
		//默认JavaBean的属性都会生成子元素,现在希望生成元素的属性
		//3、把Province元素的属性,生成<Province>的属性
		System.out.println("3、生成元素的属性:");
		xstream.useAttributeFor(Province.class,"provinceName");//把指定类的指定属性改为xml标签的属性
		xmlStr = xstream.toXML(list);
		System.out.println(xmlStr);
		//4、集合属性不显示
		System.out.println("4、集合属性不显示:");
		xstream.addImplicitCollection(Province.class,"cityList");//去除指定类中的指定Collection属性,只把List中的元素生成xml文档。implicit:隐含其中的
		xmlStr = xstream.toXML(list);
		System.out.println(xmlStr);
		//5、一个JavaBean中含有不想显示在xml中的属性,将那些属性不生成xml元素
		System.out.println("5、将某些JavaBean属性不生成xml元素");
		xstream.omitField(City.class,"description");
		xmlStr = xstream.toXML(list);
		System.out.println(xmlStr);
	}
}

运行结果部分截图:

图5.1 运行结果

说明:

①list:List类型显示list

②com.remoa.XStreamTest.Province:javaBean的类型为Province,显示的元素名称为类的完整名

③cityList:JavaBean的属性名

④com.remoa.XStreamTest.City:类名

⑤cityName:属性名

图5.2 得到想要的最终结果

6、Json定义:

Json(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式。

Json是用字符串来表示字符串对象,例如可以在Servlet中发送一个Json格式的字符串给客户端JavaScript,JavaScript可以执行这个字符串,得到一个JavaScript对象。

7、eval函数转化Json字符串的时候外面为什么要包装一层圆括号?

将服务器端构建好的Json数据转化为可用的JavaScript对象,利用eval函数在转化的时候需要将Json字符串的外面包装一层圆括号。

加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式转化为对象,而不是作为语句来执行。例如对象字面量{},如果不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。

alert(eval("{}");// return undefined

alert(eval("({})");// return object[Object]

8、Json的语法:

(1){}:对象

(2)属性名必须用双引号括起来,单引号不可以。

(3)属性值:

①null

②数值:不用添加修饰

③字符串:使用双引号””括起来

④数组:使用方括号[]括起来

⑤boolean值:true和false


9、将Ajax打包生成小工具进行Json测试:

(1)未打包前基础测试:

①测试代码:

(a)JsonServlet.java

package com.remoa.JsonTest;

import java.io.IOException;
import javax.servlet.servletexception;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/JsonServlet")
public class JsonServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException {
		response.setContentType("text/html;charset=utf-8");
		String jsonStr = "{\"name\": \"张三\",\"age\":18,\"sex\":\"male\"}";
		response.getWriter().print(jsonStr);
		System.out.println(jsonStr);
	}

	protected void doPost(HttpServletRequest request,IOException {
		doGet(request,response);
	}

}
(b)前端jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
	<html>
		<head>
		<Meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>json学习</title>
		<script type="text/javascript">
			function createXMLHttpRequest(){
				try{
					return new XMLHttpRequest();
				}catch(e){
					try{
						return new ActiveXObject("Msxml2.XMLHTTP");
					}catch(e){
						try{
							return new ActiveXObject("Microsoft.XMLHTTP");
						}catch(e){
							throw e;
						}
					}
				}
			};
			
			window.onload = function(){
				var btn = document.getElementById("btn");
				btn.onclick = function(){
					//使用ajax得到服务器端响应,将结果响应到h3中
					var request = createXMLHttpRequest();
					request.open("GET","/Learn201705/JsonServlet",true);
					request.send(null);
					request.onreadystatechange = function(){
						if(request.status == 200 && request.readyState == 4){
							var text = request.responseText;//得到返回的Json字符串
							var person = eval("(" + text + ")");
							var s = "<table border=\"1\">" + "<tr><td>姓名</td><td>年龄</td><td>性别</td>" + "<tr><td>" + person.name + "</td><td>"+ person.age + "</td><td>" + person.sex + "</td></tr></table>";
							document.getElementById("show").innerHTML = s;
						}
					}
				};
			};
		</script>
	</head>
	<body>
		<h1>json测试</h1>
		<button type="button" id="btn">click here</button>
		<h3 id="show"></h3>
	</body>
</html>

②运行结果:

图9.1 运行结果1

(2)将Ajax打包成小工具后重复测试:

①代码修改部分:

(a)在web-content中创建ajax-lib目录,在目录下创建ajaxutil.js

//创建request方法
function createXMLHttpRequest(){
	try{
		return new XMLHttpRequest();
	}catch(e){
		try{
			//IE6.0
			return new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			try{
				//IE5.5及更早版本
				return new ActiveObject("Microsoft.XMLHTTP");
			}catch(e){
				throw e;
			}
		}
	}
};

//请求方式、请求url,是否异步,请求体内容,回调方法,服务器响应结果类型(json数据?xml数据?text数据?)
function ajax(option){
	var request = createXMLHttpRequest();
	if(!option.method){
		option.method = "GET";//设置不传则请求方式默认值为get
	}
	if(option.asyn == undefined){
		option.asyn = true;//默认使用异步
	}
	request.open(option.method,option.url,option.asyn);
	if(option.method == "POST"){
		request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	}
	request.send(option.params);
	request.onreadystatechange = function(){
		if(request.status == 200 && request.readyState == 4){
			var data;
			if(!option.dataType){
				data = request.responseText;//默认为文本
			}else if(option.dataType == "xml"){
				data = request.responseXML;
			}else if(option.dataType == "json"){
				var text = request.responseText;
				data = eval("(" + text + ")");
			}else if(option.dataType == "text"){
				data = request.responseText;
			}
			//调用回调方法
			option.callback(data);
		}
	}
};
(b)将页面其他的js封装成单独文件json2.js

window.onload = function(){
	var btn = document.getElementById("btn");
	btn.onclick = function(){
		ajax({
			url:"/Learn201705/JsonServlet",dataType:"json",callback:function(data){
				document.getElementById("show").innerHTML = "<table border=\"1\">" + "<tr><td>姓名</td><td>年龄</td><td>性别</td>" + "<tr><td>" + data.name + "</td><td>"+ data.age + "</td><td>" + data.sex + "</td></tr></table>";
			}
		});
	};
};
(c)修改后页面代码,清晰多了
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<Meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title here</title>
		<script type="text/javascript" src="<%=request.getcontextpath() %>/ajax-lib/ajaxutil.js"></script>
		<script type="text/javascript" src="<%=request.getcontextpath() %>/js/json2.js"></script>
	</head>
	<body>
		<h1>json测试</h1>
		<button type="button" id="btn">click here</button>
		<h3 id="show"></h3>
	</body>
</html> 

②可以看到相同的运行结果:

图9.2 运行结果2


10、服务器端将Java对象转换为Json字符串:

(1)使用json-lib的jar包:

①核心jar包:json-lib.jar(本案例使用版本2.4)

②依赖jar包:

Json-lib requires (at least) the following dependencies in your classpath:

jakarta commons-lang 2.5(本案例使用版本3.5)

jakarta commons-beanutils 1.8.0(本案例使用版本1.9.3)

jakarta commons-collections 3.2.1(本案例使用版本4.1)

jakarta commons-logging 1.1.1(本案例使用版本1.2)

ezmorph 1.0.6


11、JSON-lib常用方法测试:

(1)JSONObject:把它看成map来使用

①JSONObject map = new JSONObject();

map.put(key值,value值);

map.toString();//返回json字符串

②JSONObject map = JSONObject.fromObject(person);//把对象转换为JSONObject对象

(2)JSONArray:把它看成List来使用

①JSONArray array = new JSONArray();

array.add(JavaBean对象);

array.toString();//返回json字符串

②JSONArray jsonArray = JSONObject.fromObject(array);//把list转换成JSONArray对象

(3)测试代码:

package com.remoa.JsonTest;

import java.util.ArrayList;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class JsonLibTest {
	//当成map来用
	public String test1(){
		JSONObject map = new JSONObject();
		map.put("name","张三");
		map.put("age",18);
		map.put("sex","男");
		String jsonStr = map.toString();
		return jsonStr;
	}
	
	//当已经有一个Person对象时,可以把Person转换为JSONObject对象。
	public String test2(){
		Person p = new Person("李四",22,"女");
		JSONObject map = JSONObject.fromObject(p);
		return map.toString();
	}
	
	//Json的Array
	public String test3(){
		Person p1 = new Person("李四","女");
		Person p2 = new Person("张三",24,"男");
		JSONArray array = new JSONArray();
		array.add(p1);
		array.add(p2);
		return array.toString();
	}
	
	//把List转换为Array
	public String test4(){
		Person p1 = new Person("李四","男");
		Person p3 = new Person("王五",26,"男");
		List<Person> list = new ArrayList<Person>();
		list.add(p1);
		list.add(p2);
		list.add(p3);
		return JSONArray.fromObject(list).toString();
	}
		
	
	public static void main(String[] args) {
		JsonLibTest test = new JsonLibtest();
		System.out.println(test.test1());
		System.out.println(test.test2());
		System.out.println(test.test3());
		System.out.println(test.test4());
	}
}

(4)运行结果:

图11.1 运行结果截图


12、Json与XML比较:

①可读性:XML好

②解析难度:Json本身就是js对象,简单很多

③流行度:XML更流行,但在Ajax领域,Json更流行

13、java.lang.NoClassDefFoundError解决:

(1)问题描述:

图13.1 问题描述

(2)解决方案:

NoClassDefFoundError:在运行时类加载器在classpath下找不到需要加载的类,所以我们需要把对应的类加载到classpath中,或者检查为什么类在classpath下是不可用的

本案例是由于commons-lang3-3.1.jar、commons-collections 4.1出现异常:

需要完成①②两步:

①因为新版的commons-lang的jar包对旧版的不兼容了,将jar包从新版本替换为老版本2.6;

②本案例使用的commons-collections 4.1对旧版的不兼容了,将jar包从新版本替换为老版本3.2,问题得到解决。

jar包下载地址:

http://commons.apache.org/proper/commons-lang/download_lang.cgi

http://commons.apache.org/proper/commons-collections/download_collections.cgi

Ajax学习三:XML及Json与Ajax配合使用的更多相关文章

  1. xcode – Cordova plugin.xml添加“Header Search Paths”条目

    我希望将Cordova插件添加到Xcode项目后,在“HeaderSearchPaths”下添加一个新条目.如何在Cordovaplugin.xml文件中进行配置?

  2. ios – 有关多个连接/提要/视图的XML解析的设计/实现建议

    >我应该在每个视图中都有解析器类/对象或解析XML提要吗?

  3. iOS的相当于Android的colors.xml的是什么?

    如果没有,组织整个应用程序使用的颜色的最佳方法是什么?

  4. iOS中的XML转换为JSON

    我需要将XML响应转换为JSON.我的XML响应:我正在使用本网站的XMLReader支持文件:XMLReader我正在使用此代码将XML转换为JSON我收到了JSON响应:我需要这样的回应:我在线转换时得到这个回应.如何获得这样的回应提前致谢.解决方法此代码不会将任何内容转换为JSON.它给你一个NSDictionary.您需要从字典中实际创建JSON数据.尝试这个大小.

  5. ios – Info.plist格式不正确

    解决方法plist文件是严格指定格式的XML文档;XML和PropertyList结构都有非常严格的规则.如果您尝试手动编辑info.plist(即文本),您可以轻松搞砸事情,方法是打开Asas>源代码:您不太可能正确使用此格式.因此,您应该始终使用OpenAs>编辑info.plist.物业清单:这允许属性列表编辑器为您生成XML,并且不太可能在生成的XML结构中出错.当然,我想你仍然可能搞砸某些东西的价值……

  6. ios – 在没有XML的情况下更新sqlite数据库

    我的应用程序需要来自sqlite数据库的数据.它将附带此数据库的一个版本,但我需要定期更新它(很可能每月一次).通常情况下,我一直在通过我设置的一堆网络服务将我的应用程序的其他部分的更新作为XML发送,但我现在正在处理的这个特定数据库非常大(大约20-30MB),而且我当我尝试以这种方式发送时出现超时错误.我尝试将数据库放在我的公司服务器上,然后将其下载到NSData对象中.然后我将该数据对象保存

  7. ios – CGPath和UIBezierPath()有什么区别?

    目前,我正在努力制作一个自定义按钮,我有一个图像,并具有坐标,但我发现您可以通过使用CGPath类或UIBezierPath创建一个按钮/对象类.有人可以告诉我两者有什么区别?解决方法CGPath是CoreGraphics库的不透明类型,而UIBezierPath是UIKit中的Obj-C类.UIBezierPath是一个围绕CGPath的包装,具有更加面向对象的界面和一些方便的方法.使用CGPath可能会略微更快,因为它不必经过Obj-C,并且它具有更高级的功能,如CGPathApply.重要的是,UI

  8. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  9. parser:parseErrorOccurred31#parser:parseErrorOccur

    GB2312或GBK编码的网页,要先用gb编码解码,然后替换其中的gb字符串,再用utf8编码成data给parser就能解析中文网页了。NSXMLParser将停止解析在遇到特殊字符后我读一个XML文件从谷歌天气api和解析它使用NSXMLParser。城市问题是巴黎。它不会处理之后像postal_code的标签。所以我的问题是,有什么办法可以从返回的URLXML字符串中删除所有非ascii字符吗?解决方法1:还行。然后我将字符串转换为NSdata然后把nsdata对象传递给我的NSXMLParser。

  10. swift 快速奔跑的兔几 本节的内容是:序列化与反序列化

    在cocoa中,我们经常需要向磁盘保存数据块,cocoa将这些数据块表示为NSData对象例如,有一个字符串,将其转换为NSData,可以使用如下方法:我们还可以将对象转化为数据。遵守协议NSCoding的对象可以转换为NSData对象,也可以从NSData对象中加载,方法如下:

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部