Sunday, August 13, 2006

JSF中的数据模型事件

当一个数据模型组件中执行行操作的时候,就会触发数据模型事件。这个事件一般在类似HtmlDataTable这样的“数据表格”组件中被触发。与值变化事件和动作事件不同,数据模型事件必须实现一个Java接口。数据模型事件和前面提到的事件稍有不同,因为它实际上不是由UI组件触发的,而是由一个叫做“DataModel”的实例触发的,这个“DataModel”是数据模型组件的内部对象。“DataModel”可以封装为列表、数组、数据库游标结果集或者其他数据源。由于这个事件是由组件内部的模型对象触发的,所以你不能在JSP中为它注册监听器。你只能通过Java代码来注册:
FacesContext facesContext = FacesContext.getCurrentInstance();
dataTable = (HtmlDataTable)facesContext.getApplication().createComponent(
HtmlDataTable.COMPONENT_TYPE);
DataModel myDataModel = new ResultSetDataModel(myResultSet);
myDataModel.addDataModelListener(new DataModelListener()
{
public void rowSelected(DataModelEvent e)
{
FacesContext.getCurrentInstance().getExternalContext().
log("row selected:" + e.getRowIndex());
}
});
dataTable.setValue(myDataModel);
在上面的例子中我们首先创建了一个HtmlDataTable组件的实例,并通过已有的JDBC结果集创建了一个ResultSetDataModel模型。接着我们为ResultSetDataModel增加了一个DataModelListener监听器,并且把数据模型的设置为HtmlDataTable组件的值。每次HtmlDataTable中的记录进行迭代的时候我们的监听器就会被触发,这通常发生在组件被显示的时候。由于数据模型事件会被触发多次,所以它一般会被用于开发数据驱动的组件,在实际的应用程序开发中很少会用到。

No comments: