- 浏览: 423479 次
- 性别:
文章分类
最新评论
-
wrw_ahut:
你这个怎么停下来?怎么跳转activity
Android启动界面实现 -
huiqoo:
高仿UC半透明MENU菜单(有图有真相) -
wenzhixin:
多谢分享~
Android启动界面实现 -
orange9711:
学习学习
Android启动界面实现 -
qinweiping:
问下楼主 好像这个反编译 只能看到程序的主体结构吧 还是和源程 ...
APK反编译利器Apktool下载及用法介绍
1. 引言
在你需要处理大量数据时你应该考虑使用eXtremeTable的Limit特性。Limit这个名字来自MySQL的limit 命令,Limit接口的目的就是如何对表的结果集进行limit处理。Limit实现知道当排序、过滤、分页、导出时,用户如何与表互相作用。有了这些信息你 将能够使用可能是最有效的方式显示正确的过滤、排序后的请求页面。
为了示范Limit特性,我将要做的工作将分解为JSP、Controller、Service和DAO。这示范了一种使用分层的方式来处理 Limit。你可以根据自己的需要来增加或减少层。本示例也使用了Spring框架来重新得到使用Spring的JDBC取得的数据,因此你的代码看起来可能有点不同。eXtremeTable的一个特点就是不依赖任何框架和容器。
1.1. JSP
为了使用Limit特性,eXtremeTable需要使用limit特定的RetrieveRowsCallback、 FilterRowsCallback和SortRowsCallback接口。eXtremeComponents提供了每个接口的一个实现,可以简单地通过设置每个属性值为limit来简单来使用。
<ec:table items="presidents" retrieveRowsCallback="limit" filterRowsCallback="limit" sortRowsCallback="limit" view="limit" > ...
另外视图属性参照一个名为limit的定制视图。这是一个简单修改默认eXtremeTable视图,不包含最后页工具条的实现。这仅仅关系到你是否能取得确切需要的行。 一些数据库例如Oracle和MySQL都提供了一种得到确定行的特性,但是,其他的数据库例如:Sybase没有提供特性。在我的示例中我考虑最坏的情况你的数据库不支持这种特性。
即使你的数据库不提供取得特定行的特性,当你考虑用户如何和表协同工作时,Limit仍然非常有意义。用户通常会对一些数据进行排序、过滤和分页。 这个例子中15条数据构成一页,第一页需要15条数据,第二页需要30条数据,第三页需要45条数据,以此类推。在经过一段时间分页后,他们常常使用过滤来提炼数据。 即使他们不这样做,他们也必须在此之前对大量的数据进行分页,这将影响效率。当然如果允许用户点击最后页,那么所有的数据都将被取出,这将非常影响效率。
1.2. Controller
提示:Spring框架的Controller和Struts框架的Action非常相像。
controller首先需要创建一个Limit。为了完成这个你需要得到一些关于Context和LimitFactory的帮助。
Context context = new HttpServletRequestContext(request); LimitFactory limitFactory = new TableLimitFactory(context); Limit limit = new TableLimit(limitFactory);
Context是一个处理取得属性的接口,LimitFactory使用Context来找出用户如何和eXtremeTable交互。 然后Limit使用LimitFactory来组装自己。
为了初始化Limit,它将包含所有的有用的信息。这些信息包括数据将被如何排序和过滤,哪一页将被显示和是否允许被导出。
然而,Limit仍然需要得到行的信息,这样正确的信息页面才能被显示给用户。行信息包括开始行、结束行、当前显示行。 controller必须从service得到这些信息,而Service将从dao中得到这些信息。这里我只给出Controller端的代码。
int totalRows = presidentsService.getTotalPresidents(limit.getFilterSet(), limit.isExported()); limit.setRowAttributes(totalRows, defaultRowsDisplayed);
limit需要得到所有的行来得到行的信息。service需要知道那些被过滤,不管这些数据是否要导出。为了设置行信息,默认的一页显示的行数需要被设置。 这可以通过对TableTag的rowsDisplayed属性设置一个确定的数值来实现。
现在我们只需要从services得到Collection数据。
Collection presidents = presidentsService.getPresidents(limit.getFilterSet(), limit.getSort(), limit.getRowEnd());
因为limit已经包含所有信息,这将十分容易。所有需要做的就是传入过滤器,排序和最后行的信息。 最后要做的是将Collections和totalRow这些信息传送回JSP以便eXtremeTable知道如何显示这些信息。
request.setAttribute("presidents", presidents); request.setAttribute("totalRows", new Integer(totalRows));
1.3. Service
service需要和dao进行交互来得到总行数和Collection。
1.3.1. 取得总行数
controller需要到第一条信息就是总行数。
public int getTotalPresidents(FilterSet filterSet, boolean isExported) { String totalQuery = presidentsDao.getTotalPresidentsQuery(); String modTotalQuery = filterQuery(filterSet, totalQuery); int totalRows = presidentsDao.getTotalPresidents(modTotalQuery); if (isExported && totalRows > maxExportRows) { totalRows = maxExportRows; } return totalRows; }
service和dao一起来过滤结果集,它的工作方式是在Where语句后面增加更多的AND语句来修改查询字符串。为此,你需要和Limit FilterSet一起工作。
FilterSet是一个过滤器对象数组,一个过滤器包括一个bean property和这个过滤器的值。或者,简单的说就是用户想要过滤的行和他们输入的值。这使得它非常容易交互。service只需要迭代所有的 FilterSet并调用dao来拼接查询语句。(译者注:过滤的实现方式是:在Where后面增加And语句来改变查询语句以达到对数据进行过滤的效果)
private String filterQuery(FilterSet filterSet, String query) { if (!filterSet.isFiltered() || filterSet.isCleared()) { return query; } Filter filters[] = filterSet.getFilters(); for (int i = 0; i < filters.length; i++) { Filter filter = filters[i]; String property = filter.getProperty(); String value = filter.getValue(); query = presidentsDao.filterQuery(query, property, value); } return query; }
query修改包括了filter信息,总行数。在一些情况下这就足够,但是当用户导出数据时仍然存在一个潜在的问题。为了保持高效 service不允许导出超出一个最大行数的数据。
1.3.2. 取得Collection
controller需要到第二条信息就是Collection。
public Collection getPresidents(FilterSet filterSet, Sort sort, int rowEnd) { String patientsQuery = presidentsDao.getPresidentsQuery(); String modPatientsQuery = filterQuery(filterSet, patientsQuery); modPatientsQuery = sortQuery(sort, modPatientsQuery); modPatientsQuery = presidentsDao.limitQuery(rowEnd, modPatientsQuery); return presidentsDao.getPresidents(modPatientsQuery); }
和前面一样,service和dao一起来过滤结果集。
另外query字符串需要扩展ORDER BY语句以便数据按照正确的方式进行排序。Sort包含一个bean property和 sortOrder值(正序还是逆序)。service仅仅需要使用Sort来调用dao。
private String sortQuery(Sort sort, String query) { if (!sort.isSorted()) { String defaultSortOrder = presidentsDao.getDefaultSortOrder(); if (StringUtils.isNotBlank(defaultSortOrder)) { return query + defaultSortOrder; } return query; } String property = sort.getProperty(); String sortOrder = sort.getSortOrder(); return presidentsDao.sortQuery(query, property, sortOrder); }
query字符串最后需要的修改就是增加数据库特别的指令来limit将要被返回的结果集。这就是limitQuery() 方法的作用。
1.4. DAO
dao为service负责底层数据工作。
1.4.1. 定义Query字符串
为了真正理解dao,query字符串需要被展示。
这就是得到数据的presidents query字符串:
private final static String presidentsQuery = " SELECT " + " president_id presidentId, " + " first_name firstName, " + " last_name lastName, " + " nick_name nickName, " + " concat(first_name, ' ',last_name) fullName, " + " term, " + " born, " + " died, " + " education, " + " career, " + " political_party politicalParty " + " FROM presidents ";
这是得到总行数的query字符串:
private final static String totalPresidentsQuery = " SELECT count(*) FROM presidents ";
1.4.2. Filter 和 Sort Query 字符串
两个最有趣的方法就是过滤和排序。
filter看起来像这样:
public String filterQuery(String query, String property, String value) { StringBuffer result = new StringBuffer(query); if (query.indexOf("WHERE") == -1) { result.append(" WHERE 1 = 1 "); //stub WHERE clause so can just append AND clause } if (property.equals("fullName")) { result.append(" AND concat(first_name, ' ',last_name) like '%" + value + "%'"); } else if (property.equals("nickName")) { result.append(" AND nick_name like '%" + value + "%'"); } else { result.append(" AND " + property + " like '%" + value + "%'"); } return result.toString(); }
filterQuery()方法需要增加正确的AND语句到query字符串。
sort看起来非常类似:
public String sortQuery(String query, String property, String sortOrder) { StringBuffer result = new StringBuffer(query + " ORDER BY "); if (property.equals("fullName")) { result.append("concat(first_name, ' ',last_name) " + sortOrder); } else { result.append(property + " " + sortOrder); } return result.toString(); }
sortQuery()方法需要增加正确的ORDER BY语句到query字符串。
1.4.3. Limit Query String
现在query字符串修改能够正确的进行filter和sort,它还需要修改以便只取页面显示相关的数据。MySQL为s the limit命令。
public String limitQuery(int rowEnd, String query) { return query + " limit " + rowEnd; }
1.4.4. 取回总行数和Collection.
service需要的唯一东西就是:总行数和Collection。
public Collection getPresidents(final String query) { return jdbcTemplate.query(query, new ResultReader() { List results = new ArrayList(); public List getResults() { return results; } public void processRow(ResultSet rs) throws SQLException { President president = new President(); president.setPresidentId(new Integer(rs.getInt("presidentId"))); president.setFirstName(rs.getString("firstName")); president.setLastName(rs.getString("lastName")); president.setNickName(rs.getString("nickName")); president.setFullName(rs.getString("fullName")); president.setTerm(rs.getString("term")); president.setBorn(rs.getDate("born")); president.setDied(rs.getDate("died")); president.setEducation(rs.getString("education")); president.setCareer(rs.getString("career")); president.setPoliticalParty(rs.getString("politicalParty")); results.add(president); } }); } public int getTotalPresidents(final String query) { return jdbcTemplate.queryForInt(query); }
ResultReader是一个帮助处理JDBC查询的Spring特殊类,作为一个callback来处理JDBC ResultSet。jdbcTemplate是对JDBC连接的抽象。
1.4.5. 默认的Sort顺序
最后,这是service需要的默认sort顺序:
public String getDefaultSortOrder() { return " ORDER BY concat(first_name, ' ', last_name) "; }
发表评论
-
Android Launcher一些资源
2012-01-10 16:03 1605棒槌网@Android相关文章推荐: rjJ-ZRs\ An ... -
卡刷rom固件update.zip的制作教程
2011-12-29 19:44 19278对于第三方ROM来讲,通常都包括两部分,一个recover ... -
APK反编译利器Apktool下载及用法介绍
2011-12-29 19:40 6521近期在研究rom过程中发现一个非常不错的软件,可以帮助我们把A ... -
Android版本检测\自动更新
2011-11-30 10:39 2763package com.hiyo.game.pdk.tool; ... -
高仿UC半透明MENU菜单(有图有真相)
2011-11-13 15:55 1960转载自:http://www.eoeandroid.com/ ... -
Android启动界面实现
2011-11-13 15:39 6799转载自:http://www.eoeandroid.com/t ... -
获取本机外网IP地址(External IP Address)
2010-12-15 22:45 6815import java.io.IOException; ... -
Red5+OpenOffice+OpenMeetings架设视频会议网络
2009-07-01 09:57 2251因工作需要,这两天弄了一个视频会议服务器。采用了flash流媒 ... -
J2EE or J2SE? JNDI works with both
2009-05-11 16:21 1528J2EE or J2SE? JNDI works with b ... -
脚本启动Java应用程序(Windows/Linux)
2009-05-08 16:40 36981、新建文件夹myapp,放你的应用; 2、将你的程序 ... -
破解Java程序
2007-12-13 17:36 1900第一步是定位,这也是 ... -
WebSphere 应用服务器环境搭建实践指南
2007-08-22 18:20 5229Dan Wu (wdan@cn.ibm.com), 高级信息工 ... -
beanutils研究心得
2007-01-23 15:47 2167Beanutils用了魔术般的反射技术,实现了很多夸张有用的功 ... -
apache-common功能列表
2007-01-23 15:16 4995... -
Apache Commons工具集简介[转载]
2007-01-21 02:20 5611js 代码 <script ... -
利用servlet生成简单的验证码
2007-01-21 01:47 1619在web.xml配置: 代码 < ... -
实战篇:设计自己的Annotation
2007-01-21 01:44 1402From:http://lighter.iteye.com 第 ... -
JSTL 入门: 表达式语言
2007-01-15 11:23 1414JSP 标准标记库(JSP Stand ... -
extremeTable介绍
2007-01-10 11:14 46181、何为 extremeTable,又一个开源taglib e ... -
ExtremeTable使用指南:拦截器使用指南
2007-01-10 10:45 20801. 引言 拦截特性被用在运行时需要修改属性值的时候,它使得改 ...
相关推荐
### eXtremeTable使用指南:深入理解与配置 #### 引言 eXtremeTable作为eXtremeComponents系列中的核心组件之一,专为高级数据展示而设计,尤其适用于表格形式的数据呈现。该开源项目由Jeff Johnston领导的ECCN...
总的来说,"eXtremeTable中文文档"是一份全面的指南,旨在帮助用户深入理解和使用eXtremeTable系统。无论你是初次接触还是经验丰富的开发者,这份文档都将是你探索和驾驭eXtremeTable的强大工具。通过阅读这份PDF,...
这个压缩包“eXtremeTable的使用方法.rar”显然包含了关于如何有效利用eXtremeTable的相关指南,特别是通过包含的CHM文件“2008821161857.chm”,我们可以期待找到详细的文档和教程。 eXtremeTable的主要特点包括:...
根据提供的文档部分内容,我们可以推断出这是一篇关于 eXtremeTable 的中文文档,主要涉及该工具或系统的使用、配置以及相关技术细节。虽然原始文本包含大量的特殊字符和不可读部分,但仍然可以从其中提取出一些关键...
我也刚开始看,感觉是个好东东,大家多多交流
**eXtremeTable** 是一个专为Java Web开发设计的高效、易用的表格控件,它在处理大量数据时表现出色,尤其在数据分页和导出...对于从事Java Web开发的人员来说,掌握eXtremeTable的使用无疑是提升项目质量的有效途径。
这篇博客文章将带你深入了解 ExtremeTable 的核心特性和应用场景,同时提供了一份详细的用户指南——《eXtremeComponentsCN.pdf》,帮助开发者更好地理解和运用这个工具。 首先, ExtremeTable 的主要特点是其高效...
eXtremeTable分页控件完整例子包括了数据的分页、数据的Excel格式导出、数据的pdf电子书格式导出、数据的文本文件格式导出等功能,里面的源代码写得非常详细,好好看一下.... 功能强大,易于扩展的extremetable就是个...
eXtremeTable文档 eXtremeTable文档 eXtremeTable文档 eXtremeTable文档 eXtremeTable文档 eXtremeTable文档
### extremeTable:强大的数据展示工具 #### 一、概述 **extremeTable**是一款开源的JSP自定义标签库,其主要功能是通过表格形式来高效地展示数据。这款工具的最新版本为1.0.1-M1。作为一款类似于`displaytag`和`...
《eXtremeTable参考文档》是针对eXtremeComponents中的一款核心组件——eXtremeTable的详细指南。eXtremeComponents是一个开源项目,它为JavaServer Pages (JSP) 开发者提供了丰富的定制标签库,使得在Web应用开发中...
本教程详细介绍了eXtremeTable的配置、使用方法以及各种标签的功能,旨在帮助开发者充分利用其功能,实现高效、灵活的数据展示。 1. 配置 配置eXtremeTable需要满足以下先决条件: - Servlet 2.3或更高版本的服务器...
本教程将详细讲解如何使用Hibernate ORM框架结合ExtremeTable实现高效的分页查询。 Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者以面向对象的方式处理数据库操作,避免了直接编写SQL语句的繁琐。而...
#### 四、使用指南 ##### 4.1 快速入门 - **创建数据模型**:定义要展示的数据结构。 - **配置eXtremeTable**:在JSP页面中使用`<ec:table>`标签配置表格。 - **展示数据**:通过指定数据源和列定义来展示数据。 - *...
displayTag,extremeTable相关文章
总的来说,Spring MVC、Hibernate和ExtremeTable的结合使用,为开发基于Web的数据库应用提供了高效且灵活的解决方案。Spring MVC负责请求分发和业务逻辑处理,Hibernate处理数据库操作,而ExtremeTable则在前端展示...