复制代码 代码如下:
/**////
/// 生成带cdata的节点
///
/// xmldocument
/// 元素名称
/// cdata值
/// xmlelement
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
/**////
/// 创建ajax返回信息
///
///
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();
}
/**////
/// 向页面输出xml内容
///
/// xml内容
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();
}
/**////
/// 生成带cdata的节点
///
/// xmldocument
/// 元素名称
/// cdata值
/// xmlelement
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
/**////
/// 创建ajax返回信息
///
///
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();
}
/**////
/// 向页面输出xml内容
///
/// xml内容
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>
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 {
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 {
sb.appendline(dt.rows[i][2].tostring());
}
createresponse(sb.tostring());
}
}
说明:通过gettitle(int id)可以看出,我把从库里读出的数据转换成字符串交给createresponse方法(这里可能不太合适,因为当数据量大时可能不太安全),下面就是关于把数据转化成xml文件的操作