JavaBean与html通过XMLHTTP交互及XMLDOM解析XML(二)
Java线程方式
王伟东
本文主要演示了前台页面如何不刷新实现与服务器交互。并实现了简单的基于IE的XMLHTTP、XMLDOM的基本用法。
TaskBean.java通过实现Runnable接口中的Run()函数循环调用workFinished(),workFinished()由sleep值控制循环时间,如下sleep初始化为1000;循环时间由timeOut变量决定。
startThread.jsp
启动服务器线程
test.html
每隔1秒种执行xmlRequest(),通过XMLHTTP向getxmlresult.jsp提交请求,由后台服务器返回交互数据,这里我们通过xml格式做为返回结果,请注意文件头部指定了ContentType及字符集,当xml内容中包含有中文时是必要的,否则xml报错即下面这句:response.setContentType("Text/XML;charset=GB2312");然后在前台通过XMLDOM对返回的xml内容进行解析,目前只解析timeOut是不是1,1代表超时,当超时时间到时后台服务器线程终止,前台通过alert提示Timout。
TaskBean.java
package javathread; public class TaskBean implements Runnable { private String readData; private boolean running; private int timeOut; private int sleep; public TaskBean() { running = false; sleep = 1000; } protected boolean workFinished() { try { if (!isRunning()) return true; if (timeOut-- <= 0) { readData = "<?xml version=\"1.0\" encoding=\"GB2312\"?><data><timeOut>1</timeOut></data>"; setRunning(false); return true; } Thread.sleep(sleep); doWork(); return false; } catch (InterruptedException e) { setRunning(false); return true; } }
//doWork可以根据实际改写
private void doWork() { readData = "<?xml version=\"1.0\" encoding=\"GB2312\"?><data><timeOut>0</timeOut></data>"; } public String getReadData() { return readData; } public synchronized boolean isRunning() { return running; } public void setTimeOut(int timeOut) { this.timeOut = timeOut; } public synchronized void setRunning(boolean running) { this.running = running; } public void run() { try { if (isRunning()) return; setRunning(true); while (!workFinished()) ; } finally { setRunning(false); } } }
startThread.jsp
<jsp:useBean id="task" scope="session" class="javathread.TaskBean"/>
<%
task.setRunning(false);
task.setTimeOut(30);
if(!task.isRunning())
new Thread(task).start();
%>
<jsp:forward page="test.html"/>
queryxmlresult.jsp
<% response.setContentType("Text/XML;charset=GB2312");%>
<jsp:useBean id="task" scope="session" class="javathread.TaskBean"/>
<% out.print(task.getReadData());%>
test.html
<HTML>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
</head><SCRIPT>
function xmlRequest()
{
try
{
var CSID="Microsoft.XMLHTTP";
var xmlhttp=new ActiveXObject(CSID);
xmlhttp.Open("POST","getxmlresult.jsp",false)
xmlhttp.Send("");
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.loadXML(xmlhttp.responseXML.xml) ;
//xmlDoc.documentElement.childNodes.length
if(xmlDoc.getElementsByTagName("timeOut")[0].text==1)
{
alert("TimeOut");
return;
}
setTimeout("xmlRequest();", 1000);
}
catch(er)
{
setTimeout("xmlRequest();", 1000);
}
}
setTimeout("xmlRequest();", 1000);
</SCRIPT>
</html>


06年热贴
