JSF提供javax.faces.model包,数据模型DataModel类位于此包中。
DataModel实现了一个抽象任意数据绑定技术,可以被用来适应各种数据源使用JSF组件,为子组件提供Row操作功能(如UIData,表格、列表和树都是它的子类)。
例如,h:dataTable支持下面几种类型数据的存取
l 数组
l java.util.List
l javax.servlet.jsp.jstl.sql.Result
l java.sql.ResultSet
l Object
分别对应以下几种DataModel:
l ArrayDataModel
l ListDataModel
l ResultDataModel
l ResultSetDataModel
l ScalarDataModel
我们可以使用DataModel来设定dataTable的数据,通过调用DataModel的setWrappedObject()方法进行设定,调用getWrappedObject()则可以取回原始数据类型。
例如:
TableBean.java
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的数据,例如:
index.jsp
<%@ 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的数据.
JSF提供了一个模型包:javax.faces.model。数据模型DataModel类位于此包中。这个类的说明如下:数据模型(特指这个包中的DataModel类)是JSF数据绑定技术的一个抽象,而数据绑定技术能够被JSF组件用来和各种数据源进行适配,从而支持按照行来处理他们的子组件(例如UIData)。DataModel实例中的数据集合(Data collection)是按照行对象(Row Objects)集合进行建模的,从而支持行指针(类似于数据库的游标,也是从0开始)。这个提供了通过当前行指针的位置来获得相对应的对象的一种机制。用户可以通过setWrappedData(Object obj)方法将业务对象附加到这个DataModel上,可以通过将null传递给这个方法来脱离。
UIComponent <-------> DataModel <--------> Business Model
注意:这里的UIComponent经常是UIData,我会在另外一个文章中介绍UIData.
ListDataModel, ArrayDataModel, ResultDataModel, ResultSetDataModel, ScalarDataModel
ListDataModel可以方便的包装java.util.List对象。ListDataModel(java.util.List list)
ArrayDataModel可以方便的包装Object[] 数组。ArrayDataModel(java.lang.Object[] array)
ResultDataModel可以方便地包装JSTL的结果对象(JSTL Result Object),通常代表通过JSTL标签执行SQL语句产生的结果。ResultDataModel(javax.servlet.jsp.jstl.sql.Result result)
ResultSetDataModel可以方便的包装Java对象的结果集(ResultSet of Java objects). ResultSetDataModel(java.sql.ResultSet resultSet)注意:这个结果集必须是可以滚动的(Scrollable),另外如果输入组件(可能更新模型值)通过使用值绑定来引用这个对象,这个结果集必须是可更新(Updatable)的
ScalarDataModel可以方便的包装单个Java对象。ScalarDataModel(java.lang.Object scalar)