ajax—初学第二课:ajax的响应数据格式(json/xml/字符串)

一、基本说明

1、在ajax中,获取数据时,一般是将数据库中的数据通过Java对象存储在list中,而浏览器不能解析Java对象,所以在后台响应数据时,只能将数据响应给js,响应数据必须遵循js代码规范才能被解析,

此时有三种解决方式(规范方式):

     ① json;

     ② XML:一个数据表中有多少条记录,对应的xml文件就有多少个子标签;

     ③ 直接响应成普通字符串(HTML);

2、json介绍

     ①Json只是js声明对象的一个格式,是将数据按照json的格式拼接好的字符串,方便使用eval()方法将接受的字符串数据直接转换为js的对象。所谓json,无非就是把Java对象在后台服务器直接拼成json格式的字符串,然后响应到前台页面,用eval()转向,相当于把一个Java对象的数据,转换为一个js对象来存储,以json格式的字符串的形式响应到前端页面。json主要用来做数据传输,xml主要做配置文件。

     ②JSON一种简单的数据格式,比xml更轻巧。

     ③JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。

     ④JSON 用冒号(而不是等号)来赋值。每一条赋值语句用逗号分开。整个对象用大括号封装起来。可用大括号分级嵌套数据。对象描述中存储的数据可以是字符串,数字或者布尔值。对象描述也可存储函数,那就是对象的方法。

     ⑤JSON的规则很简单:对象是一个无序的     “  ‘名称:值’对  ”    集合。一个对象以  “{”  开始,以   “}”   结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’对”之间使用“,”(逗号)分隔。

       规则如下:

       1)映射用冒号(“:”)表示。名称:值

       2)并列的数据之间用逗号(“,”)分隔。名称1:值1,名称2:值2

       3) 映射的集合(对象)用大括号(“{}”)表示。{名称1:值1,名称2:值2}

       4) 并列数据的集合(数组)用方括号(“[]”)表示。

[

   {名称1:值,名称2:值2},

  {名称1:值,名称2:值2}

]  

元素值可具有的类型:string, number, object, array, true, false, null

JSON 用冒号(而不是等号)来赋值。每一条赋值语句用逗号分开。整个对象用大括号封装起来。

可用大括号分级嵌套数据。 对象描述中存储的数据可以是字符串,数字或者布尔值。对象描述也可存储函数,那就是对象的方法。

JSON的规则很简单:对象是一个无序的“‘名称:值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’对”之间使用“,”(逗号)分隔。 规则如下: 1)映射用冒号(“:”)表示。名称:值 2)并列的数据之间用逗号(“,”)分隔。名称1:值1,名称2:值2 3) 映射的集合(对象)用大括号(“{}”)表示。{名称1:值1,名称2:值2} 4) 并列数据的集合(数组)用方括号(“[]”)表示。

[

   {名称1:值,名称2:值2},

  {名称1:值,名称2:值2}

]  

元素值可具有的类型:string, number, object, array, true, false, null
 

3. Gson 理解

    GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。

    特点: a、快速、高效

          b、代码量少、简洁

          c、面向对象

            d、数据传递和解析方便

  方法:

        ①Gson提供了public String toJson(Objcet obj)方法,可以将   对象/数组/集合   转化为json字符串。

        

二、未封装代码记录

1. second.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax second</title>
<!--
   需求分析:
	1.在当前页面内显示查询结果,考虑使用ajax;
	2.创建ajax函数;
	3.调用ajax函数发送请求到UserServlet;
	4.调用业务层获取对应的数据。
-->
<script type="text/javascript">
	//获取后台数据
	function getData(){
		
		//获取用户请求信息
		var name=document.getElementById("uname").value;	
		
		//创建ajax引擎对象
		var ajax;
		if(window.XMLHttpRequest){
			ajax=new XMLHttpRequest();
		}else if(window.ActiveXObject){
			ajax=new ActiveXObject("Msxml2.XMLHTTP");
		}
		
		//复写onreadystatechange函数
		ajax.onreadystatechange=function(){
			
			//判断ajax状态码
			if(ajax.readyState==4){

				//判断响应状态码
				if(ajax.status==200){
					
					//获取响应数据
					var result=ajax.responseText;
					/*对于服务器返回的JSON字符串,需要将该字符串放于eval()中执行一次做对象化处理,
					这种方法适合以普通javascipt方式获取json对象  */
					eval("var user="+result);
					
					//处理响应数据
						//获取table表格对象
						var utable=document.getElementById("utable");
						//为了清空原来的表格数据,然后动态添加
						utable.innerHTML="";	
					
						//插入新的行(插入表格头,为了清空表格数据时仍然保留表格头信息)
						var tr=utable.insertRow(0);
						var cell0=tr.insertCell(0);
						cell0.innerHTML="编号";
						var cell1=tr.insertCell(1);
						cell1.innerHTML="名称";
						var cell2=tr.insertCell(2);
						cell2.innerHTML="价格";
						var cell3=tr.insertCell(3);
						cell3.innerHTML="位置";
						var cell4=tr.insertCell(4);
						cell4.innerHTML="描述";
					
					    //插入新的行					
						var tr=utable.insertRow(1);
						var cell0=tr.insertCell(0);
						cell0.innerHTML=user.uid;
						var cell1=tr.insertCell(1);
						cell1.innerHTML=user.uname;
						var cell2=tr.insertCell(2);
						cell2.innerHTML=user.price;
						var cell3=tr.insertCell(3);
						cell3.innerHTML=user.loc;
						var cell4=tr.insertCell(4);
						cell4.innerHTML=user.desc;
				}
			}
		}
		
		//发送请求
		ajax.open("get","user?name="+name);
		ajax.send(null);
	}
