《JavaBean与html通过XMLHTTP交互及XMLDOM解析XML(二)》-王伟东的个人Blog|你好Blog
你好Blog-王伟东的个人Blog

王伟东的个人Blog
学无止境,贵在有恒。常学常新,与时俱进。 

05-1-14

JavaBean与html通过XMLHTTP交互及XMLDOM解析XML(二)   (Java学习)

王伟东 发表于:05-01-14 21:37

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>

 

版权声明:如本文牵涉版权问题,"你好Blog"不承担相关责任,请版权拥有者直接与文章作者联系解决。谢谢!
引用通告地址(TrackBack Ping Url)
复制引用地址 http://www.nihaoblog.com/trackback.action?itemId=643
复制引用地址 http://www.nihaoblog.com/trackback.action?itemId=643

评论1

发表来自:ardy
发表时间:05-10-20 21:07
电子邮件:kuailedabao@126.com
评论内容:
我在用xmlhtttp + xmldom方式解析XML时,碰到了无法显示汉字的问题:
使用xmlhtttp接收一个XML文件后,用:
xmlDoc.loadXML(xmlhttp.responseText);
解析时,无法显示汉字,如果用:
xmlDoc.loadXML(XML文件);
解析时,就可以显示汉字。XML文件里有加:encoding="GB2312",请问这是什么原因导致的,有什么解决的方法吗?
另外请问xmlhtttp的:responseText 、responseXML、responseBody、responseStream的区别是什么呢?
谢谢。

评论2

发表来自:jelly
发表时间:05-09-26 15:05
电子邮件:jelly1982@gmail.com
评论内容:
hoho, 区别应该是可以交互,和判断状态了?     

评论3

发表来自:伟东
发表时间:05-09-26 13:19
电子邮件:@
评论内容:
xmlhttp可以判读加载状态如:

function xmlhttpChange()
{
// if xmlhttp shows "loaded"
if (xmlhttp.readyState==4)
{
// if "OK"
if (xmlhttp.status==200)
{
// ...some code here...
}
else
{
alert("Problem retrieving XML data")
}
}
}

评论4

发表来自:伟东
发表时间:05-09-26 13:16
电子邮件:@
评论内容:
使用XMLHTTP对象通常是进行XML数据交换(其他格式的数据也行),这种交换类型的标准模式是客户端发送一个XML格式的文本字符串到服务端,然后服务端响应,通过XMLDOM对象解析

当然简单的传参直接用load("*.action?para1=¶2=")也可以
但更倾向用XMLHttp对象处理交互xmlhttp.Send("<xmlData></xmlData>");

评论5

发表来自:jelly
发表时间:05-09-26 12:20
电子邮件:jelly1982@gmail.com
评论内容:
不是啊, 是有交互的, 我每次load的时候是load一个action,
这样是有交互的, 每次由action动态生成xml

评论6

发表来自:伟东
发表时间:05-09-26 09:56
电子邮件:@
评论内容:
xmlhttp是跟服务器端进行交互的,响应的结果通常以一个动态的xml返回。
如果没有交互动作,即访问一个固定的xml那么就用xmldom直接load一个xml就好了

评论7

发表来自:jelly
发表时间:05-09-26 09:00
电子邮件:jelly1982@gmail.com
评论内容:
我想问, 你用xmlhttp和xmldom来解决这样的问题,和用xmldom直接load一个xml或有什么区别么? 这样不是多出一个步骤?

评论8

发表来自:java
发表时间:05-01-16 00:15
电子邮件:@
评论内容:
学习中,非常有用!!!
*评 论 人 记忆
*电子邮件 公开Email
*评论内容
(少于256字)
新发的评论置于第1页 评论1