JaveShare&OpenSpace

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            7 Posts :: 0 Stories :: 7 Comments :: 0 Trackbacks
          http://www.javaeye.com/pages/viewpage.action?pageId=566?
          從這個例子中我們能掌握很多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')方法的原因!
          posted on 2006-08-11 13:32 ~哈哈~ 閱讀(500) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 特克斯县| 灌云县| 武城县| 灵石县| 仁寿县| 乌兰察布市| 百色市| 加查县| 普定县| 呈贡县| 永福县| 无棣县| 旌德县| 塔河县| 内丘县| 碌曲县| 三门县| 屯留县| 万源市| 黄浦区| 湘潭县| 台南市| 和林格尔县| 湟源县| 锦州市| 尉氏县| 庄浪县| 黄骅市| 永丰县| 乌什县| 邢台县| 中阳县| 陈巴尔虎旗| 南安市| 汝阳县| 建阳市| 固镇县| 萝北县| 唐山市| 雷波县| 建德市|