VFPCGI Day5
出自VFP Wiki
VFPCGI Day5
的原始碼
跳轉到:
導航
,
搜尋
根據以下的原因,您並無權限去做編輯這個頁面:
你所請求執行的操作被禁止。
你可以檢視並複製本頁面的原始碼。
[[Category:VFPCGI]] =====VFPCGI的第五天===== 第五天~ 接著,我們就把 WriteFile 包裝一下吧,讓她可以像 ASP 的 Response 一樣這麼用~ <pre> * * CGI03.prg * SET PROCEDURE TO cgilib LOCAL oResponse oResponse = CREATEOBJECT( "RESPONSE" ) oResponse.Write( "<p>Hello world!</p>") </pre> 所以,Response 類別就如下面,這邊利用了 VFP 的 cursor 來當作 cache,所有的 Write,實際上都是先塞到 cursor 裡面去,等到最後被釋放或是呼叫 Flush 的時候,才利用 scan...endscan 一次把所有資料寫出去。 <pre> * * CGILIB.prg * DEFINE CLASS RESPONSE as Custom bDirty = .F. bHeaderOut = .F. ADD OBJECT Headers AS collection PROCEDURE Init CREATE CURSOR outputCache ( outLine varchar(254) ) ENDPROC PROCEDURE destroy IF this.bDirty == .T. this.flush() ENDIF USE IN outputCache ENDPROC PROCEDURE Write LPARAMETERS theHtml LOCAL lcOutput INSERT INTO outputCache values( theHtml ) this.bDirty = .t. RETURN ENDPROC HIDDEN PROCEDURE InternalWrite LPARAMETER lcOutput DECLARE INTEGER GetStdHandle in Win32API integer nHandleType declare integer WriteFile in Win32API integer hFile, string @ cBuffer,; integer nBytes, integer @ nBytes2, integer @ nBytes3 LOCAL lnOutHandle LOCAL lnBytesWritten LOCAL lnOverLappedIO lnOutHandle=GetStdHandle(-11) lnBytesWritten=0 lnOverLappedIO=0 WriteFile(lnOutHandle, @lcOutput, len(lcOutput), @lnBytesWritten, @lnOverLappedIO) ENDPROC PROCEDURE flushHeader LOCAL lcDefaultOutput LOCAL lcOutput LOCAL lcKey local i lcDefaultOutput="" lcOutput = "" FOR i = 1 TO this.Headers.Count lcKey = this.Headers.GetKey( i ) IF !EMPTY( lcKey ) THEN lcOutput = lcOutput + lcKey + ": " + this.Headers.Item(i) + CHR(13) + CHR(10) ENDIF NEXT IF this.Headers.getKey( "Content-type" ) == 0 THEN lcOutput = lcOutput + "Content-type: text/html"+chr(13)+chr(10) ENDIF lcOutput = lcOutput + chr(13)+chr(10) this.InternalWrite( lcDefaultOutput + lcOutput ) this.bHeaderOut = .T. ENDPROC PROCEDURE flush IF this.bDirty == .f. then RETURN ENDIF LOCAL lcAlias LOCAL lcOutput IF this.bHeaderOut == .F. THEN this.flushHeader() ENDIF lcAlias = ALIAS() SELECT outputCache GO top SCAN lcOutput = outputCache.outLine this.InternalWrite( lcOutput ) ENDSCAN SELECT( lcAlias ) ENDPROC ENDDEFINE </pre> 這邊我也利用 VFP 提供的 collection 來實做了 Response 的 Header。 VFP 的 collection 跟其他語言的用法不太一樣,前面是所謂的 value,後面才是所謂的 name。 於是,你可以試試看,在 oResponse.Write( "<p>Hello world!</p>") 的前面加上 <pre> oResponse.Headers.Add( "text/plain", "Content-type" ) oResponse.Headers.Add( "us-ascii", "charset" ) </pre> 試試看結果如何~
返回到
VFPCGI Day5
。
檢視
頁面
討論
原始碼
歷史
個人工具
登入/建立新帳號 選單
導航
首頁
社群入口
現時事件
近期變動
隨機頁面
使用說明
搜尋
工具箱
鏈入頁面
相關頁面修訂記錄
所有特殊頁面