首页 安全基础 网络安全 安全协议 病毒分析 防火墙 OS安全 无线安全 Web安全 PKI与PMI 入侵检测 经典案例
安全审计 设备安全 安全管理 安全标准 法律法规 隔离网闸 DB安全 XML安全 开源项目 资源下载 安全论坛 备份恢复
 当前位置:首页>>xml安全>>xml基础>>正文
在web页面中执行windows程序
文章出处:www.chinaasp.com     发布时间:2004-12-28   点击:0
 

    现在许多公司都面临一个难题:如何在web环境中执行存在的windows应用程序。这里就介绍实现这个功能的技术,它争取对代码做最小的改变,完成在windows环境中应做的一切。 

  现存的windows应用程序

  这里想要在web中执行的windows例子程序是非常简单的,它是用vb编写的,其中有一个表单。运行时,在表单上显示雇员的信息,这些信息来源于access数据库的一个表。表单上设有first、next、previous 和 last按钮,从而允许用户浏览记录。同时,还可以通过按钮add、delete 和 update来改变数据。

  这个程序通过一个com类来与数据库通信,它有下面的方法:

  addemployee() 在表中添加一个记录,保存新雇员的信息 
  updateemployee() 更新一个记录 
  deleteemployee() 删除一个记录 
  getemployees() 获取一个雇员的信息 

  程序正常运行时,浏览器显示如下:


  开发web应用程序

  在传统的web应用程序中,大多数的处理都是在服务器端完成的。这里,我们将尝试在客户端做一些处理,以减少服务器上的工作量。也就是,让客户端完成显示信息的处理工作,并将商业规则和数据库存取留给服务器端。这就象一个n层处理模型。

  当用户需要访问另一个不同的数据时,我们也不想从服务器上再调入整个web页面,因此,需要找到一个web客户端在后台与web服务器交流信息的方法。这个例子中,我们使用了微软公司的xmlhttp com对象组件,它是随internet explorer 5.0而来的。当然,也可以编写一个功能类似的java applet来克服这个局限。

  服务器端的代码

  让我们从研究vb应用程序的com类到web的每一个方法开始,这可以通过编写asp页面来调用com类中的每个方法实现
(addemployee.asp, updateemployee.asp, deleteemployee.asp, getemployee.asp)。 明白了这些,就能够在web中存取com类方法了。

  asp页面应该能够接受与com类一样的参数,这些页面向原始的com类发送调用。这里主要的区别就是所有的输出是以xml格式的。我们使用另外一个叫xmlconverter的com类,转换方法的输出为xml格式。xmlconverter的代码包含在下载文件中,它有一个函数,能够接受一个ado记录集做为参数,并且转换为一个xml文档。实现这个目的的函数例子可以从internet上很容易地找到,比如:
http://www.vbxml.com/xml/guides/developers/ado_persist_xml.asp

  我们也许曾经使用过ado记录集的save函数,加上adpersistxml,来实现按照xml格式保存,但是在这里,为了简单起见,我
