亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

實戰ASP(7):使用ASP、VB和XML建立運行于互聯網上的應用程序(上)

2024-09-05 20:55:41
字體:
來源:轉載
供稿:網友
使用asp、vb和xml建立運行于互聯網上的應用程序(1)
     在個人電腦上使用單機版應用軟件的時代很快就要過去了,現在大部分的應用程序都開發出網絡版或大都需要共享網絡上豐富的數據資源。我們雖然寫了很長時間基于客戶端/服務器的應用程序,但是這些程序大部分只是運行在小型的局域網內部。然而,有很多客觀的原因要求我們要修改這些程序以使它們能夠運行在一個企業的內部網甚至是國際互聯網。

  是什么原因迫使我們做呢?首先,隨著一個企業的規模逐漸擴大,公司可能會跨地區甚至跨國經營,每個分公司的員工的數量也會逐年增多,這些在外地的員工肯定需要頻繁地訪問總公司的數據庫資源;其次,集中應用程序的數據資源,能夠使你更好的監控數據庫的訪問和使用情況。第三,你可以通過從一個集中的位置獲取全局應用程序設置,從而維護和更新它們,最終達到緩減應用程序更新的目的。第四,盡量從web服務器上訪問數據庫而不是從客戶端上訪問數據庫,這樣可以避免通過網絡傳送登錄信息和客戶密碼,從而避免安全隱患;而且,使用瀏覽器從后臺獲取數據,這樣能夠避免刷新整個頁面。

  這就要求我們創建一個運行于互聯網上的應用程序,而假如想創建一個運行在http協議上的vb程序,那么關鍵就是使用xml和xmlhttprequest對象。這個對象是microsoft xml分析器(msxml.dll)的一部分,xmlhttprequest對象可以讓你通過http向遠程服務器發送get和post請求,運行在遠程服務器上的程序接收這個請求,翻譯出它的內容,返回數據或者一個錯誤頁面到調用它的應用程序。對網絡編程有一些研究的朋友會看出我這個設想很象soap,但是在這里我不想使用soap,因為如果那樣的話會使程序變得很復雜。

  想要改變一個完全獨立的客戶端單機版程序是不太現實的,但即使如此,從一個集中的服務器上下載應用程序設置也比使用本地的ini文件或windows注冊標有更大的獨立性和靈活性。舉例來說,假設你有一支手機銷售隊伍,他們需要訪問集中化的信息來更有效的銷售手機,每天,總公司集中收集數據,然后用電子郵件的形式發送給銷售人員。然而,市場的壓力和迅速變化的銷售形式勢必使銷售人員要訪問最新的數據信息。但是,網絡管理員卻堅持拒絕讓在遠程客戶端的銷售人員訪問總公司數據庫服務器,因為他們不想通過公用的網絡發送用戶名和登錄密碼。因此勢必要使用一種新的技術代替基于客戶端/服務器的技術,不要著急,我想看完本文你就會解決這個問題的。

  讓我們先分析一下客戶端/服務器應用程序。在一個標準的客戶端/服務器應用程序中,在應用程序開始時,你能夠初始化數據庫連接字符串,這就意味著,客戶有使用數據庫連接字符串的權利,這包括用戶名和口令。但是客觀情況如果不允許你在網絡上發送這些信息的話,你就必需在不聯接數據庫的情況下直接從客戶端取得數據發送給客戶。那么解決方案之一就是在服務器上創建一個asp頁(在本例中稱為getdata.asp)接收特定格式的post數據,它要求一個包含xml字符串,用來創建ado對象并運行存儲過程或動態sql語句命令。如果信息有效的話,getdata.asp執行存儲過程,并返回一個xml格式的數據集、返回值列表或錯誤頁面信息的xml字符串。對于返回數據的命令,客戶端要么重新實例化要么返回值或使用xml dom(document object model文檔對象模型)格式的錯誤頁面。

  好,下面就讓我們來討論一下如何實現這個頁面吧!

  getdata.asp頁面首先使用一個domdocument對象來保存客戶端發送的數據:

  '創建domdocument對象
  set xml = server.createobject ("msxml2.domdocument")
  xml.async = false

  然后,它裝載post數據

  '裝載post數據
  xml.load request
  if xml.parseerror.errorcode <> 0 then
   call responseerror ("不能裝載xml信息。" & "description: " & xml.parseerror.reason & "<br>line: " & xml.parseerror.line)
  end if

  它能夠返回commandtext元素值和returndata或returnvalue元素值。下面我只給出返回commandtext元素值的代碼,其余代碼請參看我下面所附的源程序。

  set n = xml.selectsinglenode("command/commandtext")
  if n is nothing then
   call responseerror ("缺少 <sp_name> 參數。")
  else sp_name = n.text
  end if

  接著,應該讓頁面創建一個command對象,讀入所有<param>元素,并且為request中的每一個元素創建一個參數。最后,讓頁面打開一個連接使用存儲過程adexecutenorecords選項來執行request。

  set conn = server.createobject("adodb.connection")
  conn.mode=admodereadwrite
  conn.open application("connectionstring")
  set cm.activeconnection=conn
  ' 返回數據
  if not returnsdata then
    cm.execute
  else
   set r = server.createobject("adodb.recordset")
   r.cursorlocation = aduseclient
   r.open cm, ,adopenstatic, adlockreadonly
  end if

  如果能夠返回數據的話,那么returndata變量就為真值,并且把結果數據集返回到客戶端,仍然是一個xml文檔。

  if returnsdata then
   r.save response, adpersistxml
    if err.number <> 0 then
     call responseerror ("數據集發生存儲錯誤" & "在命令'" & commandtext & "': " &    err.description)
     response.end
    end if

  如果輸出參數返回值,那么這個頁面將返回一個包含這些值的xml字符串。文檔的根元素是一個<values>標記,每一個返回值都有其相應的子元素,如果發生任何錯誤,頁面都會格式化并返回一個包含錯誤信息的xml字符串:

  sub responseerror(sdescription)
   response.write "<response><data>錯誤: " & sdescription & "</data></response>"
   response.end
  end sub

  假設在我們前面所說的例子中,我們想在應用程序中顯示區域的左半邊顯示客戶的姓名列表,再在每個客戶姓名后面加上兩個鏈接:purchase history和recent purchase。當用戶點擊其中的一個鏈接,客戶程序就會運行一個存儲過程并在右邊區域顯示出結果。 為了顯示這個想法的靈活性,我想讓用于返回數據的三個操作單元執行不同的工作過程,它們都調用getdata.asp。首先,通過調用custorderhist來運行一個存儲過程,返回客戶的purchase history,它搜索northwind數據庫(為了方便起見我使用ms sql中自帶的數據庫)并返回一個數據集。用于返回recent purchase 的查詢語句運行一個叫recentpurchasebycustomerid的存儲過程,來接收輸入的customerid參數并通過productname參數返回最近顧客購買的商品名。定義其處理過程相應sql語句如下:

  create procedure recentpurchasebycustomerid @customerid nchar(5), @productname nchar(40) output as select @productname = (select top 1 productname from products inner join ([order details] inner join orders on orders.orderid=[order details].orderid) on products.productid = [order details].productid where orders.orderdate = (select max(orders.orderdate) from orders
where [email protected]) and [email protected]) go

  不管你的查詢語句中含有動態sql語句還是含有返回記錄集的存儲過程或是輸出一個返回值,其處理post消息的方法是一樣的:

  set xhttp = createobject ("msxml2.xmlhttp")
  xhttp.open "post", "http://localhost/myweb/ getdata.asp", false
  xhttp.send s

  好了,現在讓我們看一看如何發送和接收數據

  客戶端的xml信息是由一個<command>元素和一些子元素組成:<commandtext>元素包含了存儲過程的名稱,<returnsdata>元素告訴服務器,客戶端是否要求接收返回數據,<param>元素包含參數信息。如果不使用參數的話,那么最簡單的發送字符串查詢就象下面這樣:

 ?。糲ommand>
   <commandtext>

  存儲過程或動態sql語句

 ?。?commandtext>
  ?。紃eturnsvalues>true</returnsvalues>
 ?。?command>

  你可以為每一個參數使用一個<param>元素,來添加參數。每個<param>元素有五個子元素:name,type,direction,size和value。子元素的順序可以隨意調換,但是所有的元素都應當有不能缺少,我通常按照定義一個ado對象的值的順序來定義它們。舉例來說,custorderhist存儲過程需要一個customid參數,所以用來創建發送到getdata.asp的xml字符串的代碼為:

  dim s
   s = "<?xml version=""1.0

