Tapestry5.3.8 Grid组件的用法,整理出来的代码,以备后用;
1、页面Java类:
// [用户实体模型 START] @Inject private BeanModelSource beanModelSource; @Inject private ComponentResources componentResources; @Inject private Messages messages; private BeanModel<People> peopleBeanModel; public BeanModel<People> getPeopleBeanModel() { if (peopleBeanModel == null) { peopleBeanModel = beanModelSource.createEditModel(People.class, messages); peopleBeanModel.get("name").label("用户名"); peopleBeanModel.get("age").label("年龄"); peopleBeanModel.get("gender").label("性别"); peopleBeanModel.get("birthday").label("生日"); peopleBeanModel.get("hobby").label("兴趣爱好"); peopleBeanModel.add("view", new selfPropertyConduit()).label("详情"); peopleBeanModel.add("delete", new selfPropertyConduit()) .label("删除"); } return peopleBeanModel; } class selfPropertyConduit implements PropertyConduit { /* * (non-Javadoc) * * @see * org.apache.tapestry5.ioc.AnnotationProvider#getAnnotation(java.lang * .Class) */ @Override public <T extends Annotation> T getAnnotation(Class<T> arg0) { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see org.apache.tapestry5.PropertyConduit#get(java.lang.Object) */ @Override public Object get(Object arg0) { // TODO Auto-generated method stub return ""; } /* * (non-Javadoc) * * @see org.apache.tapestry5.PropertyConduit#getPropertyType() */ @SuppressWarnings("rawtypes") @Override public Class getPropertyType() { // TODO Auto-generated method stub return String.class; } /* * (non-Javadoc) * * @see org.apache.tapestry5.PropertyConduit#set(java.lang.Object, * java.lang.Object) */ @Override public void set(Object arg0, Object arg1) { // TODO Auto-generated method stub } } // [用户实体模型 END]
2、页面 tml模板:
<t:grid source="peoples" row="people" model="peopleBeanModel" rowsPerPage="10"> <t:parameter name="nameCell"> <t:pagelink page="edit" context="people.id">${people.name}</t:pagelink> </t:parameter> <t:parameter name="viewCell"> <t:actionlink t:id="view" context="people.id" zone="viewZone">View</t:actionlink> </t:parameter> <t:parameter name="deleteCell"> <t:actionlink t:id="delete" context="people.id">Delete</t:actionlink> </t:parameter> </t:grid>
注意事项:
1、元素的name决定了需要覆写处理方式的属性,而name的命名规则是在属性名的后面加上后缀Cell(此外,表格中每列的属性名也可以通过添加Header前缀进行覆写)
2、本例中的元素名为nameCell,因此,Grid组件将通过PageLink组件来处理表格中包含用户名的列。PageLink组件显示的HTML链接将用户导向在page参数中指定的页面,调用这个指定的页面所需的额外信息则在 context参数中定义。本例中,编辑用户资料的是Edit页面,调用该页面时还需要传递一个用户id参数。此外,还需要一个属性来存储即将被编辑的用户对象才能在调用编辑页面的时候传递该用户对应的name和id值。为了实现这个目的,我们需要在Start类中添加一个叫做user的属性,再把这个新建属性捆绑到Grid组件的row参数上。
3、页面的表格中添加一个不属于User类属性的列;Grid组件通过先生成一个BeanModel来决定如何显示一个bean,例如本例中的User对象。我们可以通过创建和定制这个BeanModel来完完全全地控制Grid的操作方式
4、在Start页面的模板中,我们还需要修改另外两处:首先要显示地告知Grid组件它应该应用哪个模型。其次,为显示这个新添加的delete列提供一个定义。ActionLink组件可以用来监控什么时候用户作出了删除某个用户记录的指令。在收到这个指令的时候,ActionLink会触发Start页面上的一个事件。通过为该事件函数提供特殊命名来观察这个事件。通常来说,id为“delete”的组件在被触发了某个action的时候会调用名为 onActionFromDelete()的函数
5、究竟要删除的是哪个用户记录?这时候我再一次需要将用户的id作为上下文参数传递,id的值会作为参数传递给所触发的事件处理函数
6、事件处理函数没有必要一定是公有的,其实最好的选择是作为整个类包的私有函数(也就是函数不需要显式声明修饰符)。Tapestry可以调用这样的函数,同时同一个类包中的其它类也能够调用该函数(比如单元测试),但这个函数并不属于该页面类的公共API