tapestry的列表有两种,一种是ForEach。一种是Table。第一种是只需要tapestry的主包就好的。另一种是需要contrib附加包的。
ForEach是普通的列表。如果需要一大片的表数据显示,就可以用这个来搞定。
要模拟表,首先要有点数据吧!模拟一个数据库,最简单的就是建立静态的类变量。我们可以这样定义一个水果列表类:
package com.bo;
import java.util.ArrayList;
import java.util.List;
public class MyFruitList {
private static List<Fruit> fruitList;
public static List<Fruit> getFruitList(){
if(fruitList == null){
fruitList = new ArrayList<Fruit>();
fruitList.add(getFruit(1,"apple"));
fruitList.add(getFruit(2,"orangle"));
fruitList.add(getFruit(3,"orangle1"));
fruitList.add(getFruit(4,"orangle2"));
fruitList.add(getFruit(5,"orangle3"));
fruitList.add(getFruit(6,"orangle4"));
}
return fruitList;
}
public static void addFruit(Fruit f){
fruitList.add(getFruit(f.getId(),f.getName()));
}
public static Fruit getFruit(int id,String name){
Fruit f = new Fruit();
f.setId(id);
f.setName(name);
return f;
}
}
定义个全局的静态的Fruit的List,用getFruitList模拟数据库中取数据。
然后在html模板中画个表格:
<table width="183" height="73" border="1">
<tbody>
<tr>
<td>
id
<br>
</td>
<td>
name
<br>
</td>
</tr>
<tr jwcid="fruitListLoop">
<td>
<span jwcid="fruitId">fid</span>
</td>
<td>
<span jwcid="fruitName">fname</span>
</td>
</tr>
</tbody>
</table>
和普通表格比,多了几个jwcid属性。这就是tapestry网页模板和普通html的区别。也就是要在page文件中定义关联和规则的东西。还有几个span,这是用来绑定字段用的。
为了看动态效果,我们再加一个按钮,按它,就在表下面添加一行。
<input type="submit" value="add" jwcid="addBut"/>
好了,开始写page:
首先绑定addBut按钮:
<component id="addBut" type="Submit">
<binding name="listener" expression="listeners.addSubmit"/>
</component>
然后绑定表数据:
<property-specification name="fruitList" type="java.util.List"/>
<property-specification name="fruit"
type="com.bo.Fruit"/>
这里绑定了两个类,一个是List类型的列表,其中放各种Fruit数据,模拟数据库中选择出来的Recordset。一个是Fruit类型的fruit,这个是用来表示List中的一条记录。相当于一个Row,之所以定义它,是下面的定义要引用到它。
定义表数据源:
<component id="fruitListLoop" type="Foreach">
<binding name="source" expression="fruitList"/>
<binding name="value" expression="fruit"/>
<static-binding name="element" value="tr"/>
</component>
这里定义了整个表的数据源对应。source绑定了上面定义的List。value绑定了上面定义的Row记录。element绑定了标签。注意这里element绑定的写法tap3和tap4不一样,4中是这样写:
<binding name="element" value="literal:tr">
绑定表的字段:
<component id="fruitId" type="Insert">
<binding name="value" expression="fruit.id"/>
</component>
<component id="fruitName" type="Insert">
<binding name="value" expression="fruit.name"/>
</component>
这里的expression就把值字段绑定到html模板的相应td标签的span中。每插入一个fruit,就按照绑定的变量到fruit中取出,然后塞入对应的span中。
最后要在HOME中添加对Add按钮的绑定方法。
先添加定义
public abstract List<Fruit> getFruitList();
public abstract void setFruitList(List<Fruit> fl);
这两个数据用来定义对列表数据源的读取。表格里显示什么数据,主要由getFruitList中读取的数据来定。这里要注意一下pageBeginRender的问题。在页面重新载入的时候,都要运行pageBeginRender。然后根据当前数据来打印html。因为submit后都要重载页面,所以每次重载页面,都需要重新从数据库中读取数据。然后用setFruitList设置到页面中。
public void pageBeginRender(PageEvent event) {
if(getUInfo()==null){
setUInfo(new UserInfo());
}
if(getFruitList()==null){
List<Fruit> fruitList = MyFruitList.getFruitList();
setFruitList(fruitList);
}
}
现在绑定addSubmit方法:
public void addSubmit(IRequestCycle cycle){
MyFruitList.addFruit(MyFruitList.getFruit(++i,"apple"+i));
}
在全局变量中添加数据,就相当于在数据库中添加一行。那么为什么没有再用setFruitList呢?这里addSubmit响应后直接就重新刷新页面,然后又到pageBeginRender重读全局变量,所以这里的setFruitList根本没有用(在没设置fruitList的作用域的情况下——因为我没有设置fruitList的作用域)。
当然这里用到一个自加的i,所以要在类中添加一行:
private int i=12;//从12开始。
好了,ForEach差不多就这样。
Table和ForEach的区别就是Table是分页的。而且需要添加contrib额外的支持
打开WEB-INF下的application文件,添加一行:
<library id="contrib"
specification-path="/org/apache/tapestry/contrib/Contrib.library"/>
一定要添加这行,不然page会提示contrib名字空间无效。
然后设计Html模板,添加一个table,像这样。
<table jwcid="tableView" width="483" height="73" border="2">
<tbody>
<tr>
<span jwcid="tableColumns">
<td>
id
<br>
</td>
<td>
name
<br>
</td>
</span>
</tr>
<tr jwcid="tableRows">
<span jwcid="tableValues">
<td>
fid
</td>
<td>
fname
</td>
</span>
</tr>
<tr>
<td colspan="6" align="center">
<span jwcid="condPages"><span jwcid="tablePages">1
2 3 页</span> </span>
</td>
</tr>
</tbody>
</table>
注意那几个jwcid。一个放在table,一个放在表头tr下的span中,一个放在数据tr中一个放在数据tr的span中,两个放在翻页行的td内容的span中。
然后在page文件中添加:
对TableView数据源的绑定:
<!--TABLE控件的使用-->
<component id="tableView" type="contrib:TableView">
<binding name="source" expression="tableViewModel"/>
<static-binding name="columns"
value="id:id:id,name:名称:name"/>
<static-binding name="pageSize" value="5"/>
</component>
这里的tableViewModel对应的是java类里的getTableViewModel方法,columns定义的是表头,用逗号隔开每个表头定义,用:隔开表头的属性定义(有三个,具体可以看这里http://tapestry.apache.org/tapestry4/tapestry-contrib/ComponentReference/TableView.html#Examples)。pageSize定义一个页面有几条记录,以便分页。
对表头,每行,列值的定义
<!--表头部-->
<component id="tableColumns" type="contrib:TableColumns">
</component>
<!--每一行-->
<component id="tableRows" type="contrib:TableRows">
</component>
<!--列值-->
<component id="tableValues" type="contrib:TableValues">
</component>
对分页的格式定义(类似google下面的圈圈,挺好理解的)
<!--分页
导航栏-->
<component id="condPages" type="Conditional">
<binding name="condition"
expression="components.tableView.tableModel.pageCount > 1"/>
</component>
<component id="tablePages" type="contrib:TablePages">
<static-binding name="pagesDisplayed" value="10"/>
</component>
最主要的来了,回到Home类,要使用Table,就要实现一个方法getTableViewModel,而Table似乎不需要在page里面定义变量:
public IBasicTableModel getTableViewModel() {
return new IBasicTableModel() {
private int rowCount;
public Iterator getCurrentPageRows(int start, int length,
ITableColumn itablecolumn, boolean flag) {
String sortColumn = null;
if (itablecolumn != null) {
sortColumn = itablecolumn.getColumnName();
}
return MyFruitList.getFruitList(start,length).iterator();
}
public int getRowCount() {
return MyFruitList.getFruitList().size();
}
};
}
IBaseTableModel有两个函数,一个是getCurrentPageRows,这个是返回分页当前页的数据。是由start和length控制打印起始以及条数。所以我们不能用MyFruitList.getFruitList()获取所有条目(当然这样也可以,我试过,不过没有分页效果)所以要在MyFruitList重载getFruitList方法来获取某几条记录。
public static List<Fruit> getFruitList(int start, int len){
List<Fruit> fl = new ArrayList<Fruit>();
int length = start+len>fruitList.size()?fruitList.size():start+len;
for(int i=start;i<length;i++)
fl.add(fruitList.get(i));
return fl;
}
getRowCount函数是获取总的记录条数。这就不说了。
因为用的是同一个数据(MyFruitList),所以点击addSubmit的时候,两个都可以刷新。多刷几次,分页效果就出来了。
分享到:
相关推荐
【压缩包子文件的文件名称列表】中,我们可以看到一系列以"Tapestry"开头并带有"LICENSE"和"NOTICE"后缀的文件。这些文件对于理解该软件的许可协议和使用条件至关重要: 1. **tapestry-core-LICENSE.txt**:这是...
2. **社区支持**:开发者可以在Apache邮件列表、Stack Overflow等社区获取帮助和讨论问题。 3. **示例项目**:“复件 frame3”可能是一个示例项目,你可以通过解压并运行来亲身体验Tapestry 的工作原理。 通过深入...
tapestry部分组件绑定参数的列表!
- **表单元素**:详细解释了Tapestry中如何创建和管理各种表单元素(如文本框、下拉列表等),并展示了如何使用这些元素来收集用户输入。 - **数据绑定**:讲述了Tapestry中的数据绑定机制,包括如何将表单字段与...
遗憾的是,提供的压缩包文件列表只包含一个名为“Tapestry4开发指南.doc”的文档,无法提供更多的具体细节。不过,这个文档应该是对整个框架的全面介绍,包括基础概念、核心机制、最佳实践等。读者可以通过阅读这份...
`tapestry-func-5.3.7.jar`提供了函数式编程的支持,使得Tapestry的应用代码更加简洁和优雅,尤其是在处理列表、映射等集合类型的数据时。 `tapestry-jpa-5.3.7.jar`和`tapestry-hibernate-5.3.7.jar`则与持久层...
作为Apache项目的一部分,Tapestry 4拥有活跃的社区和丰富的在线资源,包括邮件列表、论坛和代码示例,这些资源可以帮助开发者解决问题并持续学习。 通过深入研究Tapestry 4的官方文档,开发者可以充分利用其强大...
Tapestry的核心是组件,它将UI元素(如按钮、表单、列表等)封装为独立的、可重用的单元。每个组件有自己的状态和行为,可以嵌套和组合,形成复杂的用户界面。通过这种方式,开发者可以专注于业务逻辑,而不是底层...
Tapestry提供了内置的安全框架,允许开发者定义访问控制列表、角色和权限,从而保护敏感数据和操作免受未经授权的访问。 #### Web Applications Tapestry3设计用于构建大型、复杂的Web应用。它支持多页面应用的...
大量的邮件列表令人无法忍受。 | | SpringMVC| 生命周期由重写绑定、验证等确定;能够无缝隙地与各种表现层程序结合在一起,如JSP、XSL等;IC使得很容易测试。 | 很少被使用;需要在JSP中写入大量代码;太灵活了,...
- **表单元素**:讲解Tapestry中的各种表单元素,如文本框、复选框、下拉列表等。 - **数据绑定**:探讨如何将表单字段与后端对象进行数据绑定,实现动态数据更新。 - **表单验证**:介绍Tapestry提供的内置验证机制...
4. **下拉框(Select和Option)**:Select组件用于创建下拉列表,Option组件则表示列表中的每个选项。Select的`value`属性用于指定当前选定的选项,Option通过`value`属性设置其值。例如: ```xml ``` ...
- **创建表单组件**:使用Tapestry提供的表单组件,如文本框、下拉列表等。 - **处理表单提交**:定义一个方法来处理表单提交的数据,通常是在组件类中实现。 - **实现验证逻辑**:利用Tapestry的内置验证机制来验证...
TWF(Tapestry Web Forms)提供了丰富的表单组件,如文本输入框、选择列表和按钮等,并支持事件处理和数据验证。在这个项目中,开发者可以学习如何定义表单组件,处理用户提交的数据,以及如何在后端进行业务逻辑...
Table组件是Tapestry中用于显示数据列表的关键组件。它允许开发者以表格的形式展示数据,并提供了丰富的定制选项。以下是一些核心知识点: 1. **数据绑定**:Table组件需要一个数据源,通常是一个列表或集合,每个...
【压缩包子文件的文件名称列表】:Space 由于没有具体的文件名列表,我们只能推测压缩包可能包含的常见文件结构。一个典型的Java Web项目可能包括以下部分: 1. `src/main/java`:源代码目录,存放用Java编写的业务...
例如,创建一个用于显示所有记录的列表页面,一个用于添加新记录的表单页面,以及分别处理更新和删除操作的页面。每个页面都由一组相互协作的组件构成,组件间可以通过事件传递数据和触发动作。 在后端,Spring控制...
- **Select组件**:下拉列表的选择框。 - **Checkbox组件**:多选框。 - **Submit组件**:提交按钮。 - **Validator**:验证器,用于校验用户输入的有效性。 - **Errors组件**:展示验证错误信息。 - **自定义错误...
**压缩包子文件的文件名称列表:** 1. **src** - 这个目录通常包含项目的源代码,按照Java的标准目录结构,我们可以在这里找到Java类文件,这些文件可能包含了用Tapestry编写的业务逻辑和组件实现。 2. **.project...
在第四章中,作者介绍了Tapestry的高级组件,这些组件提供了更复杂的交互性和功能性,例如动态列表、树控件和表格等。第五章则专注于表单输入验证,展示了如何使用Tapestry的验证机制确保数据的完整性和正确性。 ##...