,歡迎訪問網頁設計愛好者web開發。|||""?>" & vbcrlf
   s = s & "<command><commandtext>"
   s = s & "custorderhist"
   s = s & "</commandtext>"
   s = s & "<returnsdata>" &true</returnsdata>"
   s = s & "<param>"
   s = s & "<name>customerid</name>"
   s = s & "<type><%=advarchar%></type>"
   s = s & "<direction>" & <%=adparaminput%></direction>"
   s = s & "<size>" & len(customerid)& "</size>"
   s = s & "<value>" & customerid &"</value>"
   s = s & "</param>"
   s = s & "</command>"

  注意,前面的代碼都是客戶端代碼,ado常量是不在客戶端定義的-這就是它們為什么使用<% %>標記圍起來的原因。服務器在發送響應之前使用正確的值取代它們。getdata.asp頁有一個response.contenttype,它的屬性為"text/xml",這樣,你就可以使用responsexml屬性來返回結果了。當請求返回紀錄,你就可以創建一個recordset對象并且使用xmlhttp來打開它:

  dim r
   set r = createobject("adodb.recordset")
   r.open xhttp.responsexml

  當查詢語句返回數據時,通過設置xmlhttprequest對象的responsexml屬性來創建一個domdocument:

  dim xml
   set xml = xhttp.responsexml

  輸出參數的xml字符串的每個返回值都包含一個元素,它們都是根元素<values>的直接子元素,例如:

 ?。?xml version=""1.0"" encoding=""gb2312""?>
  <values>
 ?。紁aramname>value</paramname>
  ?。紁aramname>value</paramname>
  </values>

  如果你的數據使用別的國家的文字,你可能需要把編碼屬性用相應的編碼替換,例如對于大部分歐洲語言,可以使用iso-8859-1

  客戶端頁面使用返回的數據來格式化一個html字符串用于顯示,如:

  document.all("details").innerhtml = <一些格式化的html字符串>

  前面我們已經介紹了使用asp和xml混合編程,那是因為asp頁面能夠很容易讓我們看清應用程序正在做什么,但是你如果你不想使用asp的話,你也可以使用任何你熟悉的技術去創建一個客戶端程序。下面,我提供了一段vb代碼,它的功能和asp頁面一樣,也可以顯示相同的數據,但是這個vb程序不會創建發送到服務器的xml字符串。它通過運行一個名叫initialize的存儲過程,從服務器取回xml字符串,來查詢clientcommands表的內容。

  clientcommands表包括兩個域:command_name域和command_xml域??蛻舳顺绦蛐枰齻€特定的command_name域:getcustomerlist,custorderhist和recentpurchasebycustomerid。每一個命令的command_xml域包括程序發送到getdata.asp頁面的xml字符串,這樣,就可以集中控制xml字符串了,就象存儲過程名字所表現的意思一樣,在發送xml字符串到getdata.asp之前,客戶端程序使用xml dom來設置存儲過程的參數值。我提供的代碼,包含了用于定義initialize過程和用于創建clientcommands表的sql語句。

  我提供的例程中還說明了如何使用xhttprequest對象實現我在本文一開始時許下的承諾:任何遠程的機器上的應用程序都可以訪問getdata.asp;當然,你也可以通過設置iis和ntfs權限來限制訪問asp頁面;你可以在服務器上而不是客戶機上存儲全局應用程序設置;你可以避免通過網絡發送數據庫用戶名和密碼所帶來的隱患性。還有,在ie中,應用程序可以只顯示需要的數據而不用刷新整個頁面。



