VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

Visual Foxpro與ASP相結合開發Web資料庫應用(轉貼)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 1 樓

發表發表於: 星期六 十一月 15, 2003 3:16 pm    文章主題: Visual Foxpro與ASP相結合開發Web資料庫應用(轉貼) 引言回覆

Visual Foxpro與ASP相結合開發Web資料庫應用       
                 ---- 重慶出版社電腦中心  陳 剛
  1. VFP與Web資料庫應用
  ----作為最成功的大眾資料庫,Foxpro簡便易學,有廣大的用戶。隨著VFP 5.0的推出,VFP已經成為一個強大的企業級開發工具。它不僅可以開發檔/伺服器(F/S)資料庫應用,也可以開發C/S應用,這時VFP作為一個前端工具,後端可以是SQL Server,Sybase等資料庫Engine。通過Remote View和SQL Passthrough函數,VFP可以像操作本地資料一樣,方便地處理伺服器端資料。 ----在Internet/ Intranet影響日益巨大的今天,開發Web資料庫應用成為引人關注的技術。Web資料庫應用有一個天然的多層C/S結構。在這個結構中,用戶端(Client)僅由Browser組成,幾乎沒有軟體維護和升級的問題。來自Client的請求發送到Web Server,我們只須開發Web Server端軟體,處理請求,與資料庫伺服器交互、並把結果返回Client,系統維護和升級非常方便。只要允許,任意一個客戶都可以通過Internet或Intranet訪問我們的資料。
  ---- VFP完全具備開發Web資料庫應用的能力。不過有意思的是,這次VFP被推到了後臺,在資料庫伺服器上專門處理資料存取和實現商業邏輯。資料庫伺服器和Web Server可以運行在同一個網路服務器上,或者運行在由高速通道連接的兩台網路服務器上(如NT Server),這樣網路傳輸瓶頸不再存在。並且借助NT Server的安全管理,客戶並不能直接接觸VFP資料庫,而是通過Web Server存取資料,VFP資料庫的安全特性得以大大提高,而此兩項一般認為是VFP的重要弱點。
   2. ASP(Active Server Page)與 VFP的組件技術
  ---- Web資料庫應用可以由CGI、ISAPI、IDC、ASP等實現。其中ASP的功能最為強大,在其中可以混用HTML、DHTML、ActiveX、VBSsript或JavaSript,特別是可以使用伺服器端元件。此伺服器端元件可以用VFP、VB、VC++、Delphi等任意支援COM技術的語言編寫,以實現用戶特定的商業邏輯。如果不出意外,ASP將成為主流技術。目前有Microsoft的IIS(Internet Information Server,NT Server)和PWS(Personel Web Server,Win95)支持ASP。
  ----在傳統的F/S或C/S應用中,元件作為面向物件的編程風格,你可以隨自己的喜好,採用或不採用它。然而在ASP中使用VFP,元件(一個OLE Server DLL)是你唯一的選擇。你的處理過程都應封裝在一個或多個元件中。
  3.使用的環境和工具
  ----對於ASP,需要WinNT 4.0(Service Pack 3)、IIS 3.0(WinNT自帶)、Visual InterDev1.0。也可以是:Win95、PWS(Visual InterDev1.0中提供)、Visual InterDev1.0。
  ----為了使IIS或 PWS支持ASP,在安裝Visual InterDev時必須首先在伺服器上選擇安裝其中的Server Components:FrontPage Server Extensions和 Active Server Pages,然後在開發伺服器上安裝Client Components:Visual InterDev Client。也可以把這些都安裝在同一台機器上,這樣可以在單機上方便地編程、調試。
  4. VFP組件的實現
  ----在VFP中開始一個Project,取名為Classes,然後在此Project中建立一個Program,取名Classdef.prg。它定義了一個OneRecord類,其功能是一條條顯示一個資料庫,具有向前、向後和定位能力。使用一個DBF檔d:\vfpweb\data\booksno.dbf,結構為:
Field_name Field_type Field_len
bookno C 16
bookname C 50
author C 12
editor C 14
pubdate D 8
charnum N 4.0
   在Classdef.prg中鍵入代碼:
