Tapestry 4 beta5
一、注意空格。tapestry這點(diǎn)作的不太好。如果在一些屬性中開(kāi)始或結(jié)尾多寫(xiě)了個(gè)空格,就會(huì)發(fā)生錯(cuò)誤,而且很難找出來(lái)。
二、中文亂碼問(wèn)題?????
在*.application中加入下面語(yǔ)句:
???
???
三。Shell組件默認(rèn)Render出來(lái)的meta有限,有時(shí)需要擴(kuò)展,通過(guò)delegate屬性,下面是個(gè)例子:
public
?
class
?HeadMetaRender?implements?IRender?{
???? public ? void ?render(IMarkupWriter?writer,?IRequestCycle?cycle)?{
????????writer.begin( " meta " );
????????writer.attribute( " http-equiv " , " Content-Language " );
????????writer.attribute( " content " , " zh-cn " );
????????writer.closeTag();
????????writer.begin( " meta " );
????????writer.attribute( " http-equiv " , " Content-Type " );
????????writer.attribute( " content " , " text/html;?charset=gb2312 " );
????????writer.closeTag();
????}
???? public ? void ?render(IMarkupWriter?writer,?IRequestCycle?cycle)?{
????????writer.begin( " meta " );
????????writer.attribute( " http-equiv " , " Content-Language " );
????????writer.attribute( " content " , " zh-cn " );
????????writer.closeTag();
????????writer.begin( " meta " );
????????writer.attribute( " http-equiv " , " Content-Type " );
????????writer.attribute( " content " , " text/html;?charset=gb2312 " );
????????writer.closeTag();
????}
四、今天嘗試了Application State Object,Localization,FriendURL。
FriendUrl比較好弄,給的文檔也比較詳細(xì)。按照文檔copy就可以了。沒(méi)有仔細(xì)研究。
Locaition也很好弄,為每個(gè)頁(yè)面寫(xiě)一個(gè)properties文件用于文件里面的文字,再為application寫(xiě)一個(gè)用于做系統(tǒng)通用信息。只是注意編碼
???
???????
????????????????? dest="${webinfo.dir}/page"
????????????????? includes="*.properties"
????????????????? excludes="TNetCatcher.properties"/>
????????
????????????????? dest="${webinfo.dir}"
????????????????? includes="*NetCatcher.properties"/>
???
在ant中加入如上target。
Application State Object 相關(guān)的東西弄了半天。我要做一個(gè)驗(yàn)證用戶(hù)合法性的功能,就是看VisitObject(Session Scope)中又沒(méi)有用戶(hù)信息,如果沒(méi)有用戶(hù)信息就跳轉(zhuǎn)到登錄頁(yè)面。這樣的功能以往我是寫(xiě)一個(gè)LoginFilter里檢查Session。但是在 Tapestry中不建議直接操作Session。雖然我也可以知道那個(gè)VisitObject在Session中的名字(一般為"state:App- Name:visit-Name"),但是還是不用Filter了。我就寫(xiě)了一個(gè)MyBasePage繼承與BasePage然后添加了一個(gè) MyPageValidateListener?實(shí)現(xiàn) PageValidateListener 在MyPageValidateListener?的pageValidate方法中進(jìn)行驗(yàn)證。
public?class?MyPageValidateListener?implements?PageValidateListener?{
????public?void?pageValidate(PageEvent?event)?{
????????IRequestCycle?cycle?=?event.getRequestCycle();
????????MyBasePage?page?=?(MyBasePage)?event.getPage();
????????AppVisit?visit?=?page.getAppVisit();
????????if(visit.getCustomer()==null
????????????????&&!page.getPageName().equals("Login")
????????????????&&!page.getPageName().equals("Register")
????????????????&&!page.getPageName().equals("GetPassword")){
????????????IPage?login?=?cycle.getPage("Login");
????????????throw?new?PageRedirectException(login);
????????}
????}
}
????public?void?pageValidate(PageEvent?event)?{
????????IRequestCycle?cycle?=?event.getRequestCycle();
????????MyBasePage?page?=?(MyBasePage)?event.getPage();
????????AppVisit?visit?=?page.getAppVisit();
????????if(visit.getCustomer()==null
????????????????&&!page.getPageName().equals("Login")
????????????????&&!page.getPageName().equals("Register")
????????????????&&!page.getPageName().equals("GetPassword")){
????????????IPage?login?=?cycle.getPage("Login");
????????????throw?new?PageRedirectException(login);
????????}
????}
}
這里,最好在最后Throw一個(gè)PageRedirectException,不要用cycle.activate()。
這樣有一點(diǎn)要注意的是,必須在沒(méi)有頁(yè)面的page文件中加入
?