收集最實用的網頁特效代碼!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕网址| 国产91在线高潮白浆在线观看| 欧美在线视频观看免费网站| 亚洲第一黄色网| 日韩黄色在线免费观看| 色综合久久精品亚洲国产| 色黄久久久久久| 欧美中在线观看| 亚洲欧洲高清在线| 国产丝袜一区二区三区免费视频| 91精品久久久久久久久久另类| 午夜精品一区二区三区在线播放| 久久精品人人爽| 韩国v欧美v日本v亚洲| 亚洲国产欧美在线成人app| 久久精品国产一区二区电影| 成人激情视频网| 国产精品扒开腿做爽爽爽的视频| 国产精品高潮视频| 国产精品美女午夜av| 91系列在线播放| 欧美一级成年大片在线观看| 日韩精品中文字幕在线观看| 日韩在线视频二区| 亚洲激情国产精品| 最近2019中文字幕大全第二页| 亚洲精品av在线| 亚洲一区二区三区777| 亚洲尤物视频网| 亚洲欧美中文日韩在线| 欧美一区三区三区高中清蜜桃| 亚洲精品按摩视频| www.欧美精品一二三区| 欧美激情国内偷拍| 久久九九热免费视频| 色综合久久88| 亚洲第一网站男人都懂| 欧美国产日韩一区二区三区| 久久久97精品| 亚洲欧美精品一区| 久久久国产91| 久久精品美女视频网站| 日韩av综合网站| 亚洲日韩第一页| 日本一区二区在线播放| 国产精品日本精品| 国产一区欧美二区三区| 精品国产一区二区三区久久久| 欧美一级大胆视频| 国产成人一区二区三区| 日韩精品小视频| 亚洲美女久久久| 精品国产成人在线| 成年无码av片在线| 国产偷国产偷亚洲清高网站| 成人在线视频网站| 日韩av一区二区在线| 欧美第一淫aaasss性| 欧美国产日韩在线| 成人在线中文字幕| 久久国产精品亚洲| 日韩在线观看免费高清| 91精品久久久久久综合乱菊| 亚洲国产精久久久久久| 亚洲综合大片69999| 91高清在线免费观看| 亚洲欧美成人在线| 国产一区二区三区精品久久久| 欧美亚洲视频一区二区| 国产丝袜视频一区| 一二美女精品欧洲| 日韩欧美国产免费播放| 国产精品免费小视频| 久久久女女女女999久久| 亚洲品质视频自拍网| 国产日韩在线看| 欧美性一区二区三区| 国内精品久久久久影院优| 国产精品欧美日韩一区二区| 川上优av一区二区线观看| 久久视频在线看| 91av视频在线播放| 在线观看国产成人av片| 久久99热精品这里久久精品| 亚洲影视中文字幕| 揄拍成人国产精品视频| 国产大片精品免费永久看nba| 欧美高清理论片| 精品国产网站地址| 亚洲激情第一页| www.亚洲一区| 伊是香蕉大人久久| 中文字幕精品av| 亚洲女同性videos| 日韩视频在线免费观看| 欧美在线中文字幕| 亚洲人成电影网站色| 韩国美女主播一区| 日韩精品999| 狠狠色狠色综合曰曰| 国产精品爽黄69| 国产精品免费看久久久香蕉| 欧美性xxxx| 在线观看日韩专区| 日韩视频免费在线| 91精品在线看| 97精品免费视频| 欧美一级淫片播放口| 日韩免费黄色av| 欧美日韩中国免费专区在线看| www.欧美精品一二三区| 亚洲2020天天堂在线观看| 国产精品爱久久久久久久| 日本高清+成人网在线观看| 欧美性生交xxxxx久久久| 亚洲精品国产免费| 自拍偷拍亚洲一区| 久久国产精品影片| 国产剧情日韩欧美| 亚洲人午夜色婷婷| 成人黄色影片在线| 九九久久国产精品| 色阁综合伊人av| 国产精品视频中文字幕91| 久久免费观看视频| 国产精品揄拍一区二区| 日韩中文在线中文网三级| 日韩中文视频免费在线观看| 国产成人一区二区三区电影| 狠狠躁天天躁日日躁欧美| 91久久精品国产| 4k岛国日韩精品**专区| 青青草成人在线| 亚洲精品一区二区在线| 亚洲伊人成综合成人网| 成人妇女免费播放久久久| 亚洲午夜精品视频| 亚洲一级黄色av| 国产精品吹潮在线观看| 亚洲国产精品一区二区三区| 久久五月天色综合| 97avcom| 欧美电影免费在线观看| 国产精品丝袜白浆摸在线| 国产精品久久久久久影视| 国产精品人成电影在线观看| 国产乱肥老妇国产一区二| 日韩视频免费在线观看| 日韩精品极品在线观看播放免费视频| 成人在线播放av| 国产一区二区黄| 久久99精品视频一区97| 欧美韩日一区二区| 亚洲精品永久免费精品| 亚洲最大福利视频网| 欧洲成人在线视频| 亚洲免费精彩视频| 欧美精品电影免费在线观看| 国产日韩精品在线| 亚洲经典中文字幕| 亚洲人成人99网站| 国产精品影院在线观看| 欧美国产视频日韩| 97av在线影院|