在Web頁面中執行Windows程序
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
[p]現在許多公司都面臨一個難題:如何在web環境中執行存在的windows應用程序。這里就介紹實現這個功能的技術,它爭取對代碼做最小的改變,完成在windows環境中應做的一切。 [/p]
[p][br]現存的windows應用程序[/p] [p] [/p] [p] 這里想要在web中執行的windows例子程序是非常簡單的,它是用vb編寫的,其中有一個表單。運行時,在表單上顯示雇員的信息,這些信息來源于access數據庫的一個表。表單上設有first、next、previous 和 last按鈕,從而允許用戶瀏覽記錄。同時,還可以通過按鈕add、delete 和 update來改變數據。這個程序通過一個com類來與數據庫通信,它有下面的方法:[/p] [p]addemployee() 在表中添加一個記錄,保存新雇員的信息 [br]updateemployee() 更新一個記錄 [br]deleteemployee() 刪除一個記錄 [br]getemployees() 獲取一個雇員的信息 [/p] [p] [/p] [p]程序正常運行時,瀏覽器顯示如下:[/p] [p][br]開發web應用程序[/p] [p] 在傳統的web應用程序中,大多數的處理都是在服務器端完成的。這里,我們將嘗試在客戶端做一些處理,以減少服務器上的工作量。也就是,讓客戶端完成顯示信息的處理工作,并將商業規則和數據庫存取留給服務器端。這就象一個n層處理模型。[/p] [p] 當用戶需要訪問另一個不同的數據時,我們也不想從服務器上再調入整個web頁面,因此,需要找到一個web客戶端在后臺與web服務器交流信息的方法。這個例子中,我們使用了微軟公司的xmlhttp com對象組件,它是隨internet explorer 5.0而來的。當然,也可以編寫一個功能類似的java applet來克服這個局限。[/p] [p] [/p] [p]服務器端的代碼[/p] [p] 讓我們從研究vb應用程序的com類到web的每一個方法開始,這可以通過編寫asp頁面來調用com類中的每個方法實現(addemployee.asp, updateemployee.asp, deleteemployee.asp, getemployee.asp)。 明白了這些,就能夠在web中存取com類方法了。[/p] [p] asp頁面應該能夠接受與com類一樣的參數,這些頁面向原始的com類發送調用。這里主要的區別就是所有的輸出是以xml格式的。我們使用另外一個叫xmlconverter的com類,轉換方法的輸出為xml格式。xmlconverter的代碼包含在下載文件中,它有一個函數,能夠接受一個ado記錄集做為參數,并且轉換為一個xml文檔。實現這個目的的函數例子可以從internet上很容易地找到,比如:[/p] [p][url=http://vbxml.com/xml/guides/developers/ado_persist_xml.asp]http://vbxml.com/xml/guides/developers/ado_persist_xml.asp[/url][/p] [p] 我們也許曾經使用過ado記錄集的save函數,加上adpersistxml,來實現按照xml格式保存,但是在這里,為了簡單起見,我們仍使用編制的函數。[/p] [p]下面的代碼來自getemployees.asp,它執行getemployees方法,從而可以讓你清晰地看到這種技術:[/p] [p][/p] [p][br]然后,用同樣的方式來創建頁面addemplyee.asp、deleteemployee.asp和updateemployee.asp。[/p] [p]客戶端的代碼[/p] [p] 現在準備編寫客戶端代碼,首先,讓我們仔細看看vb應用程序在調用后如何顯示信息。在vb表單的on_load方法(參見下面的代碼)中,我們調用了com對象組件getemployees方法,這個方法返回一個附帶雇員信息的ado記錄集。ado記錄集的movefirst()、movenext()以及 movelast() 方法建立了記錄瀏覽的方法。[/p] [p]private sub form_load()[br]'create the employeemgr object[br]set objemplyeemgr = new clsemployeemgr[/p] [p]'obtain the employee records in a adodb.recordset[br]set rst = objemplyeemgr.getemployees[br]rst.movefirst[br]displaycurrentrecord[br]end sub[/p] [p][br] 在這種情況下,我們有一個asp頁面getemployees.asp,它給出了做為xml文檔的信息。所以我們將在web客戶端建立一個xmldom對象,并且調入由getemployees.asp提供的信息。在這個例子中,我們使用microsoft dom xml來解析。關于dom xml解析的完整文檔,請參考msdn有關文章,比如 xml dom objects。[/p] [p] 另一個較好的解決方法是使用純java/javascript,它同時可以在非internet explorer的瀏覽器上應用。這里,我們仍使用xmlhttp對象,它可以讓web客戶端建立一個到web服務器的http請求。關于對xml http的詳細描述,請參考msdn上的文檔。 [/p] [p]//create an xmldom on the web client machine[br]var xmldoc = new activexobject("microsoft.xmldom");[/p] [p]// node pointing at root node of the xml document[br]var noderoot;[/p] [p]// node to point at current record[br]var nodecurrentrecord;[/p] [p]// integer pointing at the current record number[br]var ncurrentindex = 0;[/p] [p][br]//create the microsoft xmlhttp object on the web client machine[br]//this would have to be present and registered on the client machine[br]//installing internet explorer 5.0 satisfies this requirement[br]var objhttprequest = new activexobject("microsoft.xmlhttp");[/p] [p]//open a http connection to the url in strurl[br]objhttprequest.open ("get", strurl, false, null, null);[/p] [p]//send the request[br]objhttprequest.send();[/p] [p]//obtain the response received to the xmlresponse variable[br]//this response would be the xml document returned by the web server[br]var xmlresponse = objhttprequest.responsetext[/p] [p]//since the response is an xml document we can load it to an xmldoc object[br]xmldoc.loadxml (xmlresponse);[/p] [p]//set noderoot to point at the root of the xml document[br]noderoot = xmldoc.documentelement;[/p] [p][br] 從上面我們了解了xml文檔的結構,現在可以仔細研究xml文檔對象了。我們將編寫一個客戶端的javascript函數 rstmovefirst(),它可以移動當前記錄指針到第1條,這與ado記錄集的movefirst方法類似:[/p] [p]function rstmovefirst() {[br]//error trap for empty record set[br]if (noderoot.childnodes.length; < 1) {[/p] [p]//if the root node does not have any child nodes then there are[br]//no "records"[br]return false;[br]} [br]ncurrentindex = 0;[/p] [p]//set the nodecurrentrecord to point at the 0th child of the [br]//xml document. the 0th child would be the first record.[br]// noderoot is the xml document? documentelement[br]nodecurrentrecord = noderoot.childnodes(ncurrentindex);[/p] [p]//return success[br]return true;[br]} [/p] [p][br] 同樣,我們可以編寫rstmovenext()和 rstmovelast()函數,通過編寫這些代碼,我們將能仔細地了解xml文檔元素。而且,再編寫一個類似于ado記錄集upadte方法的函數。[/p] [p] 現在我們在客戶機上創建了一個假冒的ado記錄集對象,因此就可以象在vb應用程序中一樣來處理這些“記錄集”。[/p] [p] 有了這些函數,剩下的就是編寫用戶界面,這就象在vb應用程序中一樣。比如,在vb應用程序中,“移動到第1條記錄”后面的代碼是:[/p] [p]private sub btnfirst_click()[br]if not (rst.eof and rst.bof) then[/p] [p]'move to the first record[br]rst.movefirst[/p] [p]'displaycurrentrecord is a function that display the current 'records information [br]displaycurrentrecord[/p] [p]end if[br]end sub[/p] [p][br]在web應用程序中,相應的代碼是:[/p] [p]function btnfirstclick() {[br]'move to the first record in the recordset[br]'note that our rstmovefirst returns true if[br]'it was successful and false if eof and bof [br]if (rstmovefirst()) {[br]'here displaycurrentrecord is client side javascript[br]'function that display the current records information on[br]'the the screen[br]displaycurrentrecord();[br]}[br]}[/p] [p] 當需要更新實際的數據庫時,就發送更新信息給updateemployee.asp,這個頁面將通過com對象的updateemployee方法來更新數據庫。上面描述的應用程序,輸出到web上,將顯示如下圖:[/p] [p][br]結論[/p] [p] 在web應用中,要建立適當的計劃來轉換ado記錄集為xml文檔。一旦定義明確了,象那樣標準的應用將很好實現。另外一個我們想研究的領域是客戶端記錄集的操縱函數(就是rst*函數)。我們可以編寫java applet來處理這些記錄集操縱函數,從而在客戶端建立了java記錄集對象。這種方法將是很面向對象的一種處理方法。[/p] [p]點擊此處下載本文相關資料:[br][url=http://asptoday.com/articles/images/20000602.zip]http://asptoday.com/articles/images/20000602.zip[/url][/p] 該文章在 2010/7/7 23:36:08 編輯過 |
關鍵字查詢
相關文章
正在查詢... |