Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据


Posted in Javascript onAugust 09, 2009
/**//// <summary> 
/// 生成带CDATA的节点 
/// </summary> 
/// <param name="xDocument">XmlDocument</param> 
/// <param name="elementName">元素名称</param> 
/// <param name="cdataValue">CDATA值</param> 
/// <returns>XmlElement</returns> 
public static XmlElement CreateXmlNodeCDATA(XmlDocument xDocument, string elementName, string cdataValue) 
{ 
try 
{ 
XmlElement xElement = xDocument.CreateElement(elementName); 
XmlCDataSection cdata = xDocument.CreateCDataSection(cdataValue); 
xElement.AppendChild(cdata); 
return xElement;//返回 
} 
catch (Exception ex) 
{ 
throw ex; 
} 
} 
Helper#region Helper 
/**//// <summary> 
/// 创建Ajax返回信息 
/// </summary> 
/// <param name="result"></param> 
private void CreateResponse(string result) 
{ 
XmlDocument xDocument = new XmlDocument(); 
XmlDeclaration declare = xDocument.CreateXmlDeclaration("1.0", "UTF-8", "yes"); 
XmlElement root = xDocument.CreateElement("root"); 
XmlElement eleResponse = CreateXmlNodeCDATA(xDocument, "response", result); 
root.AppendChild(eleResponse); 
xDocument.AppendChild(declare); 
xDocument.AppendChild(root); 
ResponseXML(xDocument); 
System.Web.HttpContext.Current.Response.End(); 
} 
/**//// <summary> 
/// 向页面输出xml内容 
/// </summary> 
/// <param name="xmlnode">xml内容</param> 
private void ResponseXML(XmlDocument xmlNode) 
{ 
System.Web.HttpContext.Current.Response.Expires = 0; 
System.Web.HttpContext.Current.Response.Clear(); 
System.Web.HttpContext.Current.Response.Cache.SetNoStore(); 
System.Web.HttpContext.Current.Response.ContentType = "text/xml"; 
System.Web.HttpContext.Current.Response.Write(xmlNode.OuterXml); 
System.Web.HttpContext.Current.Response.End(); 
} 
/**//// <summary> 
/// 生成带CDATA的节点 
/// </summary> 
/// <param name="xDocument">XmlDocument</param> 
/// <param name="elementName">元素名称</param> 
/// <param name="cdataValue">CDATA值</param> 
/// <returns>XmlElement</returns> 
public static XmlElement CreateXmlNodeCDATA(XmlDocument xDocument, string elementName, string cdataValue) 
{ 
try 
{ 
XmlElement xElement = xDocument.CreateElement(elementName); 
XmlCDataSection cdata = xDocument.CreateCDataSection(cdataValue); 
xElement.AppendChild(cdata); 
return xElement;//返回 
} 
catch (Exception ex) 
{ 
throw ex; 
} 
} 
Helper#region Helper 
/**//// <summary> 
/// 创建Ajax返回信息 
/// </summary> 
/// <param name="result"></param> 
private void CreateResponse(string result) 
{ 
XmlDocument xDocument = new XmlDocument(); 
XmlDeclaration declare = xDocument.CreateXmlDeclaration("1.0", "UTF-8", "yes"); 
XmlElement root = xDocument.CreateElement("root"); 
XmlElement eleResponse = CreateXmlNodeCDATA(xDocument, "response", result); 
root.AppendChild(eleResponse); 
xDocument.AppendChild(declare); 
xDocument.AppendChild(root); 
ResponseXML(xDocument); 
System.Web.HttpContext.Current.Response.End(); 
} 
/**//// <summary> 
/// 向页面输出xml内容 
/// </summary> 
/// <param name="xmlnode">xml内容</param> 
private void ResponseXML(XmlDocument xmlNode) 
{ 
System.Web.HttpContext.Current.Response.Expires = 0; 
System.Web.HttpContext.Current.Response.Clear(); 
System.Web.HttpContext.Current.Response.Cache.SetNoStore(); 
System.Web.HttpContext.Current.Response.ContentType = "text/xml"; 
System.Web.HttpContext.Current.Response.Write(xmlNode.OuterXml); 
System.Web.HttpContext.Current.Response.End(); 
}

关于Ajax的话题网上已经很多很多了,但好多都是利用控件开源框架来实现,特别是vs2008更是集成了好多ajax控件,把ajax的执行过程封装的严严实实。本人也用过这些框架和控件,感觉就是爽。但是近来心血来潮,想看看ajax到底是如何执行的,就想自己动手实现一下,正好也锻炼一下我的js水平。废话少说,如题,我们看一下执行过程。
1.这次实现总共用了两个页面:AjaxTest6.aspx和Ajax.aspx

其中AjaxTest6.aspx是发起请求的页面,Ajax.aspx获取AjaxTest6.aspx的请求,并进行处理的页面。

处理过程:(1)AjaxTest6.aspx发起http请求--->(2)Ajax.aspx获取url中的参数,根据此参数在数据库中执行查询操作并返回结果(数据集) --->(3)把返回的数据集进行xml处理通过response输出。注意现在输出数据的格式是xml ---(4)AjaxTest6.aspx获得Ajax.aspx输出xml数据并显示
2.AjaxTest6.aspx中的js代码

