VFPCGI Day5
出自VFP Wiki
(修訂版本間差異)
在2006年11月22日 (三) 14:50的最新修訂版本
VFPCGI的第五天
第五天~
接著,我們就把 WriteFile 包裝一下吧,讓她可以像 ASP 的 Response 一樣這麼用~
* * CGI03.prg * SET PROCEDURE TO cgilib LOCAL oResponse oResponse = CREATEOBJECT( "RESPONSE" ) oResponse.Write( "<p>Hello world!</p>")
所以,Response 類別就如下面,這邊利用了 VFP 的 cursor 來當作 cache,所有的 Write,實際上都是先塞到 cursor 裡面去,等到最後被釋放或是呼叫 Flush 的時候,才利用 scan...endscan 一次把所有資料寫出去。
* * 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
這邊我也利用 VFP 提供的 collection 來實做了 Response 的 Header。 VFP 的 collection 跟其他語言的用法不太一樣,前面是所謂的 value,後面才是所謂的 name。 於是,你可以試試看,在 oResponse.Write( "<p>Hello world!</p>") 的前面加上
oResponse.Headers.Add( "text/plain", "Content-type" ) oResponse.Headers.Add( "us-ascii", "charset" )
試試看結果如何~