http://boogie.iteye.com/blog/47999
在我开发的一个通用查询项目中想把查询结果集的显示部分采用eXtremeComponents组件来处理,但是碰到个问题,就是组件预先并不知道查询结果的列名,也就是必须解决Column列的动态显示问题。
有一种方法就是通过在jsp页面里罗列一下,但是总感觉不舒服,查文档发现eXtremeComponents有一接口AutoGenerateColumns可实现此功能,以下为具体实现步骤:
一、在应用的servlet(或struts action等)里(如sqlAction.do)实现根据SQL语句的运行结果获取字段名称列表(fieldnames)和查询结果集(results)并将其放入httpRequest的属性中
List fieldnames = 实现[获取字段名称列表]方法;
List results = 实现[获取查询结果集]方法;
httpRequest.setAttribute("fieldnames", fieldnames);
httpRequest.setAttribute("results", results);
results将作为eXtremeTable组件中属性items的值,fieldnames将用来迭代构造Column对象
二、编写类AutoGenerateColumnsImpl实现org.extremecomponents.table.core.AutoGenerateColumns接口
package org.boogie.sql.common.ec;
import java.util.Iterator;
import java.util.List;
import org.extremecomponents.table.bean.Column;
import org.extremecomponents.table.core.AutoGenerateColumns;
import org.extremecomponents.table.core.TableModel;
public class AutoGenerateColumnsImpl implements AutoGenerateColumns {
public void addColumns(TableModel model) {
List fieldnames = (List) model.getContext().getRequestAttribute(
"fieldnames");
Iterator iterator = fieldnames.iterator();
while (iterator.hasNext()) {
String fieldname = (String) iterator.next();
Column column = model.getColumnInstance();
column.setProperty(fieldname);
// column.setCell((String) columnToAdd.get(CELL));
model.getColumnHandler().addAutoGenerateColumn(column);
}
}
}
AutoGenerateColumns接口只有一个方法addColumns供实现,在此方法中通过传入的TableModel型参数model可从其Context中获取到httpRequest中的fieldnames属性值,然后根据fieldnames列表迭代构造对应Column后添加到model中
三、在显示页文件的eXtremeTable中,配置TableTag的属性items值为results,配置ColumnTag的属性autoGenerateColumns值为类AutoGenerateColumnsImpl的全路径
<ec:table
items="results"
var="result"
action="${pageContext.request.contextPath}/sqlAction.do"
imagePath="${pageContext.request.contextPath}/images/table/*.gif"
title="查询结果"
width="100%"
rowsDisplayed="5"
>
<ec:parameter name="method" value="ec"/>
<ec:row>
<ec:columns autoGenerateColumns="org.boogie.sql.common.ec.AutoGenerateColumnsImpl"/>
</ec:row>
</ec:table>