< script language="javascript" type="text/javascript"><!-- 
var xmlhttp; 
function createXMLHttpRequest() //为xmlhttp创建实例 
{ 
if(window.ActiveXObject) 
xmlhttp=new ActiveXObject('Microsoft.XMLHttp'); 
else if(window.XMLHttpRequest) 
{ 
xmlhttp=new XMLHttpRequest(); 
} 
} 
function stateRequest(vr1)//状态请求 
{ 
//alert('看来已经执行了stateRequest了'); 
createXMLHttpRequest();//引用xmlhttp实例 
xmlhttp.onreadystatechange=handleStateChange;//在请求状态发生改变时调用此方法 
xmlhttp.open("GET","Tools/Ajax.aspx?cateid="+vr1,true); 
xmlhttp.send(null); 
} 
function handleStateChange() 
{ 
//alert("看来已经执行了handleStateChange()了"); 
var divRet=document.getElementById("ret"); 
if(xmlhttp.readyState == 4) 
{ 
if(xmlhttp.status == 200) 
{ 
var text= GetText(); 
divRet.innerHTML=text; 
} 
} 
else 
divRet.innerHTML="<img src="\" src="\""images/loading.gif\" alt=\"数据加载中\" /><b>数据加载中</b>"; 
} 
function GetText() 
{ 
var xmlDoc=xmlhttp.responseXML; 
//alert(xmlDoc.toString()); 
if(xmlDoc == null) 
{ 
//alert("执行到这里了吗"); 
return "暂无数据!"; 
} 
var requestNode=xmlDoc.getElementsByTagName("response")[0]; 
var node=requestNode.firstChild.nodeValue; 
//alert(node); 
return node 
} 
// --></ script> 
< script language="javascript" type="text/javascript"><!-- 
var xmlhttp; 
function createXMLHttpRequest() //为xmlhttp创建实例 
{ 
if(window.ActiveXObject) 
xmlhttp=new ActiveXObject('Microsoft.XMLHttp'); 
else if(window.XMLHttpRequest) 
{ 
xmlhttp=new XMLHttpRequest(); 
} 
} 
function stateRequest(vr1)//状态请求 
{ 
//alert('看来已经执行了stateRequest了'); 
createXMLHttpRequest();//引用xmlhttp实例 
xmlhttp.onreadystatechange=handleStateChange;//在请求状态发生改变时调用此方法 
xmlhttp.open("GET","Tools/Ajax.aspx?cateid="+vr1,true); 
xmlhttp.send(null); 
} 
function handleStateChange() 
{ 
//alert("看来已经执行了handleStateChange()了"); 
var divRet=document.getElementById("ret"); 
if(xmlhttp.readyState == 4) 
{ 
if(xmlhttp.status == 200) 
{ 
var text= GetText(); 
divRet.innerHTML=text; 
} 
} 
else 
divRet.innerHTML="<img src="\" src="\""images/loading.gif\" alt=\"数据加载中\" /><b>数据加载中</b>"; 
} 
function GetText() 
{ 
var xmlDoc=xmlhttp.responseXML; 
//alert(xmlDoc.toString()); 
if(xmlDoc == null) 
{ 
//alert("执行到这里了吗"); 
return "暂无数据!"; 
} 
var requestNode=xmlDoc.getElementsByTagName("response")[0]; 
var node=requestNode.firstChild.nodeValue; 
//alert(node); 
return node 
} 
// --></ script>

