`
ruruhuang
  • 浏览: 193232 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Tapestry Table 组件的强大(分页查询时只fetch当前页的数据)。

阅读更多

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
<html jwcid="$content$">
<body jwcid="&lt;/font&gt;&lt;a href=" mailto:border@border"="">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">
           
           
          
           
           
          
   

          

          

  

 
 



 
 
 

 


</body>
</html>
 
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();
   }
  
  };

 }
 public abstract Locale getItem();
 
 public void listItems(){
  setListItems(getSelectedLocales());
 }
}

getCurrentPageRows 方法中我们可以通过ITableColumn objSortColumn 去进行排序(当有需要排序时这个参数不为null), bSortOrder 为是升序还是降序排列。我们可以通过objSortColumn得到需要排序的字段, bSortOrder 是按种方式排序, 我们就可以构造SQL语句,把排序的工作交给数据库, 然后得到一个排好序的List, 然后在截取这个List中当前页的值就行了。

分享到:
评论

相关推荐

    Tapestry中的Table和Tree的完整教程

    总结来说,Tapestry的Table和Tree组件提供了强大而灵活的数据展示工具,它们不仅简化了数据的布局和交互,还允许开发者专注于业务逻辑,提高开发效率。通过深入学习这两个组件,你将在构建复杂Web应用时更加得心应手...

    tapestry5 自定义组件

    Tapestry 5 是一个强大的 Java Web 应用程序开发框架,它强调组件化、模块化以及声明式编程模型,从而提高开发效率和代码可维护性。下面我们将详细讨论如何在 Tapestry 5 中自定义邮件组件。 首先,自定义组件通常...

    tapestry table

    一个关于table在tapestry里应用的例子

    tapestry页面编辑组件

    Tapestry是一个强大的Java web应用程序框架,由Apache软件基金会维护。它以其组件化、类型安全和高度可扩展性而闻名。在本篇文章中,我们将深入探讨Tapestry的页面编辑组件,以及如何利用这些组件创建交互式的用户...

    tapestry4.02中封装ext的GridPanel组件

    在实际应用中,封装GridPanel组件可以提高开发效率,因为它允许开发者用熟悉的Tapestry语法来创建和管理数据网格,同时享受到ExtJS提供的强大功能。这包括但不限于数据分页、排序、过滤、行选择、编辑和自定义列显示...

    tapestry hibernate Spring应用及组件的使用

    `form`组件用于处理用户输入,创建表单并进行验证,而`table`组件则用于展示数据,支持分页和排序功能,这对于实现增删改查功能非常有用。 其次,Hibernate是一个流行的Java对象关系映射(ORM)框架,它简化了与...

    Tapestry的组件及功能

    介绍Tapestry组件的使用和功能。内容还行,使用初学者入门。

    Tapestry简单入门.rar_java Tapestry_tapestry

    Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它提供了一种基于组件的模型来构建动态、数据驱动的Web应用。本教程将帮助初学者了解Tapestry的基本概念,带你逐步入门并掌握其核心组件的使用...

    Tapestry通用WEB框架

    分页组件可以与数据源(如数据库查询结果)集成,提供上一页、下一页等导航功能,并且可以自定义每页显示的条目数量。 8. **依赖注入**:Tapestry支持依赖注入(DI),这是一种设计模式,可以简化对象之间的耦合。...

    tapestry组件

    tapestry部分组件绑定参数的列表!

    tapestry官方中文文档

    Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它强调了组件化、模块化和可重用性,使得开发复杂的Web应用变得更加简单。本文将深入介绍Tapestry 4的相关知识点。 1. **组件化编程**: ...

    tapestry3开发指南,带tapestry3所有jar包

    1. **页面和组件的生命周期**:每个Tapestry 3应用由一系列页面组成,页面又包含多个组件。Tapestry管理这些页面和组件的创建、初始化、渲染和销毁过程。 2. **模板和元数据**:Tapestry使用HTML模板定义页面布局,...

    关于Tapestry的一些个人总结

    这些组件通过事件驱动的方式进行交互,当用户触发某个事件时,Tapestry会自动调用相应的事件处理方法。 1. **页面到组件的映射**:Tapestry将HTML页面转换为一系列的组件。这些组件之间通过特定的规则进行通信,...

    tapestry 实例

    2. **组件实例化**:根据页面和组件定义,Tapestry 创建必要的组件实例。 3. **状态管理**:Tapestry 自动处理组件状态的保存和恢复,确保在多个请求间保持一致性。 4. **渲染**:Tapestry 将组件渲染成HTML响应,...

    Tapestry

    Tapestry框架本身包含大量的类和接口,但开发者通常只需要了解和使用一小部分核心组件。例如,`IComponent`和`IPage`是两个关键接口,定义了组件和页面的行为。开发者通常不会直接实现这些接口,而是继承如`...

    Tapestry开发

    - **用途:**创建一个更轻量级的表格组件,适用于显示大量数据时减少资源消耗。 - **实现步骤:** 1. 定义组件类。 2. 实现数据加载逻辑。 3. 设计模板。 **2. 带长度效验的TextArea:** - **用途:**创建一个...

    Tapestry字典

    为优化性能,可以只加载当前页的数据,减少服务器负担。 **5.12 使用缓存** 缓存策略可以显著提升数据加载速度,减少数据库查询次数。 **5.13 在table中加入按钮** 按钮可以添加在表格中,如编辑、删除操作,实现...

    tapestry学习入门资料

    1. Tapestry 当前是 3.0 版本,它是一个成熟的框架。 2. Tapestry 一直关注的是产生动态的 HTML 页面。 3. Tapestry 也支持了大量的 XHTML,WML 和其它类型的标签。 Tapestry 的技术特点: 1. Tapestry 使用组件...

    Tapestry4.1.2 入门-介绍

    Tapestry的组件系统非常强大,允许开发者定义自己的可复用组件,每个组件都可以有自己的属性、事件和行为。这些组件可以通过简单的XML标记(如`&lt;span jwcid="@Insert" ...&gt;`)在页面模板中使用。ognl(Object-Graph ...

    tapestry源码 api等

    Tapestry是一个强大的Java Web应用程序框架,由Apache软件基金会维护。它强调组件化、模块化和松耦合的开发方式,使得开发人员可以构建出高效、可维护的Web应用。以下是对Tapestry源码、API及相关库的详细解读: 1....

Global site tag (gtag.js) - Google Analytics