Define class onerecord as custom olepublic
mcDatapath=""
*---------------------------
function getdatapath
return (this.mcdatapath)
*---------------------------
function getcurrentno
return recno()
*---------------------------
function init
set exclu off
set century on
set date to ansi
return
*---------------------------
function setdatapath
lparameter cpath
if type("cpath")< >"C"
return
endif
this.mcdatapath=cpath
set defau to (cpath)
if not used("booksno")
select 0
use booksno
else
select booksno
endif
return
*--------------------------
function movenext
if .not.eof()
skip
endif
return
*--------------------------
function moveprevious
if .not.bof()
skip -1
endif
return
*--------------------------
function destroy
use *clear all &&clear all將掛起伺服器
return
*--------------------------
function iseof
if eof()
return .t.
else
return .f.
endif
*--------------------------
function isbof
if bof()
return .t.
else
return .f.
endif
*--------------------------
function getbookno
return bookno
*--------------------------
function getpubdate
if empty(pubdate)
return ""
else
return pubdate
endif
*--------------------------
function geteditor
return
editor
*--------------------------
function getbookname
return bookname
*--------------------------
function goto
lparameter recnum
if type("recnum")< >"N" &&error data type
return
endif
if recnum< 1 .or. recnum >reccount()
return
else
goto
(recnum)
endif
return EndDefine
  ----在功能表Project,選中 Set Main,然後Build,在Build對話方塊中選Build OLE DLL。好了,我們到此就完成了一個OLE Server,並且它已經自動註冊在我們的機器上。我們可以在功能表Project | Project Info彈出的Project Information對話方塊中看到這個元件的資訊:
Server Classes:onerecord
Project Name:Classes OLE
  ---- Server的引用方法是createobject("ProjectName.ClassName"),對於我們這個元件,就是:createobject("classes.onerecord")。可以直接在VFP的Command視窗中互動式地測試之,在Command視窗中鍵入:
ox=createobject("classes.onerecord")
ox.setdatapath("d:\vfpweb\data")
?ox.bookname
?ox.getbookname
ox.movenext
?ox.getbookname
ox.goto(30)
?ox.getbookname
  ----可以直接看到執行結果,最後不要忘了釋放該組件: release ox
  ----這個元件是針對特定資料庫進行操作的,測試很方便。
  下面,我們再實現一個更為一般的類ClsQ2T,其功能是任意指定一條SQL查詢語句(針對任意一個或多個資料庫),將查詢結果以表格的形式顯示在Web頁面上,其中使用了ASP的介面。它不僅封裝了資料處理,而且通過ASP介面,也封裝了資料顯示。
