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 ~哈哈~ 阅读(496) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: