大多數(shù)情況下你按照你需要的列來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)表。但是,有時(shí)候需要運(yùn)行時(shí)動(dòng)態(tài)生成一些列。
為了實(shí)現(xiàn)這點(diǎn),eXtremeTable需要使用ColumnsTag并設(shè)置autoGenerateColumns屬性。
AutoGenerateColumns為singleton并且不是線(xiàn)程安全的,因此不要定義任何類(lèi)變量。
ColumnsTag只有autoGenerateColumns這一個(gè)屬性。所有你必須做的就是實(shí)現(xiàn)AutoGenerateColumns接口,
并設(shè)置autoGenerateColumns屬性為類(lèi)的全路徑。
<ec:table
items="presidents"
action="${pageContext.request.contextPath}/autoGenerateColumns.run"
title="Presidents"
>
<ec:columns autoGenerateColumns="org.extremesite.controller.AutoGenerateColumnsImpl"/>
</ec:table>
AutoGenerateColumns接口只有一個(gè)方法:
public void addColumns(TableModel model);
你需要做的就是添加列(columns)到model里。最簡(jiǎn)單的示例如下:
public class AutoGenerateColumnsImpl implements AutoGenerateColumns {
public void addColumns(TableModel model) {
Iterator iterator = columnsToAdd().iterator();
while (iterator.hasNext()) {
Map columnToAdd = (Map) iterator.next();
Column column = new Column(model);
column.setProperty((String) columnToAdd.get(PROPERTY));
column.setCell((String) columnToAdd.get(CELL));
model.getColumnHandler().addAutoGenerateColumn(column);
}
}
}
示例中columnsToAdd()方法簡(jiǎn)單返回一個(gè)包含生成列(columns)需要的所有信息的集合。
作為參考,下面是我在eXtremeComponents網(wǎng)站實(shí)例中使用的columnsToAdd()方法:
private List columnsToAdd() {
List columns = new ArrayList();
columns.add(columnToAdd("fullName", "display"));
columns.add(columnToAdd("nickName", "display"));
columns.add(columnToAdd("term", "display"));
columns.add(columnToAdd("born", "date"));
columns.add(columnToAdd("died", "date"));
columns.add(columnToAdd("career", "display"));
return columns;
}
private Map columnToAdd(String property, String cell) {
Map column = new HashMap();
column.put(Column.PROPERTY, property);
column.put(Column.CELL, cell);
return column;
}
另外,我想聲明的是只創(chuàng)建列一次。eXtremeTable為了高效,不會(huì)每行創(chuàng)建一列,
而是通過(guò)循環(huán)持續(xù)插入新列值到已經(jīng)存在的列。記住TableModel能夠訪(fǎng)問(wèn)Context,因此
你可以在Controller(Spring)或Action(Struts)中定義樣式(look like)并通過(guò)request傳輸集合。
所以你得AutoGenerateColumns實(shí)現(xiàn)只需要構(gòu)建列(Columns)并添加到model.columns里。