ado|進階
第4章 進階主題
4.1 顯示狀態的維護
組件的顯示狀態是指組件在一系列的postback中應該始終儲存的資料。比如,使用者在一個頁面中更改了一個組件的字型顏色,他希望頁面再一次提交顯示的時候,依然看到的是已經修改過的顏色。在案頭GUI程式的開發中,這個非常簡單。但是在Web編程中就不那麼容易了,因為Web伺服器並不會一直在記憶體中保持著頁面狀態。PRADO借鑒了ASP.NET的顯示狀態這個概念來解決這個問題。
如果要通過顯示狀態來保持一些資料,可以調用TComponent 類中的getViewState() 和 setViewState() 方法。可以在顯示狀態中保持很多類型的資料,但是不用把它用在資源控制代碼中,比如資料庫聯結。
PRADO
通過一個把限制狀態儲存在一個隱藏欄位中來返回給使用者。當使用者提交頁面並再一次顯示頁面的時候,顯示狀態中的資料會從被提交的隱藏欄位中讀出來並用此恢複頁面的狀態。可以通過重載的方法來自己定製顯示狀態的儲存方法。比如可以把顯示狀態儲存在session中或者資料庫中,避免通過隱藏欄位要傳輸大量的資料。
4.2 Session
Session是用來在不同頁面間儲存狀態的,這和頁面的顯示狀態機器制不同,顯示狀態只能儲存本頁面的狀態。
如果要使用session, 那麼首先在應用的設定檔中定義一個session類。session類必須實現ISession
介面。如果你不想自己寫一個session類,那可以使用類System.Security.TSession ,它封裝了$_SESSION 變數來實現了ISession 介面。你也可以自己寫一個session類來使用不同的方法處理session(比如把session儲存到資料庫中)。
如果定義了session類,在請求的頁面建立之前,對應的session對象就會被建立。TPage 頁面類有一個Session 屬性,可以方便的來訪問session對象。
4.3 驗證和授權
PRADO 提供了一個驗證/授權的架構來支援驗證頁面的訪問者,判斷他們是否有許可權來訪問頁面。
在驗證架構中,一個使用者類起到了主要作用。訪問者如果通過了一定的身分識別驗證(比如登入),並在伺服器端獲得了一個正確的身份,那麼驗證就通過了。使用者物件代表了這麼一個身份識別。除了身份檢查外,一些頁面也需要額外的許可權檢查來確保被驗證的身份有足夠的許可權來訪問。
驗證架構支援基於角色的驗證。一個頁面如果在應用的配置頁面中指名了需要驗證(secured),架構將確保在訪問頁面前使用者必須被驗證。如果還指定的角色,那麼架構還將確保使用者是屬於該角色的。最後,還可以定製頁面的驗證過程。如果驗證或者授權失敗了,onAuthenticationRequired 或onAuthorizationRequired 方法就會被觸發,可以在此顯示錯誤資訊或者重新導向到登入頁面。
使用者物件在不同的頁面始終存在的,它使用了session。因此如果要使用驗證架構則必須申明session類。由於使用者物件儲存在session中,因此你可以用它來儲存一些需要在不同頁面訪問的資料。
如果要使用驗證架構,需要在應用的設定檔中申明一個使用者類。使用者類必須實現了IUser介面。架構中已經提供了一個實現了該介面的類System.Security.TUser 。
phonebook 這個例子中說明了驗證架構是如果使用的。
4.4 Form驗證
PRADO提供了一種簡單的方法來進行form的驗證,而如果使用傳統的PHP編程方式,這個過程是非常重複而且單調的。在PRADO中有一套驗證組件。這些驗證組件即允許在用戶端也允許在伺服器端對資料進行驗證,下面我們將舉一個例子來說明。
現在我們要建立一個使用者註冊頁面。這個頁面要求使用者輸入一個使用者名稱和一個密碼來建立新的帳號。密碼要求是被輸入兩次以防止輸入錯誤。另外使用者名稱和密碼都只能包含數字和數字,而且兩者的長度分別要求不少於3位和6位。
要實現這個功能,可以建立這麼一個模板:
...
<com:TForm>
...
Username:
<com:TTextBox ID="username" />
<com:TRequiredFieldValidator
ControlToValidate="username"
ErrorMessage="You must choose a username." />
<com:TRegularExpressionValidator
ControlToValidate="username"
RegularExpression="[\w]{3,}"
ErrorMessage="Username must ...." />
<br/>
Password:
<com:TTextBox ID="password" TextMode="Password" />
<com:TRequiredFieldValidator
ControlToValidate="password"
ErrorMessage="You must choose a password." />
<com:TRegularExpressionValidator
ControlToValidate="password"
RegularExpression="[\w]{6,}"
ErrorMessage="Password must ...." />
<br/>
Repeat Password:
<com:TTextBox ID="password2" TextMode="Password" />
<com:TRequiredFieldValidator
ControlToValidate="password2"
ErrorMessage="Please re-type your password." />
<com:TCompareValidator
ControlToValidate="password2"
ControlToCompare="password"
ErrorMessage="Your password entries did not match." />
<br/>
<com:TButton Text="Register" />
...
</com:TForm>
...
上面這個模板允許頁面執行使用者輸入的用戶端驗證和伺服器端驗證(假定瀏覽器支援javascript)。不再需要額外的代碼了。如果驗證失敗的話,form是不會被提交的,而同時會顯示錯誤資訊。
可以在模板檔案中通過設定驗證組件的EnableClientScript 屬性來關掉用戶端的驗證。這時候,你可以在頁面的OnLoad 事件中或者之後通過檢查頁面的IsValid 屬性來判斷驗證是否通過。
4.5 緩衝
PRADO架構提供了一個緩衝機制來提高PRADO應用的運行效率。對於每一種組件類型,如果它之前曾經被執行個體化過,那麼就會有一個對應的檔案存在緩衝目錄中。這個檔案包含了被序列化的的控制項執行個體。以後一旦需要再建立同樣的組件,那麼就直接通過這個快取檔案來建立。這將會大大節省組件的建立時間,因為建立組件的過程需要解析好幾個XML規格檔案和模板檔案。
如果要使用緩衝,只需要在應用的設定檔中給的屬性設定一個目錄即可。這個目錄必須是Web伺服器可寫的。使用的路徑可以是絕對路徑也可以是相對路徑。
如果要關閉緩衝,只需要給屬性賦一個Null 字元串即可。
注意,如果你修改了組件的檔案,那麼應該包括所有的快取檔案都刪掉或者移走。下一次組件建立的時候會自動重新建立的。因此在開發的時候,應該把緩衝關掉。
4.6 定製 TApplication
TApplication 類是可以被擴充的。 TApplication 有好幾個方法可以被重載。比如,你可以重載 beginRequest() 方法來實現對request資料的進行一些自己需要的預先處理。如果想進一步瞭解這些內容,可以參考PRADO 的文檔。