</script>
<style>

</style>
</head>
<body>
	<h3>欢迎来到一曦的英雄商店</h3>
	<hr>
	请输入英雄名称: <input type="text" name="uname"  value=""  id="uname">
	<input type="button" value="搜索" onclick="getData()">
	<br><hr>
	<table border="1px"  id="utable">

	</table>
	
</body>
</html>

2. UserServlet.java

package com.yixi.servlet;

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;

import com.google.gson.Gson;
import com.yixi.entity.User;
import com.yixi.service.UserService;
import com.yixi.serviceImpl.UserServiceImpl;

@WebServlet("/user")
public class UserServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设置请求编码格式
		req.setCharacterEncoding("utf-8");
		
		//设置响应编码格式
		resp.setCharacterEncoding("utf-8");
           /*
            * 用xml响应数据时,设置传送内容为"text/xml",以utf-8的格式打开
            * resp.setContentType("text/xml;character=utf-8");
            * 用json或者纯字符串格式响应数据时,设置传送内容为"text/xml",以utf-8的格式打开
            * resp.setContentType("text/html;character=utf-8");
           */
		resp.setContentType("text/xml;character=utf-8");
		
		//获取请求信息
		String name=req.getParameter("name");
		System.out.println("用户请求信息为:"+name);
		
		//处理请求信息
			//获取业务层对象
			UserService us=new UserServiceImpl();
			//处理业务
			User user=us.getUserInfoService(name);
			System.out.println(user);
			
		//响应处理结果
			/**
			 * 响应方式1:json格式(将java对象转换为json格式输出)
			 * resp.getWriter().write(new Gson().toJson(user));
			 *   new Gson().toJson(user)输出结果如下:
			 *   {"uid":1,"uname":"德邦","price":13.33,"loc":"打野","desc":"德邦很厉害"}
			 */

			resp.getWriter().write("<user><uid>1</uid><name></name><price></price><</user>");

		
		
	}
}

三、封装后代码记录

1. ajaxUtil.js(封装 ajax 代码的 js 文件)


/*	function deal200(a){
		//①获取响应内容
		var result=a.responseText;
		//②获取元素对象
		var showDiv=document.getElementById("show-div");
		showDiv.innerHTML=result;
	}
	function deal404(){
		var showDiv=document.getElementById("show-div");
		showDiv.innerHTML="请求资源不存在";
	}
	function deal500(){
		var showDiv=document.getElementById("show-div");
		showDiv.innerHTML="服务器繁忙";
	}
	function dealWait(){
		 当响应结果还没有过来时,使用动态图片刷新界面来显示	 			
		var showDiv=document.getElementById("show-div");
		showDiv.innerHTML="<img  src='img/refresh.gif' />";	
	}*/


	//获取后台数据(deal200是js函数,但是js函数可以直接作为参数传递执行,并且在js中,参数可以不完全赋值)
	/**
	*method:请求方式,值为get或者post
	*url:请求地址
	*data:没有值需要传入null,有请求数据要传入字符串数据,格式为a=1&b=2;
	*deal200:接收一个带有形参的js函数对象;形参接收的对象是ajax引擎对象;
	*deal404:接收一个js函数对象;
	*deal500:接收一个js函数对象;
	*async:接收一个bool对象,true为异步执行,false为同步。
	*/
	//此处deal200只是声明形参,并不是调用
	function myAjax(method,url,data,deal200,deal404,deal500,async){
		//创建ajax引擎对象,调用js函数getAjax();
		var ajax=getAjax();	
		
		//复写onreadystatechange函数
		ajax.onreadystatechange=function(){
			
			//2.1.判断ajax状态码
			if(ajax.readyState==4){
				
				//2.1.1.判断响应状态码
				if(ajax.status==200){
					if(deal200){
						deal200(ajax);
					}

				}else if(ajax.status==404){
					if(deal404){
						deal404();
					}
				}else if(ajax.status==500){
					if(deal500){
						deal500();
					}
				}	
			}else{
				if(dealWait){
					dealWait();			
				}
			}
		}
		
		//发送请求
		if("get"==method){
			//url+data==null?"":"?"+data  ****如果data不为空,再传递参数
			ajax.open("get",url+(data==null?"":"?"+data),async);
			ajax.send(null);
		}else if("post"==method){
			ajax.open("post",url,async);
			ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			ajax.send(data);
		}
	}

	

	
	//****通过函数获取ajax对象****
	function getAjax(){
		//创建ajax引擎对象
		var ajax;
		if(window.XMLHttpRequest){
			ajax=new XMLHttpRequest();
		}else if(window.ActiveXObject){
			ajax=new ActiveXObject("Msxml2.XMLHTTP");
		}
		return ajax;
	}
	

2. secondEncapsulation.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax first</title>
<script ype="text/javascript" src="js/ajaxUtil.js"></script>
<script type="text/javascript">
	function getData(){
		var name=document.getElementById("uname").value;
		var data="name="+name;
		//function(ajax){}是给形参deal200传参
		myAjax("get","user",data,function(ajax){
			
			//获取响应数据
			var result=ajax.responseText;
			//处理响应数据
			alert(result);
			
		});
	}
</script>
<style>
	#show-div{
		border:1px solid;
		width:200px;
		height:100px;
	}
</style>
</head>
<body>
	<h3>欢迎来到一曦的英雄商店</h3>
	<hr>
	请输入英雄名称: <input type="text" name="uname"  value=""  id="uname">
	<input type="button" value="搜索" onclick="getData()">
	<br><hr>
	<table border="1px"  id="utable">

	</table>
	
</body>
</html>

3. UserServlet.java代码不变

猜你喜欢

转载自blog.csdn.net/qq_38986609/article/details/82914860
今日推荐