----仍在Classdef.prg之中,接著最後一行代碼,鍵入: ***************************************************
define class clsq2t as custom olepublic
mcontext=.null.
*-----------------------------------------
function onstartpage(ocontext)
this.mcontext=ocontext &&對ASP介面的引用
return
*-----------------------------------------
function init
set exclu off
set safety off
return
*---------------------------------------------
function setdatapath(strpath)
merrnum=0
on error merrnum=error( )
set default to (strpath)
if merrnum< >0
return "Error in setdatapath"+message()+chr(13)
endif
on error
return "OK,setdatapath"+strpath+chr(13)
*-------------------------------------------------
*函數querytotable要求傳入一個SQL Select串,如:
* "select bookname,editor from booksno where charnum >500"
* -------------------------------------------------
function querytotable(querystring)
merrnum=0
on error merrnum=error( )
oResp=this.mcontext.response &&引用ASP對象response
tempname=SUBSTR(SYS(2015), 3, 10) &&產生唯一的檔案名
&querystring into cursor (tempname)
if merrnum< >0
return "Error in querytotable,create sql view"+message()+alltrim(str(lineno( )))+chr(13)
endif
outstring="< table border=1 >"+chr(13)+"< tr >"+chr(13)
oresp.write(outstring)
if merrnum< >0
return "Error in querytotable,oresp.write"+message()+alltrim(str(lineno( )))+chr(13)
endif
outstring=""
fc=fcount()
for i=1 to fc
if type("eval(field(i))")="G"
loop
endif
outstring=outstring+"< td >"+field(i)+"< /td >"+chr(13)
next
outstring=outstring+"< /tr >"+chr(13)
oresp.write(outstring)
outstring=""
if merrnum< >0
return "error in oresp.write header"+message()+alltrim(str(lineno( )))+chr(13)
endif
scan
outstring=outstring+"< tr >"+chr(13)
for i=1 to fc
if type("eval(field(i))")="G"
loop
endif
mt=eval(field(i))
do case
case type("mt")="C"
outstring=outstring+"< td >"+mt+"< /td >"
case type("mt")="T"
outstring=outstring+"< td >"+ttoc(mt)+"< /td >"
case type("mt")="D"
outstring=outstring+"< td >"+dtoc(mt)+"< /td >"
case type("mt")$"NY"
outstring=outstring+"< td >"+alltrim(str(mt,5))+"< /td >"
endcase
outstrin=outstring+chr(13) next outstring=outstring+"< /tr >"+chr(13)
endscan
oresp.write(outstring)
outstring="< /table >"
oresp.write(outstring)
use on error
return "OK of querytotable, ended"+chr(13)
endfunc
EndDefine
----鍵入代碼後Build,在Build對話方塊中仍選Build OLE DLL,在確認覆蓋時選擇"Y",在Project Information對話方塊中看到這個元件的資訊已有變化:
Server Classes:onerecord
clsq2t Project Name:Classes
----加上了新增的clsq2t。
----這段代碼中較特別的是onstartpage(ocontext),它在每次.asp頁面啟動時由IIS自動調用,並傳入一個參數。該參數是對ASP的一個容器ScriptingContext的引用,通過它可以引用ASP的所有內在物件(Intrinsic Object),如response、reuqest。通過這些內在物件,VFP可以直接讀取用戶在Web頁面上的輸入,也可以把結果直接寫回Web頁面。
----組件clsq2t的調試要困難得多。可以在函數querytotable中注釋掉與oResp有關的行以及define class clsq2t as custom olepublic和 EndDefine兩行,然後增加一些代碼直接調用各個函數,以進行調試排錯。確認無誤後再恢復上述各行,並重新 Build。
5.在ASP中使用VFP元件
----下麵將建立兩個ASP頁面:Onerecord.asp和Clsq2t.asp測試我們完成的這兩個組件。啟動Visual InterDev,開始一個新的工程:New Projects,然後選取Web Project Wizard,在Project Name中輸入VFPClasses,點擊OK後,Visual InterDev產生一些輔助檔,為新的工程做好準備,然後打開該工程。
我們在該工程中首先建立一個HTML頁面index.htm,以調用上述兩個ASP頁面。點擊菜單File | New,在New對話方塊中選Files | HTML Page,並指定HTML頁面的名字:index.htm。Visual InterDev將會為我們產生一個空的框架,在其中用手工加入代碼,也可用Visual InterDev附帶的FrontPage Editor等視覺化工具編輯代碼,完成後的HTML頁面如下:
< HTML >
< HEAD >
< /HEAD >
< BODY >
< p >< a href="Onerecord.asp" >To scan the records< /a > < /p >
< p >To send a query:< br >
< form action="Clsq2t.asp" method="post" name="input" >
< input type="submit" name="Btoquery" value="Query" >
< input type="text" size="40" name="qstring" value="Input a query here" > < /p >
< /form >
< /BODY >
< /HTML >
---- index.htm中包括一個到Onerecord.asp的超聯接、一個Text用於輸入查詢語句、一個Submit Button用於提交查詢,點擊該Button後將調用Clsq2t.asp。
----點擊菜單File | New,在New對話方塊中選Files | Active Server Page,新建Onerecord.asp,它使用onerecord元件在Web頁面上流覽資料庫,代碼如下:
< %@ LANGUAGE="VBSCRIPT" % >
< html >
< HEAD >
< /HEAD >
< BODY >
< FORM ACTION="Onerecord.asp" METHOD="POST" ID="scanform" >
< %set ox=server.createobject("classes.onerecord") ox.setdatapath("d:\vfpweb\data")
if session("currentno")="" then
session("currentno")=1'first time open the page
currentno=1
else
if isnumeric(session("currentno")) then
currentno=session("currentno")
else currentno=1
end if
end if
ox.goto(currentno) % >
< %if request.form("cmdnext")< >"" then
ox.movenext end if% >
< %if request.form("cmdprev")< >"" then
ox.moveprevious end if% >
< %if isnumeric(request.form("txtgoto")) then
temp=cint(request.form("txtgoto"))
ox.goto(temp) end if% >
< %session("currentno")=ox.getcurrentno% >
< p > 當前記錄:< %=ox.getcurrentno% >< br > 書 號:< %=ox.getbookno% >
< br > 書 名:< %=ox.getbookname% >
< br > 責 編:< %=ox.geteditor% >
< br > 出版時間:< %=ox.getpubdate% >
< br > < /p >
< p > < %if not ox.iseof then'如果不是檔未則顯示按鈕Next% >
< INPUT TYPE=submit value="Next" NAME="cmdnext" >
< %end if% >
< %if not ox.isbof then'如果不是檔頭則顯示按鈕Prev% >
< INPUT TYPE=submit value="Prev" NAME="cmdprev" >
< %end if% > < %set ox=nothing% >
< INPUT LANGUAGE="VBScript" TYPE=submit value="Goto"
onCLICK="if not isnumeric(scanform.txtgoto.value) then
window.alert("Must input a number")
window.event.cancelbubble=true end if"
NAME="cmdgoto" >
< INPUT TYPE=text SIZE=20 NAME="txtgoto" >< /p >
< a href=index.htm > Return Index< /a >
< /FORM >
< /BODY >
< /HTML >
----該頁面顯示資料庫當前記錄各欄位的值,並在頁面下方顯示三個按鈕Next(下一條),Prev(上一條)和Goto。
其中使用了Server Side Code(符號< %和% >之間的代碼,在伺服器端執行),產生元件及對元件各方法和屬性的調用;Client Side Code(在用戶端執行),在onCLICK的事件回應中檢驗用戶輸入的記錄號(必須是一個數字)。
由於Web Browser基於的HTTP是一個無狀態協定,它並不知道各客戶的當前記錄。為了在各個頁面調用中記住當前記錄號,使用了session物件。
session物件在跟蹤和保持客戶的使用狀態上很有用處,感興趣者可以查閱Visual InterDev的聯機幫助。 ----再新建Clsq2t.asp,它使用使用clsq2t元件在Web頁面上顯示任意查尋結果,代碼如下:
< %@ LANGUAGE="VBSCRIPT" % >
< HTML >
< HEAD >
< /HEAD >
< BODY >
< %qs=request.form("qstring")% > 你輸入的查詢要求是:
< br >< %=qs% >< hr > < a href=index.htm > Return Index< /a >
< br > < %set ox=Server.CreateObject("classes.clsq2t")% >
< %ox.SetDataPath("d:\vfpweb\data")% > < %ox.QueryToTable(qs)% > < %Set ox = Nothing% >
< /BODY >
< /HTML >
----由於輸出操作都已封裝在元件clsq2t之中,故該元件的使用相當簡明。
應該指出的是,該元件應該用於開發之中,而不應提供給最終用戶,因為不能保證用戶輸入的SQL Select串的有效和合法。
6.調試注意事項
----此處兩個元件皆是進程內伺服器,當有Bug時將會使系統掛起甚至崩潰。
----當修改組件代碼時,你會發現無法覆蓋老的.dll文件。這是因為即使退出Visual InterDev,組件仍被Web Server鎖定(這就是為什麼VFP試圖用clear all釋放資源時會掛起伺服器)。這時必須停止Web Server並再啟動之,在開發過程中可能要如此反復多次。
如果系統被掛起或崩潰,Web Server無法回應,這時只有使出最後一招:關機並重新啟動。
VFP 5.0版本的Run Time Library只支援一個實例,就是說:如果上述兩個元件在兩個不同的prg檔中實現,則它們不能同時被使用。這一點在VFP6.0中已得到改進(但仍是單線程的)。
7.評述
---- Web資料庫開發更專業化的方法似乎是ASP+VB+ADO(ActiveX Data Object)+SQLServer。
其中ADO不僅可用于Web資料庫開發,也可用在VB、VFP中替代DAO、RDO開發傳統的C/S應用,功能更為強大。然而對於中小企業來說,VFP簡便易用,對資源要求不高,而且我國很多高校學生都學習過Foxbase或Foxpro,他們可以很快掌握Visual Foxpro,故可以比較容易地找到編程和系統維護人才。
VFP用於開發Internet/Intranet是一個較好的選擇,國外已有許多大型應用的成功範例。

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作