先解释一下标题的意思。如果在runtime的时候生成了一张表(见博文:
利用oracle的存储过程来建表、
Hibernate调用存储过程 分享),即动态表,此时无法做 ORM映射,因此无法创建pojo对象等。如果在这种情况下,仍然想在页面中通过<t:dataTable>标签来显示动态表中的内容,可通过下面的方法:
页面:
DAO:
public class TableDAO{
public List getRecordList(String tablename)
{
SQLQuery query = session.createSQLQuery("select * from "+tablename);
List list = query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
.list();//把查询结果转换成map类型
return list;
}
public List getRecordHeaderList()
{
}
}
public class TableBean{
private DataModel recordModel;
private DataModel headerModel;
private int labelIndex = 0;
public DataModel getHeaderModel()
{
if(headerModel == null)
{
headerModel =new ListDataModel();
headerModel.setWrappedData(getColumnHeaderList());
}
return headerModel;
}
public DataModel getRecordModel() {
if(recordModel== null)
{
recordModel=new ListDataModel();
recordModel.setWrappedData(getRecordList());
}
return recordModel;
}
public String getColumnValue()
{
if(recordModel == null) recordModel = getRecordModel();
if(recordModel.isRowAvailable())
{
Map map = (Map)recordModel.getRowData();
List list = getColumnHeaderList();
String key = list.get(labelIndex)).toString();
Object o = map.get(key);
if(o == null) o = "";
labelIndex++;
if(labelIndex == map.size()) labelIndex = 0;
return o.toString();
}
return null;
}
}
页面:
<t:dataTable id="recorddata"
var="record"
value="#{tableBean.recordModel}"
preserveDataModel="false"
rows="100"
>
<t:columns value="#{tableBean.headerModel}" var="columnHeader">
<f:facet name="header">
<h:outputText value="#{columnHeader.cname}" />
</f:facet>
<h:outputText value="#{tableBean.columnValue}" />
</t:columns>
</t:dataTable>
这个方法主要是利用了Myfaces的<t:columns>组件来实现动态表格的生成。