`

<转>关于h:dataTable的使用

阅读更多
关于h:dataTable的使用
基本用法

后台处理

可以在table的每一行增加操作用于处理当前行(比如删除当前行),也可以在table外增加操作处理整个table(更新整个table),页面代码如下:
我们可以有多种方式来处理
1】 传统的jsp方式,也是很多初学者首先想到的方式,这种方式本质上和以前的方式没有区别,只是披上了jsf的外衣而已,强烈建议不要使用。并且这样没有办法处理整个table,按以前的方式处理是相当的麻烦。
给每一行的操作增加参数,然后在后台提取该参数
<t:dataTable var="emp" .... > 
<h:commandLink id="editLink" action="#{employeeAction.prepareEdit}"> 
<h:outputText value="#{msg.edit}"/> 
<f:param name="id" value="#{emp.id}"/> 
</h:commandLink>

FacesContext context = FacesContext.getCurrentInstance(); 
Map map = context.getExternalContext().getRequestParameterMap(); 
String employeeID = (String) map.get("id");

2】 使用actionListener,来取得当前行的数据。整个表的处理很简单,直接获取list即可(参加方法3)
<h:commandLink> 
<f:actionListener type="net.java.OrderActionListener" /> 
<h:outputText value="Order" /> 
</h:commandLink> 

public class orderActionListener implements ActionListener { 

public void processAction(ActionEvent anEvent) throws AbortProcessingException { 

YourBeanClass tmpBean = null; 

UIComponent tmpComponent = anEvent.getComponent(); 

while (null != tmpComponent && !(tmpComponent instanceof UIData)) { 
tmpComponent = tmpComponent.getParent(); 
} 

if (tmpComponent != null && (tmpComponent instanceof UIData)) { 
Object tmpRowData = ((UIData) tmpComponent).getRowData(); 
if (tmpRowData instanceof YourBeanClass) { 
tmpBean = (YourBeanClass) tmpRowData; 

//TODO Implementation of your method 

} 
} 

3】 通过绑定tale,这样就可以在后台直接通过table来获取当前行了,而不像方法2那样通过事件来获得table
<h:dataTable binding="#{testSelectItems.table}" id="hotels" value="#{testSelectItems.list}" var="hot"> 
<h:column id="c1"> 
<f:facet name="header" id="f1">label</f:facet> 
<h:inputText id="bbb" value="#{hot.label}" required="true"/> 
</h:column> 
<h:column id="c2"> 
<f:facet name="header" id="f2">value</f:facet> 

<h:inputText id="aaa" value="#{hot.value}" required="true"/> 
</h:column> 
<h:column id="c3"> 
<f:facet name="header" id="f3">link</f:facet> 
<!- 处理当前行 
<h:commandLink id="ccc" action="#{testSelectItems.actionTest1}" value="#{hot.value}"> 
xxx#{hot.label} 
</h:commandLink> 
</h:column> 
</h:dataTable> 
<!- 处理全部行 
<h:commandButton action="#{testSelectItems.actionTest}"/> 
</h:form> 

public class TestSelectItems { 
private UIData table=new UIData(); 
private List list; 

public List getList(){ 
System.out.println("---TestSelectItems-getList----1---"); 
if(list==null){ 
System.out.println("--TestSelectItems-getList-----2---"); 
list=new ArrayList(); 
SelectItem it=new SelectItem(); 
it.setLabel("lable1"); 
it.setValue("1"); 
list.add(it); 
it=new SelectItem(); 
it.setLabel("lable2"); 
it.setValue("2"); 
list.add(it); 
} 
return list; 
} 
//处理全部行 
public void actionTest(){ 
System.out.println("----list.size():"+list.size()); 
System.out.println("--actionTest--"); 
} 
//处理单行 
public void actionTest1(){ 
SelectItem dd=(SelectItem)table.getRowData(); 
System.out.println("--actionTest1--:"+dd.getLabel()); 
} 
public UIData getTable() { 
return table; 
} 
public void setTable(UIData table) { 
this.table = table; 
} 

增加多选操作
目前的table只支持单行操作和全部行操作,而不支持多选操作,比如每行号前有个复选框,用于批量删除。
通常做法
通常的做法是改写值对象,或者改写值对象的基类,在其中增加checked属性
------------------------------------------------
public abstract class BaseObject implements Serializable { 
private boolean checked; 

public void setChecked(boolean value) { 
this.checked = value; 
} 
public boolean isChecked(){ 
return this.checked; 
} 
... 
} 

在页面上使用
<h:selectBooleanCheckbox value="#{e.checked}" /> 
<h:dataTable var="e" value="#{typeallList.typeallModel }"> 
<f:facet name="header"><h:outputText value="#{text['typeall.typelist'] }"/> 
</f:facet> 
<h:column> 
<f:facet name="header"><h:outputText value="#{text['list.checkall'] }"/></f:facet> 
<h:selectBooleanCheckbox value="#{e.checked}" /> 
</h:column> 

提交后循环全部行,取出选择的行
public String removeChecked(){ 
List tempList = typeallModel.getWrappedObject(); 
for (int i=0;i<tempList.size();i++){ 
OaTypeall obj=(OaTypeall)tempList.get(i); 
if (obj.isChecked()) { 
//删除obj 
} 
return null; 
} 

该方法的缺点是需要修改值对象,而添加的属性对值对象而言是没有意义的。这种方式破坏了对象的内聚性,把与该对象不相关的属性强添加到对象中。
新思路
页面使用方式不变,不用修改值对象的类,用ListCheckedDataModel封装list,在其中动态给list中的对象增加checked属性,并增加获取所以选择行的list。关键点是如何给值对象动态增加属性。可以考虑使用动态字节码操作javassist来动态增加字段
实现原理
(似乎作者未贴完)
分享到:
评论

相关推荐

    人事信息管理系统

    jsf和jpa 期末大作业 &lt;%@ page language="java" import="java.util.*,dao.*,entitybean.*" pageEncoding="utf-8"%... &lt;/h:dataTable&gt; &lt;/h:form&gt; &lt;/p&gt; &lt;img src="image/re.jpg"&gt; &lt;/div&gt; &lt;/body&gt; &lt;/html&gt; &lt;/f:view&gt;

    JSF控件详细参考手册

    - **&lt;h:dataTable&gt;**:数据表格。 - **&lt;h:form&gt;**:表单容器。 - **&lt;h:graphicImage&gt;**:图形图像。 - **&lt;h:inputHidden&gt;**:隐藏输入字段。 - **&lt;h:inputSecret&gt;**:密码输入框。 - **&lt;h:inputText&gt;**:文本输入框...

    jsf2.0 dataTable单行修改例子

    对于可编辑的列,可以使用`&lt;h:inputText&gt;`替换`&lt;h:outputText&gt;`。 5. **编辑模式**:为了实现单行编辑,通常需要一个触发编辑状态的机制,如点击行或单元格。这可以通过添加一个`&lt;h:commandLink&gt;`或`&lt;h:...

    JSF2datatable分页控件与左侧菜单

    &lt;/h:dataTable&gt; &lt;ems:page id="pageId" for="tableId" maxPage="5" /&gt; 2. 相应的Managedbean: [java] view plaincopy /** * EMS 11185 限时未达邮费奉还 * @author 螃蟹 */ @SuppressWarnings(value ...

    JsonConverter解序列化DataTable小数位丢失.pdf

    ***库中的JsonConvert.DeserializeObject&lt;DataTable&gt;方法是实现此过程的关键,但是在此过程中可能会出现小数位丢失的问题。 2. 小数位丢失问题描述: 在使用***进行解序列化操作时,可能会出现小数位丢失的现象,...

    JSF标签详解(一个不漏).doc

    &lt;h:commandButton id="regist" value="Regist"&gt; &lt;f:actionListener type="mypackage.ActionListenerImpl"/&gt; &lt;/h:commandButton&gt; ``` attribute attribute标签用于设置父标签的属性。示例代码: ``` &lt;h:graphic...

    jsf 分页实例jsf 分页实例

    &lt;p:dataTable value="#{paginationBean.persons}" var="person"&gt; &lt;!-- 数据列 --&gt; &lt;/p:dataTable&gt; &lt;p:datascroller id="scroll" value="#{paginationBean.persons}" scrollRows="10" lazy="true"&gt; &lt;p:ajax ...

    Richfaces的DateTable

    &lt;rich:datatable id="myTable" value="#{bean.dataList}" var="item"&gt; &lt;rich:column&gt; &lt;f:facet name="header"&gt; &lt;h:outputText value="日期" /&gt; &lt;/f:facet&gt; &lt;h:outputText value="#{item.date}" /&gt; &lt;/rich:...

    《JSF标签》简体中文版.pdf

    &lt;h:dataTable value="#{bean.items}" var="item"&gt; &lt;h:column&gt; &lt;f:facet name="header"&gt;Item ID&lt;/f:facet&gt; #{item.id} &lt;/h:column&gt; &lt;h:column&gt; &lt;f:facet name="header"&gt;Item Name&lt;/f:facet&gt; #{item.name} &lt;/h...

    primefaces最新版本使用说明

    &lt;p:dataTable value="#{bean.rows}" var="row"&gt; &lt;p:column&gt; &lt;p:cellEditor&gt; &lt;f:facet name="output"&gt; #{row.name} &lt;/f:facet&gt; &lt;f:facet name="input"&gt; &lt;p:inputText value="#{row.name}" /&gt; &lt;/f:facet&gt; &lt;/p...

    使用 JSF 构建数据库驱动的应用程序

    一旦查询结果集准备好,就可以使用JSF组件如`&lt;h:dataTable&gt;`来展示结果。 ```html &lt;h:dataTable value="#{bean.resultSet}" var="row"&gt; &lt;h:column&gt; &lt;f:facet name="header"&gt;Email&lt;/f:facet&gt; #{row.EMAIL} &lt;/h:...

    JSF-2-DataTable

    在JSF页面中,DataTable通常通过`&lt;h:datatable&gt;`标签来声明。开发者需要指定一个值属性,该属性指向包含要显示数据的列表,以及一个var属性,用于在循环中引用当前项。 ```html &lt;h:dataTable value="#{bean....

    myfaces标签库

    以上代码展示了如何使用MyFaces标签库中的`&lt;h:outputText&gt;`, `&lt;h:inputText&gt;`, `&lt;h:message&gt;`和`&lt;h:commandButton&gt;`等标签创建一个简单的登录表单。`#{bean.userName}`和`#{bean.password}`通过表达式绑定到后端Bean...

    richfaces中的datagrid显示数据

    这里使用了`&lt;h:outputText&gt;`标签来显示表头文本,通过`styleClass`属性设置样式。 ##### 4. 显示数据 每列的具体数据通过`&lt;h:column&gt;`标签来定义,如: ```xml &lt;h:column&gt; &lt;h:outputText value="#{car.name}"/&gt; &lt;/...

    JSF中文标签

    - **简单表格**:使用`&lt;h:dataTable&gt;`或`&lt;h:table&gt;`等标签创建基本的表格结构。 - **表头、表尾**:可以使用`&lt;f:facet&gt;`来定义表头和表尾。 - **TableModel类**:用于处理表格数据的模型,提供了更高级的表格功能,...

    jsf的基础

    5. **数据展示标签**:如`&lt;h:dataTable&gt;`,用于显示数据集。 JSF标签通过绑定到后台Bean的属性,使得UI和数据之间的交互变得简单。 ### JSF生命周期 JSF组件的生命周期包括六种不同阶段:恢复视图、应用请求值、...

Global site tag (gtag.js) - Google Analytics