众所周知,一般在JSF里对于数据表的读取显示都是在页面上写好一个dataTable然后再各个column中绑定各个item,如下所示:
<h:dataTable id="table" value="#{academicyearController.academicyearList}" first="0" rows="10" border="1" var="item">
<h:column>
<f:facet name="header">
<h:outputText value="学年名称"/>
</f:facet>
<h:commandLink action="#{academicyearController.getAcademicyear}">
<h:outputText value="#{item.yearname}"/>
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="是否有效"/>
</f:facet>
<h:selectBooleanCheckbox value="#{item.isvalid}" disabled="true" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="选择"/>
</f:facet>
<h:commandLink action="#{academicyearController.deleteAcademicyear}" value="删除" />
</h:column>
</h:dataTable>
然则JSF强大便捷的开发功能可以是我们在bean里直接根据表单提交的状况动态创建数据表,也可以根据这个动态更新表:
如下是建立表的一些小方法:
1。首先在页面里,留出一个Form,或者panel(我比较喜欢panel):
<h:form id="regularMeetingDataForm">
<h:panelGrid columns="10" id="regularMeetingDataPanel"></h:panelGrid>
</h:form>
2。在bean里可以使用以下的一系列方法把数据表加入到regularMeetingDataPanel中,由于dataTable的 value值对应着List ,map 之类的值,所以把dataList注入_dataTable.setValue(dataList);,具体如下:
/**
* 创建数据表
*
* @param context
* @param dataList
* @return
*/
private UIData createDataTable(FacesContext context, List dataList) {
// 新建数据表
UIData _dataTable = new UIData();
_dataTable.setId("regularMeetingDataTable");
_dataTable.setValue(dataList);
// _dataTable.getAttributes().put("styleclass", "dataTable");
// _dataTable.getAttributes().put("headerClass", "headerClass");
// _dataTable.getAttributes().put("footerClass", "footerClass");
// _dataTable.getAttributes().put("rowClasses", "rowClass1");
// _dataTable.getAttributes().put("columnClasses", "columnClass1");
// _dataTable.getAttributes().put("cellpadding", "2");
// _dataTable.getAttributes().put("cellspacing", "0");
_dataTable.setVar("vardata");
// 逐个添加数据列和命令列
addCommandColumnToTable(context, "address",
"#{RegularmeetingHandler.FetchDataForUpdate}", _dataTable);
addColumnToTable(context, "meetingtime", "meetingtime", _dataTable);
addColumnToTable(context, "topic", "topic", _dataTable);
addColumnToTable(context, "detailrecord", "detailrecord", _dataTable);
addColumnToTable(context, "members", "members", _dataTable);
addColumnToTable(context, "recordman", "recordman", _dataTable);
addColumnToTable(context, "recorddate", "recorddate", _dataTable);
addColumnToTable(context, "addtime", "addtime", _dataTable);
addColumnToTable(context, "adduser", "adduser", _dataTable);
addCommandColumnToTable(context, "delete", "删除",
"#{RegularmeetingHandler.DeleteRMeeting}", _dataTable);
return _dataTable;
}
/**
* 添加数据列到数据表
*
* @param context
* @param columnName
* @param binding
* @param table
*/
private void addColumnToTable(FacesContext context, String columnName,
String binding, UIData table) {
// 新建数据列
UIColumn newColumn = new UIColumn();
newColumn.setId("col_" + columnName);
// 新建header项
HtmlOutputText header = new HtmlOutputText();
header.setId("hdr_" + columnName);
header.setValue(columnName);
// header.setStyleClass("outputText");
// 新建数据文本项
HtmlOutputText text = new HtmlOutputText();
text.setId("output_" + columnName);
// text.setStyleClass("outputText");
// 绑定数据
ValueBinding vb = context.getApplication().createValueBinding(
"#{" + table.getVar() + "." + binding + "}");
text.setValueBinding("value", vb);
// 逐个添加项
newColumn.setHeader(header);
newColumn.getChildren().add(text);
// 逐加入表中
table.getChildren().add(newColumn);
}
/**
* 添加数据列到数据表(有链接)
*
* @param context
* @param columnName
* @param commandName
* @param bindingCommand
* @param table
*/
private void addCommandColumnToTable(FacesContext context,
String columnName, String commandName, String bindingCommand,
UIData table) {
// 新建数据列
UIColumn newColumn = new UIColumn();
newColumn.setId("col_" + columnName);
// 新建header项
HtmlOutputText header = new HtmlOutputText();
header.setId("hdr_" + columnName);
header.setValue(columnName);
// header.setStyleClass("outputText");
// 新建文本链接项
HtmlCommandLink commandlink = new HtmlCommandLink();
// 绑定动作
MethodBinding mBinding = context.getApplication().createMethodBinding(
bindingCommand, new Class[] {});
commandlink.setAction(mBinding);
// 新建命令文本
HtmlOutputText text = new HtmlOutputText();
text.setId("output_" + columnName);
// text.setStyleClass("outputText");
text.setValue(commandName);
// 逐加入命令中
commandlink.getChildren().add(text);
// 逐个添加项
newColumn.setHeader(header);
newColumn.getChildren().add(commandlink);
// 逐加入表中
table.getChildren().add(newColumn);
}
/**
* 添加命令列到数据表
*
* @param context
* @param columnName
* @param bindingCommand
* @param table
*/
private void addCommandColumnToTable(FacesContext context,
String columnName, String bindingCommand, UIData table) {
// 新建数据列
UIColumn newColumn = new UIColumn();
newColumn.setId("col_" + columnName);
// 新建header项
HtmlOutputText header = new HtmlOutputText();
header.setId("hdr_" + columnName);
header.setValue(columnName);
// header.setStyleClass("outputText");
// 新建文本链接项
HtmlCommandLink commandlink = new HtmlCommandLink();
// 绑定动作
MethodBinding mBinding = context.getApplication().createMethodBinding(
bindingCommand, new Class[] {});
commandlink.setAction(mBinding);
// 新建数据文本
HtmlOutputText text = new HtmlOutputText();
text.setId("output_" + columnName);
// text.setStyleClass("outputText");
// 绑定数据
ValueBinding vb = context.getApplication().createValueBinding(
"#{" + table.getVar() + "." + columnName + "}");
text.setValueBinding("value", vb);
// 逐加入命令中
commandlink.getChildren().add(text);
// 逐个添加项
newColumn.setHeader(header);
newColumn.getChildren().add(commandlink);
// 逐加入表中
table.getChildren().add(newColumn);
}
/**
* 刷新数据表
*
* @param dataTable
*/
private void refreshDataTable(UIData dataTable) {
// 取得当前容器
FacesContext facesContext = FacesContext.getCurrentInstance();
// 取得组件树
UIViewRoot root = facesContext.getViewRoot();
// 取得WorkRecordDataPanel
UIPanel regularMeetingDataPanel = (UIPanel) root.findComponent(
"regularMeetingDataForm").findComponent(
"regularMeetingDataPanel");
// 删除regularMeetingDataPanel下的数据表
if (regularMeetingDataPanel.getChildren().remove(dataTable)) {
// 新建数据表并加入WorkRecordDataPanel中
UIData data = createDataTable(facesContext, irmeetingService
.ListRMeetings());
regularMeetingDataPanel.getChildren().add(data);
}
// // 数据表Value重新绑定
// dataTable.setValue(irmeetingService.ListRMeetings());
}
3。有了上面的私有方法,可以在下面的具体方法里调用这个方法了,如下:
/**
* 枚举所有学工例会纪录
*
*/
public void ListRMeetings() {
// 取得当前容器
FacesContext facesContext = FacesContext.getCurrentInstance();
// 取得组件树
UIViewRoot root = facesContext.getViewRoot();
// 取得regularMeetingDataPanel
UIPanel panel = (UIPanel) root.findComponent("regularMeetingDataForm")
.findComponent("regularMeetingDataPanel");
// 取得regularMeetingDataTable
UIData dataTable = (UIData) root
.findComponent("regularMeetingDataForm").findComponent(
"regularMeetingDataTable");
// 如果regularMeetingDataTable不存在则创建
if (dataTable == null) {
UIData data = createDataTable(facesContext, irmeetingService
.ListRMeetings());
panel.getChildren().add(data);
}
// regularMeetingDataTable已经存在则刷新regularMeetingDataTable
else {
refreshDataTable(dataTable);
}
}