- 浏览: 1228352 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (353)
- java基础 (40)
- tapestry (16)
- gwt (14)
- ajax (7)
- linux (8)
- ubuntu (18)
- eclipse (6)
- dojo (2)
- javascript (7)
- maven (4)
- 日常生活 (29)
- web2.0 (2)
- jsonrpc (1)
- compass (1)
- lucene (0)
- spring (10)
- cluster (3)
- 数据结构 (2)
- sqlserver (1)
- tomcat (2)
- swing (1)
- servlet (1)
- hibernate (1)
- firefox (1)
- Java-Puzzlers (1)
- Wicket (2)
- mysql (10)
- windows (5)
- Webwork (1)
- struts2 (1)
- Seam (2)
- jboss (1)
- idea (6)
- 分布计算 (3)
- Python-Django (7)
- Hadoop (1)
- 工具 (3)
- Tokyo Tyrant (2)
- Comet (1)
- android (115)
- 音乐 (6)
- cxf (1)
- mqtt (1)
最新评论
-
hesai_vip:
学习了,感谢
gradlew wrapper使用下载到本地的gradle.zip文件安装。 -
imknown:
姚瑶大坏蛋 写道我也遇到了这个,用你这个方法,导致下拉刷新不起 ...
解决android-Ultra-Pull-To-Refresh下拉刷新组件中嵌套ViewPager的一个bug -
姚瑶大坏蛋:
我也遇到了这个,用你这个方法,导致下拉刷新不起作用了,你遇到过 ...
解决android-Ultra-Pull-To-Refresh下拉刷新组件中嵌套ViewPager的一个bug -
寐语者:
LeaderElection(String zookeeper ...
使用Zookeeper来为你的程序加上Leader Election的功能。 -
fyc0109:
博主, 安装了一部分还是报这个错误!FAILURE: Buil ...
gradlew wrapper使用下载到本地的gradle.zip文件安装。
导入的blog格式乱了,大家请看我msn space blog:http://dengyin2000.spaces.live.com/blog/cns!AF4AB52B167D7EE7!165.entry
Tapestry Table组件提供了分页的功能, 但是以前以为它只能是一次性的吧所有元素都fetch出来,然后把这些元素交给Table去处理。错了。 其实Tapetry的Table组件太强大了, 它已经把这个问题考虑了。只fetch当前页的数据。
以前做从数据库中查找数据 然后再分页时, 都是使用For 或者 Foreach组件,然后自己写一个PageNavigation组件(用于显示第几页 有多少页),还有ColumnSort组件。 其实Table已经把这些都写好。而且每次写分页时都非常麻烦。 要注意的东西太多了。
我花了 大概半天的时间看了Table组件的实现。 其实Table组件的核心是这些组件(Table FormTable是由下列这些组件组合而成的)
TableView 采集Table需要的信息, Source Column etc
TableColumns 显示Table 表头的信息
TableFormRows 象For组件一样list 每行的内容(用在Form中,可以提交数据)
TableRows 象For组件一样list 每行的内容(不用在Form中)
TableValues 应该被TableRows或TableFormRows包含, 每行的值
TablePages 显示Page Navigation
TableFormPages 显示Page Navigation(在Form里)
详细信息可以结合WorkBench的Table例子看Table FormTable的源码, 应该能对Table有个比较深入的理解。
下面说说怎么让Table fetch当前页面所需的数据。不知道大家有没有注意到TableView的source属性:
source
Object[]
Collection
Iterator
IBasicTableModel
in You must provide either both source and columns parameters or the tableModel parameter The data to be displayed by the component. This parameter must be used in combination with the columns parameter. The parameter must be an array of values, a collection, an iterator, or an object implementing the IBasicTableModel interface.
我们一般都是使用Object[] Collection 和 Iterator作为table的source, 有没有注意IBasicTableModel呢? 我们先看看这个接口。
package org.apache.tapestry.contrib.table.model;
import java.util.Iterator;
/**
* A simplified version of the table model that concerns itself only with
* providing the data on the current page.
*
* @author mindbridge
* @since 3.0
*/
public interface IBasicTableModel
{
/**
* Returns the number of all records
* @return the number of all rows
**/
int getRowCount();
/**
* Returns the rows on the current page.
* @param nFirst the index of the first item to be dispayed
* @param nPageSize the number of items to be displayed
* @param objSortColumn the column to sort by or null if there is no sorting
* @param bSortOrder determines the sorting order (ascending or descending)
**/
Iterator getCurrentPageRows(int nFirst, int nPageSize, ITableColumn objSortColumn, boolean bSortOrder);
}
是不是有些清晰了呢? 两个方法, 没错就是上面javadoc上面说的那样。 我们返回一个实现了IBasicTableModel的类就能做到Fetch当前页的数据: 我做了一个小例子基本包括了Table的用法。我也是仿照WorkBench的Table的例子,但是我用的是Fetch当前页面的Locale,还写了一个自定义Column。 如下(注意加粗的部分):
TablePage.html
border@Border" subTitle="Tapestry">
source="ognl:model"
columns="literal: !locale:toString(), !language:displayLanguage, !country:displayCountry,
!variant:displayVariant, !isoLanguage:ISO3Language, !isoCountry:ISO3Country, =displayNameColumn"
pageSize="ognl:7"
>
rows@contrib:TableRows" row="ognl:currLocale">
TablePage.java
package com.dengyin.tapestry.pages;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.apache.tapestry.annotations.InitialValue;
import org.apache.tapestry.annotations.Meta;
import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.contrib.table.model.IBasicTableModel;
import org.apache.tapestry.contrib.table.model.ITableColumn;
import org.apache.tapestry.contrib.table.model.simple.ITableColumnEvaluator;
import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumn;
import com.dengyin.tapestry.DemoBasePage;
@Meta(
{ "anonymous-access=true", "admin-page=false" })
public abstract class TablePage extends DemoBasePage {
@Persist("session")
@InitialValue("new java.util.HashSet()")
public abstract Set<locale> getSelectedLocales();
public abstract void setSelectedLocales(Set<locale> set);
publicabstract Locale getCurrLocale();
@InitialValue("new java.util.HashSet()")
public abstract Set<locale> getListItems();
public abstract void setListItems(Set<locale> set);
public boolean getCheckboxSelected(){
return getSelectedLocales().contains(getCurrLocale());
}
public void setCheckboxSelected(boolean checked){
Set<locale> selectedLocales = getSelectedLocales();
if (checked){
selectedLocales.add(getCurrLocale());
}else{
selectedLocales.remove(getCurrLocale());
}
//make persist
setSelectedLocales(selectedLocales);
}
public ITableColumn getDisplayNameColumn(){
return new SimpleTableColumn("displayName", "displayName", new ITableColumnEvaluator(){
private static final long serialVersionUID = 6228368700745851970L;
public Object getColumnValue(ITableColumn objColumn, Object objRow) {
Locale locale = (Locale) objRow;
return locale.getDisplayName();
}
}, false
);
}
public IBasicTableModel getModel(){
return new IBasicTableModel(){
public int getRowCount() {
return Locale.getAvailableLocales().length;
}
public Iterator getCurrentPageRows(int nFirst, int nPageSize, ITableColumn objSortColumn, boolean bSortOrder) {
int count = Locale.getAvailableLocales().length;
int begInIndex = nFirst; //nFirst the index of the element. not the page index
int endIndex = nFirst + nPageSize -1;
//if the last page don&apost contain pageSize&aposs elements, it will throw ArrayIndexOutOfBoundsException.
// so we need to catch this.
if (endIndex > count -1){
endIndex = count -1;
}
List<locale> result = new ArrayList<locale>();
for(int i = begInIndex; i<=endIndex; i++ ){
result.add(Locale.getAvailableLocales()[i]);
}
return result.iterator();
}
};</locale></locale>
}
public abstract Locale getItem();
public void listItems(){
setListItems(getSelectedLocales());
}
}</locale></locale></locale></locale></locale>
在getCurrentPageRows 方法中我们可以通过ITableColumn objSortColumn 去进行排序(当有需要排序时这个参数不为null), bSortOrder 为是升序还是降序排列。我们可以通过objSortColumn得到需要排序的字段, bSortOrder 是按种方式排序, 我们就可以构造SQL语句,把排序的工作交给数据库, 然后得到一个排好序的List, 然后在截取这个List中当前页的值就行了。
发表评论
-
解决用run-jetty-run锁住css,js文件的问题。
2008-09-25 17:46 6659开发中用run-jetty-run插件启动jetty调式tap ... -
打造Tapestry5中的智能的错误页面。
2008-09-18 15:59 1815我们一般需要为生产和开发环境准备两套error page。 t ... -
T5这么多的Page Lifecycle method, 应该怎样使用?
2008-09-04 18:18 2405Tapestry5种大概有以下Page ... -
扔掉T5复杂的Grid组件,打造自己灵活的支持分页排序组件。
2008-01-03 13:12 2884Grid算是比较T5中较复杂的一个组件,我也有篇介绍Grid怎 ... -
对Tapestry的一点思考。
2007-12-27 23:33 4104Tapestry5已经开发了蛮久了。 听说最近要发布T5.0. ... -
Tapestry 5.0.5 bug, TAPESTRY-1648
2007-08-26 12:20 2637有一个domian object, 其中有个property的 ... -
T5 技巧 3:使用“t::body”进行布局。
2007-08-25 00:08 2952现在正在使用T5开发一个小项目。 因为现在T5还正处于发展中。 ... -
T5 技巧 2:为Grid组件的每一行增加“删除/修改”链接。
2007-08-21 12:35 9047现在正在使用T5开发一个小项目。 因为现在T5还正处于发展中。 ... -
T5 技巧 1:解决Form的提交乱码问题。
2007-08-21 10:58 8387现在正在使用T5开发一个小项目。 因为现在T5还正处于发展中。 ... -
T5 developing with WTP and TOMCAT
2007-08-16 09:50 2752以下是我发给tapestry右键列表的问题。 现在还没有人回复 ... -
Wicket Vs Tapestry
2007-05-11 14:41 7490我是一个tapestry的老用户。从学校毕业就开始使用tape ... -
Tapestry5中 page template不能reload。
2007-05-09 13:50 5895上午看了下tapestry5的文档,然后自己写了个简单的页面。 ... -
Tapestry 显示图片
2006-03-06 16:00 2785导入的blog格式乱了,请看我的msn spaces blog ... -
@Persist 解释
2006-03-08 16:00 3160a) @Persist("client") ... -
原创 Tapestry的Cache组件
2006-12-22 11:24 5098有许多页面的一部分或者这个页面是很少更新的,他们通常是由外部文 ...
相关推荐
总结来说,Tapestry的Table和Tree组件提供了强大而灵活的数据展示工具,它们不仅简化了数据的布局和交互,还允许开发者专注于业务逻辑,提高开发效率。通过深入学习这两个组件,你将在构建复杂Web应用时更加得心应手...
Tapestry 5 是一个强大的 Java Web 应用程序开发框架,它强调组件化、模块化以及声明式编程模型,从而提高开发效率和代码可维护性。下面我们将详细讨论如何在 Tapestry 5 中自定义邮件组件。 首先,自定义组件通常...
一个关于table在tapestry里应用的例子
Tapestry是一个强大的Java web应用程序框架,由Apache软件基金会维护。它以其组件化、类型安全和高度可扩展性而闻名。在本篇文章中,我们将深入探讨Tapestry的页面编辑组件,以及如何利用这些组件创建交互式的用户...
在实际应用中,封装GridPanel组件可以提高开发效率,因为它允许开发者用熟悉的Tapestry语法来创建和管理数据网格,同时享受到ExtJS提供的强大功能。这包括但不限于数据分页、排序、过滤、行选择、编辑和自定义列显示...
`form`组件用于处理用户输入,创建表单并进行验证,而`table`组件则用于展示数据,支持分页和排序功能,这对于实现增删改查功能非常有用。 其次,Hibernate是一个流行的Java对象关系映射(ORM)框架,它简化了与...
介绍Tapestry组件的使用和功能。内容还行,使用初学者入门。
Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它提供了一种基于组件的模型来构建动态、数据驱动的Web应用。本教程将帮助初学者了解Tapestry的基本概念,带你逐步入门并掌握其核心组件的使用...
分页组件可以与数据源(如数据库查询结果)集成,提供上一页、下一页等导航功能,并且可以自定义每页显示的条目数量。 8. **依赖注入**:Tapestry支持依赖注入(DI),这是一种设计模式,可以简化对象之间的耦合。...
tapestry部分组件绑定参数的列表!
Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它强调了组件化、模块化和可重用性,使得开发复杂的Web应用变得更加简单。本文将深入介绍Tapestry 4的相关知识点。 1. **组件化编程**: ...
1. **页面和组件的生命周期**:每个Tapestry 3应用由一系列页面组成,页面又包含多个组件。Tapestry管理这些页面和组件的创建、初始化、渲染和销毁过程。 2. **模板和元数据**:Tapestry使用HTML模板定义页面布局,...
2. **组件实例化**:根据页面和组件定义,Tapestry 创建必要的组件实例。 3. **状态管理**:Tapestry 自动处理组件状态的保存和恢复,确保在多个请求间保持一致性。 4. **渲染**:Tapestry 将组件渲染成HTML响应,...
Tapestry框架本身包含大量的类和接口,但开发者通常只需要了解和使用一小部分核心组件。例如,`IComponent`和`IPage`是两个关键接口,定义了组件和页面的行为。开发者通常不会直接实现这些接口,而是继承如`...
这些组件通过事件驱动的方式进行交互,当用户触发某个事件时,Tapestry会自动调用相应的事件处理方法。 1. **页面到组件的映射**:Tapestry将HTML页面转换为一系列的组件。这些组件之间通过特定的规则进行通信,...
- **用途:**创建一个更轻量级的表格组件,适用于显示大量数据时减少资源消耗。 - **实现步骤:** 1. 定义组件类。 2. 实现数据加载逻辑。 3. 设计模板。 **2. 带长度效验的TextArea:** - **用途:**创建一个...
为优化性能,可以只加载当前页的数据,减少服务器负担。 **5.12 使用缓存** 缓存策略可以显著提升数据加载速度,减少数据库查询次数。 **5.13 在table中加入按钮** 按钮可以添加在表格中,如编辑、删除操作,实现...
1. Tapestry 当前是 3.0 版本,它是一个成熟的框架。 2. Tapestry 一直关注的是产生动态的 HTML 页面。 3. Tapestry 也支持了大量的 XHTML,WML 和其它类型的标签。 Tapestry 的技术特点: 1. Tapestry 使用组件...
Tapestry的组件系统非常强大,允许开发者定义自己的可复用组件,每个组件都可以有自己的属性、事件和行为。这些组件可以通过简单的XML标记(如`<span jwcid="@Insert" ...>`)在页面模板中使用。ognl(Object-Graph ...
Tapestry是一个强大的Java Web应用程序框架,由Apache软件基金会维护。它强调组件化、模块化和松耦合的开发方式,使得开发人员可以构建出高效、可维护的Web应用。以下是对Tapestry源码、API及相关库的详细解读: 1....