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')方法的原因!