在 简单的表格
中曾经提过,<h:dataTable>可以枚举以下几种类型的数据:
- 数组
- java.util.List的实例
- java.sql.ResultSet的实例
- javax.servlet.jsp.jstl.sql.Result的实例
- javax.faces.model.DataModel的实例
对于前四种类型,JSF实际上是以javax.faces.model.DataModel加以包装,DataModel是个抽象类,其子类都是位于
javax.faces.model这个package下:
- ArrayDataModel
- ListDataModel
- ResultDataModel
- ResultSetDataModel
- ScalarDataModel
如果您想要对表格数据有更多的控制,您可以直接使用DataModel来设定表格数据,调用DataModel的setWrappedObject()方
法可以让您设定对应类型的数据,调用getWrappedObject()则可以取回数据,例如:
package onlyfun.caterpillar; import java.util.*; import javax.faces.model.DataModel; import javax.faces.model.ListDataModel; public class TableBean { private DataModel model; private int rowIndex = -1; public DataModel getUsers() { if(model == null) { model = new ListDataModel(); model.setWrappedData(getUserList()); } return model; } private List getUserList() { List userList = new ArrayList(); userList.add(new UserBean("caterpillar", "123456")); userList.add(new UserBean("momor", "654321")); userList.add(new UserBean("becky", "7890")); return userList; } public int getSelectedRowIndex() { return rowIndex; } public String select() { rowIndex = model.getRowIndex(); return "success"; } }
在这个Bean中,我们直接设定DataModel?,将userList设定给它,如您所看到的,我们还可以取得DataModel?的各个变项,在这
个例子中,select()将作为点选表格之后的事件处理方法,我们可以藉由DataModel?的getRowIndex
()来取得所点选的是哪一row的数据,例如:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <html> <link href="styles.css" rel="stylesheet" type="text/css"/> <body> <f:view> <h:form> <h:dataTable value="#{tableBean.users}" var="user" styleClass="orders" headerClass="ordersHeader" rowClasses="evenColumn,oddColumn"> <h:column> <f:facet name="header"> <h:outputText value="Name"/> </f:facet> <h:commandLink action="#{tableBean.select}"> <h:outputText value="#{user.name}"/> </h:commandLink> <f:facet name="footer"> <h:outputText value="****"/> </f:facet> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Password"/> </f:facet> <h:outputText value="#{user.password}"/> <f:facet name="footer"> <h:outputText value="****"/> </f:facet> </h:column> </h:dataTable> </h:form> Selected Row: <h:outputText value="#{tableBean.selectedRowIndex}"/> </f:view> </body> </html>
DataModel的rowIndex是从0开始计算,当处理ActionEvent时,JSF会逐次递增rowIndex的值,这让您可以得知目前正在处理的是哪一个row的数据,一个执行的图示如下:
|