说明:第一个函数createXMLHttpRequest用来创建XMLHttpRequest对象,关于该对象的详细 说明可以参考相关文章,现在只要明白当我们使用http请求发送数据,并使用xml来传递数据时要用到该对象,声明好后我们就可以在下面使用了
第二个函数是 用来发送http请求,一般情况下url都带有参数,通过 xmlhttp.open("GET","Tools/Ajax.aspx?cateid="+vr1,true);这句话我们可以看出来是向Ajax.aspx发送带参数的请求,Ajax.aspx捕获此参数,然后根据此参数在数据库中执行查询,具体处理过程我们下面细说。
在这个函数中我们还要注意一句话view plaincopy to clipboardprint?
xmlhttp.onreadystatechange=handleStateChange;//在请求状态发生改变时调用此方法
xmlhttp.onreadystatechange=handleStateChange;//在请求状态发生改变时调用此方法
因为xmlhttp对象在执行的过程中要分为几个阶段,每个阶段都对应不同的状态值:0 表示初始化,1表示正在加载,,2表示已加载,3表示交互中,4表示完成
所以上面那段代码表示只要xmlhttp的对象的状态发生变化就执行 handleStateChange方法,它具体实现的功能如下:
这个方法首先找到显示数据的个div标签(ret),然后判断xmlhttp的执行状态,当状态值变成4并且xmlhttp.status==200 (status是服务器的http状态码 200对应OK 404对应Not Found,如果你对xmlhttprequest对象不是很熟,建议你先熟悉一下)
显然当xmlhttp.onready==4并且xmlhttp.stauts==200说明已经在服务器端把所有的数据读出来了,此时数据放在一个xml文件中,这个xml文件是我们在服务器端生成的。
程序执行到现在已经万事俱备了,现在只欠从浏览器中读取这个xml文件了。这时要注意,也就是下面我们要说的最后一个函数GetText()
这个函数首先告诉浏览器我们要读取是个xml对象(当然你也可以设置成字符串格式的,例如:var xmlDoc=xmlhttp.responseText);我们之所以把数据集设置成xml格式是因为此时它可以被解析为一个DOM对象,这样我们在下面对它的处理就相当灵活了。
到现在我们已经把客户端的代码说完了,下面说一下服务器端的执行过程,这个过程是在Ajax.aspx的后置代码中完成的
1.首先我们在Page_Load事件中获取url中的参数,该参数从AjaxTest6.aspx中发送。然后根据此参数执行查询,具体代码我就不再详细解释,大家一看就明白,代码如下:
private static readonly string sql = "server=xxx;database=xxx;uid=sa;pwd=xxx"; 
protected void Page_Load(object sender, EventArgs e) 
{ 
string id=Request.QueryString["cateid"]; 
System.Threading.Thread.Sleep(2000); 
GetTitle(Convert.ToInt32(id)); 
} private DataTable GetLogs(int cateid) 
{ 
using (SqlConnection con = new SqlConnection(sql)) 
{ 
con.Open(); 
string select = "SELECT Id,CateId,LogTitle FROM Logs WHERE CateId = " + cateid; 
SqlDataAdapter sda = new SqlDataAdapter(select, con); 
DataTable dt = new DataTable(); 
sda.Fill(dt); 
con.Close(); 
return dt; 
} 
} 
public void GetTitle(int id) 
{ 
DataTable dt = GetLogs(id); 
StringBuilder sb = new StringBuilder(); 
if (dt != null && dt.Rows.Count>0) 
{ 
for (int i = 0; i < dt.Rows.Count;i++ ) 
{ 
sb.AppendLine(dt.Rows[i][2].ToString()); 
} 
CreateResponse(sb.ToString()); 
} 
} 
private static readonly string sql = "server=xxx;database=xxx;uid=sa;pwd=xxx"; 
2 protected void Page_Load(object sender, EventArgs e) 
3 { 
4 string id=Request.QueryString["cateid"]; 
5 System.Threading.Thread.Sleep(2000); 
6 GetTitle(Convert.ToInt32(id)); 
7 } 
8 
9 private DataTable GetLogs(int cateid) 
{ 
using (SqlConnection con = new SqlConnection(sql)) 
{ 
con.Open(); 
string select = "SELECT Id,CateId,LogTitle FROM Logs WHERE CateId = " + cateid; 
SqlDataAdapter sda = new SqlDataAdapter(select, con); 
DataTable dt = new DataTable(); 
sda.Fill(dt); 
con.Close(); 
return dt; 
} 
} 
public void GetTitle(int id) 
{ 
DataTable dt = GetLogs(id); 
StringBuilder sb = new StringBuilder(); 
if (dt != null && dt.Rows.Count>0) 
{ 
for (int i = 0; i < dt.Rows.Count;i++ ) 
{ 
sb.AppendLine(dt.Rows[i][2].ToString()); 
} 
CreateResponse(sb.ToString()); 
} 
}

说明:通过GetTitle(int id)可以看出,我把从库里读出的数据转换成字符串交给CreateResponse方法(这里可能不太合适,因为当数据量大时可能不太安全),下面就是关于把数据转化成xml文件的操作
Javascript 相关文章推荐
保证JavaScript和Asp、Php等后端程序间传值编码统一
Apr 17 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
Apr 24 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
May 30 Javascript
js读取配置文件自写
Feb 11 Javascript
jQuery DOM插入节点操作指南
Mar 03 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
May 12 Javascript
浅谈Javascript数组(推荐)
May 17 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
Sep 04 Javascript
带你快速理解javascript中的事件模型
Aug 14 Javascript
vue 监听屏幕高度的实例
Sep 05 Javascript
通过实例解析jQ Ajax操作相关原理
Sep 23 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
Oct 29 Javascript
javascript 当前日期加(天、周、月、年)
Aug 09 #Javascript
jQuery 解析xml文件
Aug 09 #Javascript
ext 代码生成器
Aug 07 #Javascript
JavaScript 的方法重载效果
Aug 07 #Javascript
JQuery 小练习(实例代码)
Aug 07 #Javascript
js正确获取元素样式详解
Aug 07 #Javascript
JavaScript 乱码问题
Aug 06 #Javascript
You might like
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
php生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
url传递的参数值中包含&amp;时,url自动截断问题的解决方法
2016/08/02 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
RC4文件加密的python实现方法
2015/06/30 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
Python docx库用法示例分析
2019/02/16 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
庆元旦活动总结
2014/07/09 职场文书
敬老月活动总结
2014/08/28 职场文书
考研英语辞职信
2015/05/13 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
离职信范本
2015/06/23 职场文书