们仍使用编制的函数。

  下面的代码来自getemployees.asp,它执行getemployees方法,从而可以让你清晰地看到这种技术:
  <script language=vbscript runat=server>
  'declare the above described xmlconverter
  dim objxmlconverter

  'create the xmlconverter object on the web server machine
  set objxmlconverter = server.createobject("xmlconverter.clsxmlconverter")

  'declare the above described employeemgr object
  dim objemployeemgr

  'create the employeemgr object on the web server machine
  set objemployeemgr = server.createobject("employeemgr.clsemployeemgr")

  'declare a string varaible
  dim strxml


  现在调用employees对象的employees()方法,它将返回一个ado记录集对象,我们将这个对象传递给xmlconverter对象的xmlrecordset()方法,xmlrecordset()负责将ado记录集转换为xml文档。最后,我们取回xml文档,并将它存入strxml字符串变量中:

  strxml = objxmlconverter.xmlrecordset(objemployeemgr.getemployees)

  'destroy the employeemgr object
  set objemployeemgr = nothing

  'destroy the xmlconverter object
  set objxmlconverter = nothing

  'write the xml document as the response
  response.write strxml
  </script>


  然后,用同样的方式来创建页面addemplyee.asp、deleteemployee.asp和updateemployee.asp。

  客户端的代码

  现在准备编写客户端代码,首先,让我们仔细看看vb应用程序在调用后如何显示信息。在vb表单的on_load方法(参见下面的代码)中,我们调用了com对象组件getemployees方法,这个方法返回一个附带雇员信息的ado记录集。ado记录集的movefirst()、movenext()以及 movelast() 方法建立了记录浏览的方法。

  private sub form_load()
  'create the employeemgr object
  set objemplyeemgr = new clsemployeemgr

  'obtain the employee records in a adodb.recordset
  set rst = objemplyeemgr.getemployees
  rst.movefirst
  displaycurrentrecord
  end sub


  在这种情况下,我们有一个asp页面getemployees.asp,它给出了做为xml文档的信息。所以我们将在web客户端建立一个xmldom对象,并且调入由getemployees.asp提供的信息。在这个例子中,我们使用microsoft dom xml来解析。关于dom xml解析的完整文档,请参考msdn有关文章,比如 xml dom objects。

  另一个较好的解决方法是使用纯java/javascript,它同时可以在非internet explorer的浏览器上应用。这里,我们仍使用xmlhttp对象,它可以让web客户端建立一个到web服务器的http请求。关于对xml http的详细描述,请参考msdn上的文档。 

  //create an xmldom on the web client machine
  var xmldoc = new activexobject("microsoft.xmldom");

  // node pointing at root node of the xml document
  var noderoot;

  // node to point at current record
  var nodecurrentrecord;

  // integer pointing at the current record number
  var ncurrentindex = 0;


  //create the microsoft xmlhttp object on the web client machine
  //this would have to be present and registered on the client machine
  //installing internet explorer 5.0 satisfies this requirement
  var objhttprequest = new activexobject("microsoft.xmlhttp");

  //open a http connection to the url in strurl
  objhttprequest.open ("get", strurl, false, null, null);

  //send the request
  objhttprequest.send();

  //obtain the response received to the xmlresponse variable
  //this response would be the xml document returned by the web server
  var xmlresponse = objhttprequest.responsetext

  //since the response is an xml document we can load it to an xmldoc object
  xmldoc.loadxml (xmlresponse);

  //set noderoot to point at the root of the xml document
  noderoot = xmldoc.documentelement;


  从上面我们了解了xml文档的结构,现在可以仔细研究xml文档对象了。我们将编写一个客户端的javascript函数rstmovefirst()它可以移动当前记录指针到第1条,这与ado记录集的movefirst方法类似:

  function rstmovefirst() {
  //error trap for empty record set
  if (noderoot.childnodes.length; < 1) {

  //if the root node does not have any child nodes then there are
  //no "records"
  return false;
  } 
  ncurrentindex = 0;

  //set the nodecurrentrecord to point at the 0th child of the 
  //xml document. the 0th child would be the first record.
  // noderoot is the xml document? documentelement
  nodecurrentrecord = noderoot.childnodes(ncurrentindex);

  //return success
  return true;
  } 


  同样,我们可以编写rstmovenext()和 rstmovelast()函数,通过编写这些代码,我们将能仔细地了解xml文档元素。而且,再编写一个类似于ado记录集upadte方法的函数。

  现在我们在客户机上创建了一个假冒的ado记录集对象,因此就可以象在vb应用程序中一样来处理这些“记录集”。

  有了这些函数,剩下的就是编写用户界面,这就象在vb应用程序中一样。比如,在vb应用程序中,“移动到第1条记录”后面的代码是:

  private sub btnfirst_click()
  if not (rst.eof and rst.bof) then

  'move to the first recordrst.movefirst
  'displaycurrentrecord is a function that display the current 'records information 

  displaycurrentrecord

  end if
  end sub


  在web应用程序中,相应的代码是:

  function btnfirstclick() {
  'move to the first record in the recordset
  'note that our rstmovefirst returns true if
  'it was successful and false if eof and bof 
  if (rstmovefirst()) {
  'here displaycurrentrecord is client side javascript
  'function that display the current records information on
  'the the screen
  displaycurrentrecord();
  }
  }

  当需要更新实际的数据库时,就发送更新信息给updateemployee.asp,这个页面将通过com对象的updateemployee方法来更
新数据库。上面描述的应用程序,输出到web上,将显示如下图:


  结论

  在web应用中,要建立适当的计划来转换ado记录集为xml文档。一旦定义明确了,象那样标准的应用将很好实现。另外一个我们想研究的领域是客户端记录集的操纵函数(就是rst*函数)。我们可以编写java applet来处理这些记录集操纵函数,从而在客户端建立了java记录集对象。这种方法将是很面向对象的一种处理方法。

  点击此处下载本文相关资料:
  http://www.asptoday.com/articles/images/20000602.zip 







作者:
[返回顶部↑]  [推荐好友] [查看评论]  
用户名: 新注册) 密码: 匿名评论 [查看评论]  发表评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 
↑文章搜索
  关键字:  
  范  围:  
  开始搜索  
※相关文章※
 

◎//dtd html 4.0 transitio
◎//dtd html 4.0 transitio
◎//dtd html 4.0 transitio
◎//dtd html 4.0 transitio
◎//dtd html 4.0 transitio


 
※热点文章※
  ·[.net]:在managed c++中处
·[.net] 在传统com程序中使
·[.net] 在传统com程序中使
·thinking xml用musicbrain
·asp.net+xml开发网络硬盘(
·[.net]:在managed c++中处
·c#来创建和读取xml文档
 

关于我们 | 征搞启示 | 版权信息 | 联系我们 | 友情链接

版权所有:中国信息安全组织 © 2003-2005 Power by DedeCms