4.1 顯示狀態(tài)的維護(hù)
組件的顯示狀態(tài)是指組件在一系列的postback中應(yīng)該始終保存的數(shù)據(jù)。比如,用戶在一個(gè)頁面中更改了一個(gè)組件的字體顏色,他希望頁面再一次提交顯示的時(shí)候,依然看到的是已經(jīng)修改過的顏色。在桌面gui程序的開發(fā)中,這個(gè)非常簡單。但是在web編程中就不那么容易了,因?yàn)閣eb服務(wù)器并不會(huì)一直在內(nèi)存中保持著頁面狀態(tài)。prado借鑒了asp.net的顯示狀態(tài)這個(gè)概念來解決這個(gè)問題。
如果要通過顯示狀態(tài)來保持一些數(shù)據(jù),可以調(diào)用tcomponent 類中的getviewstate() 和 setviewstate() 方法。可以在顯示狀態(tài)中保持很多類型的數(shù)據(jù),但是不用把它用在資源句柄中,比如數(shù)據(jù)庫聯(lián)接。
prado
通過一個(gè)把限制狀態(tài)保存在一個(gè)隱藏字段中來返回給用戶。當(dāng)用戶提交頁面并再一次顯示頁面的時(shí)候,顯示狀態(tài)中的數(shù)據(jù)會(huì)從被提交的隱藏域中讀出來并用此恢復(fù)頁面的狀態(tài)。可以通過重載的方法來自己定制顯示狀態(tài)的存儲(chǔ)方法。比如可以把顯示狀態(tài)保存在session中或者數(shù)據(jù)庫中,避免通過隱藏字段要傳輸大量的數(shù)據(jù)。
4.2 session
session是用來在不同頁面間保存狀態(tài)的,這和頁面的顯示狀態(tài)機(jī)制不同,顯示狀態(tài)只能保存本頁面的狀態(tài)。
如果要使用session, 那么首先在應(yīng)用的配置文件中定義一個(gè)session類。session類必須實(shí)現(xiàn)isession
接口。如果你不想自己寫一個(gè)session類,那可以使用類system.security.tsession ,它封裝了$_session 變量來實(shí)現(xiàn)了isession 接口。你也可以自己寫一個(gè)session類來使用不同的方法處理session(比如把session保存到數(shù)據(jù)庫中)。
如果定義了session類,在請求的頁面創(chuàng)建之前,對應(yīng)的session對象就會(huì)被創(chuàng)建。tpage 頁面類有一個(gè)session 屬性,可以方便的來訪問session對象。
4.3 驗(yàn)證和授權(quán)
prado 提供了一個(gè)驗(yàn)證/授權(quán)的框架來支持驗(yàn)證頁面的訪問者,判斷他們是否有權(quán)限來訪問頁面。
在驗(yàn)證框架中,一個(gè)用戶類起到了主要作用。訪問者如果通過了一定的身份驗(yàn)證(比如登錄),并在服務(wù)器端獲得了一個(gè)正確的身份,那么驗(yàn)證就通過了。用戶對象代表了這么一個(gè)身份識別。除了身份檢查外,一些頁面也需要額外的權(quán)限檢查來確保被驗(yàn)證的身份有足夠的權(quán)限來訪問。
驗(yàn)證框架支持基于角色的驗(yàn)證。一個(gè)頁面如果在應(yīng)用的配置頁面中指名了需要驗(yàn)證(secured),框架將確保在訪問頁面前用戶必須被驗(yàn)證。如果還指定的角色,那么框架還將確保用戶是屬于該角色的。最后,還可以定制頁面的驗(yàn)證過程。如果驗(yàn)證或者授權(quán)失敗了,onauthenticationrequired 或onauthorizationrequired 方法就會(huì)被觸發(fā),可以在此顯示錯(cuò)誤信息或者重定向到登錄頁面。
用戶對象在不同的頁面始終存在的,它使用了session。因此如果要使用驗(yàn)證框架則必須申明session類。由于用戶對象保存在session中,因此你可以用它來保存一些需要在不同頁面訪問的數(shù)據(jù)。
如果要使用驗(yàn)證框架,需要在應(yīng)用的配置文件中申明一個(gè)用戶類。用戶類必須實(shí)現(xiàn)了iuser接口。框架中已經(jīng)提供了一個(gè)實(shí)現(xiàn)了該接口的類system.security.tuser 。
phonebook 這個(gè)例子中說明了驗(yàn)證框架是如果使用的。
4.4 form驗(yàn)證
prado提供了一種簡單的方法來進(jìn)行form的驗(yàn)證,而如果使用傳統(tǒng)的php編程方式,這個(gè)過程是非常重復(fù)而且單調(diào)的。在prado中有一套驗(yàn)證組件。這些驗(yàn)證組件即允許在客戶端也允許在服務(wù)器端對數(shù)據(jù)進(jìn)行驗(yàn)證,下面我們將舉一個(gè)例子來說明。
現(xiàn)在我們要?jiǎng)?chuàng)建一個(gè)用戶注冊頁面。這個(gè)頁面要求用戶輸入一個(gè)用戶名和一個(gè)密碼來創(chuàng)建新的帳號。密碼要求是被輸入兩次以防止輸入錯(cuò)誤。另外用戶名和密碼都只能包含數(shù)字和數(shù)字,而且兩者的長度分別要求不少于3位和6位。
要實(shí)現(xiàn)這個(gè)功能,可以創(chuàng)建這么一個(gè)模板:
...
<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>
...
上面這個(gè)模板允許頁面執(zhí)行用戶輸入的客戶端驗(yàn)證和服務(wù)器端驗(yàn)證(假定瀏覽器支持javascript)。不再需要額外的代碼了。如果驗(yàn)證失敗的話,form是不會(huì)被提交的,而同時(shí)會(huì)顯示錯(cuò)誤信息。
可以在模板文件中通過設(shè)置驗(yàn)證組件的enableclientscript 屬性來關(guān)掉客戶端的驗(yàn)證。這時(shí)候,你可以在頁面的onload 事件中或者之后通過檢查頁面的isvalid 屬性來判斷驗(yàn)證是否通過。
4.5 緩存
prado框架提供了一個(gè)緩存機(jī)制來提高prado應(yīng)用的運(yùn)行效率。對于每一種組件類型,如果它之前曾經(jīng)被實(shí)例化過,那么就會(huì)有一個(gè)對應(yīng)的文件存在緩存目錄中。這個(gè)文件包含了被序列化的的控件實(shí)例。以后一旦需要再創(chuàng)建同樣的組件,那么就直接通過這個(gè)緩存文件來創(chuàng)建。這將會(huì)大大節(jié)省組件的創(chuàng)建時(shí)間,因?yàn)閯?chuàng)建組件的過程需要解析好幾個(gè)xml規(guī)格文件和模板文件。
如果要使用緩存,只需要在應(yīng)用的配置文件中給的屬性設(shè)置一個(gè)目錄即可。這個(gè)目錄必須是web服務(wù)器可寫的。使用的路徑可以是絕對路徑也可以是相對路徑。
如果要關(guān)閉緩存,只需要給屬性賦一個(gè)空字符串即可。
注意,如果你修改了組件的文件,那么應(yīng)該包括所有的緩存文件都刪掉或者移走。下一次組件創(chuàng)建的時(shí)候會(huì)自動(dòng)重新創(chuàng)建的。因此在開發(fā)的時(shí)候,應(yīng)該把緩存關(guān)掉。
4.6 定制 tapplication
tapplication 類是可以被擴(kuò)充的。 tapplication 有好幾個(gè)方法可以被重載。比如,你可以重載 beginrequest() 方法來實(shí)現(xiàn)對request數(shù)據(jù)的進(jìn)行一些自己需要的預(yù)處理。如果想進(jìn)一步了解這些內(nèi)容,可以參考prado 的文檔。
新聞熱點(diǎn)
疑難解答