http://www.javaeye.com/pages/viewpage.action?pageId=566?
從這個例子中我們能掌握很多Tapestry的相關知識,下面我把自己對這個例子理解以及涉及到的一些知識作一些介紹:
購物車較難的一部分就是客戶選擇的商品的保存問題:
此例提供了一個很好的解決方案,將客戶選擇的商品都放在session中:
那么,在Tapestry中如何利用session呢?這就要從Tapestry中的Visit對象說起。
?????? Tapestry4.0中新增加的自定義的Validator功能
?????? 一段經典的程序代碼:
從這個例子中我們能掌握很多Tapestry的相關知識,下面我把自己對這個例子理解以及涉及到的一些知識作一些介紹:
購物車較難的一部分就是客戶選擇的商品的保存問題:
此例提供了一個很好的解決方案,將客戶選擇的商品都放在session中:
那么,在Tapestry中如何利用session呢?這就要從Tapestry中的Visit對象說起。
Visit對象是一個應用程序空間,用來儲存應用程序邏輯和數據。這個對象能被應用程序中所有的頁面和組件訪問,并且包含WEB應用程序中某一個客戶端的特殊信息。一個單一Visit對象實例被應用程序中所有的頁面共享。該對象類似HttpSession在典型servlet應用程序中扮演的角色。實際上,Visit對象最終作為一個HttpSession屬性被儲存。
為了在應用程序中使用一些通用數據,Tapestry認可Visit對象。Tapestry并不知道也不關心Visit對象的類型。在框架中也沒有定義特殊的Visit類,每一個應用程序自己定義Visit類。頁面方法訪問Visit對象時并不會指定具體的類型:
public Object getVisit();
注意強制轉換類型:
Visit visit = (Visit)getVisit();
Visit對象是框架自動生成的,在第一次運行時被引用。你必須配置Tapestry提供實例化,一旦Visit對象生成,就將會持久化儲存在HttpSession中。
?????? Tapestry4.0中新增加的自定義的Validator功能
?????? 一段經典的程序代碼:
ValidationDelegate delegate = (ValidationDelegate)this.getBeans().getBean("delegate"); if(delegate.getHasErrors()) { returnthis.getPage().getPageName(); }
學習Tapestry4.0 過程中逐漸明白的一些東西
從代碼開始分析
在EmploeeList.html文件中的一段代碼:
<tr jwcid="@Foreach" source="ognl:userList" value="ognl:customer" element="tr">
????? <td width="7%"? align="center" bgcolor="#FFFFFF"><span jwcid="@Insert" value="ognl:(customer.getAttributeValue('sex')==1)?'Male':'Female'"/></td>
?????? <td width="19%" align="center" bgcolor="#FFFFFF"><span jwcid="@Insert" value="ognl:customer.getAttributeValue('workemail')"/></td>
?? <td width="7%"? align="center" bgcolor="#FFFFFF"><span jwcid="@ExternalLink" page="xmlsync/EmployeeUpdate"???????parameters="ognl:customer.getAttributeValue('employeecode')"> 修 改 </span></td>
?? <td width="8%"? align="center" bgcolor="#FFFFFF"><span jwcid="deleteUser" parameters="ognl:customer.getAttributeValue('employeecode')" onclick="javascript:return window.confirm('確定要刪除該用戶嗎?');">刪 除</span></td>
</tr>
在EmploeeList.page文件中的一段代碼:
<page-specification class="com.ce.myceaas.tapestry.page.xmlsync.EmployeeList">
?<description>Login Page</description>
???? <property name="userList"/>
???? <property name="customer"/>
??? <component id="deleteUser" type="DirectLink">
?? <binding name="listener" value="listeners.deleteUser"/>
??? </component>
</page-specification>?
在EmploeeList.java文件中的一段代碼:
public abstract class EmployeeList extends BasePage implements PageRenderListener {
?public abstract List getUserList();
?public abstract void setUserList(List list);
?@InjectObject("spring:xmlService")
?public abstract XmlService getXmlService();
?@InjectPage("xmlsync/EmployeeList")
?public abstract IPage getEmployeeList();
?public void pageBeginRender(PageEvent event) {
??this.setUserList(this.getXmlService().getUsersList());
?}
?
?public void deleteUser(IRequestCycle cycle) {
??Object[] obj = cycle.getServiceParameters();
??if (obj[0] != null) {
???if (obj[0] instanceof String) {
????getXmlService().deleteUsers(obj[0].toString());
????FowardUtil.forwardUrl((EmployeeList)getEmployeeList());
????
???} else {
????}
??} else {
???}
}
在XmlService.java文件中的一段代碼:
public List getUsersList(){
??
??List list = new ArrayList();
??SAXBuilder builder = new SAXBuilder();
???? try {
?????? File inFile = new File(url);??? //get the xmlfile?
?????? Document doc = builder.build(inFile);
?????? Element root = doc.getRootElement();
?????
?????? list = root.getChildren("employeeinfo");
???? }
???? catch (JDOMException e) {
?????? System.out.println(" is not well-formed.");
?????? System.out.println(e.getMessage());
???? }?
???? catch (IOException e) {
?????? System.out.println(e);
???? }
??return list;
???}
可以在EmploeeList.html看到這段代碼
?"ognl:(customer.getAttributeValue('sex')==1)?'Male':'Female"
其中的customer是從<tr jwcid="@Foreach" source="ognl:userList" value="ognl:customer" element="tr">這里來的
userList是List類型 其中的元素是customer,customer的類型是Element,再看customer.getAttributeValue('sex'),這里為什么能用getAttributeValue()呢,這就要問Tapestry4.0的實現機制了,當網頁表現時遇到ognl:userList時會在EmploeeList.page中找到
<property name="userList"/>
而在EmploeeList.java中有
????? public abstract List getUserList();
?public abstract void setUserList(List list);
這兩個抽象函數將完成對ognl:userList的賦值與修改工作
下面這段代碼
?????? @InjectObject("spring:xmlService")//調用XmlService對象
??????? ······
?public abstract XmlService getXmlService();
??public void pageBeginRender(PageEvent event) {
??this.setUserList(this.getXmlService().getUsersList());//真正的實現userList的傳遞的工作
?}
這段代碼將EmploeeList.html和XmlService.java聯系起來,這也就是為什么在 EmploeeList.html能用getAttributeValue('sex')方法的原因!