关于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 期末大作业 <%@ page language="java" import="java.util.*,dao.*,entitybean.*" pageEncoding="utf-8"%... </h:dataTable> </h:form> </p> <img src="image/re.jpg"> </div> </body> </html> </f:view>
- **<h:dataTable>**:数据表格。 - **<h:form>**:表单容器。 - **<h:graphicImage>**:图形图像。 - **<h:inputHidden>**:隐藏输入字段。 - **<h:inputSecret>**:密码输入框。 - **<h:inputText>**:文本输入框...
对于可编辑的列,可以使用`<h:inputText>`替换`<h:outputText>`。 5. **编辑模式**:为了实现单行编辑,通常需要一个触发编辑状态的机制,如点击行或单元格。这可以通过添加一个`<h:commandLink>`或`<h:...
</h:dataTable> <ems:page id="pageId" for="tableId" maxPage="5" /> 2. 相应的Managedbean: [java] view plaincopy /** * EMS 11185 限时未达邮费奉还 * @author 螃蟹 */ @SuppressWarnings(value ...
***库中的JsonConvert.DeserializeObject<DataTable>方法是实现此过程的关键,但是在此过程中可能会出现小数位丢失的问题。 2. 小数位丢失问题描述: 在使用***进行解序列化操作时,可能会出现小数位丢失的现象,...
<h:commandButton id="regist" value="Regist"> <f:actionListener type="mypackage.ActionListenerImpl"/> </h:commandButton> ``` attribute attribute标签用于设置父标签的属性。示例代码: ``` <h:graphic...
<p:dataTable value="#{paginationBean.persons}" var="person"> <!-- 数据列 --> </p:dataTable> <p:datascroller id="scroll" value="#{paginationBean.persons}" scrollRows="10" lazy="true"> <p:ajax ...
<rich:datatable id="myTable" value="#{bean.dataList}" var="item"> <rich:column> <f:facet name="header"> <h:outputText value="日期" /> </f:facet> <h:outputText value="#{item.date}" /> </rich:...
<h:dataTable value="#{bean.items}" var="item"> <h:column> <f:facet name="header">Item ID</f:facet> #{item.id} </h:column> <h:column> <f:facet name="header">Item Name</f:facet> #{item.name} </h...
<p:dataTable value="#{bean.rows}" var="row"> <p:column> <p:cellEditor> <f:facet name="output"> #{row.name} </f:facet> <f:facet name="input"> <p:inputText value="#{row.name}" /> </f:facet> </p...
一旦查询结果集准备好,就可以使用JSF组件如`<h:dataTable>`来展示结果。 ```html <h:dataTable value="#{bean.resultSet}" var="row"> <h:column> <f:facet name="header">Email</f:facet> #{row.EMAIL} </h:...
在JSF页面中,DataTable通常通过`<h:datatable>`标签来声明。开发者需要指定一个值属性,该属性指向包含要显示数据的列表,以及一个var属性,用于在循环中引用当前项。 ```html <h:dataTable value="#{bean....
以上代码展示了如何使用MyFaces标签库中的`<h:outputText>`, `<h:inputText>`, `<h:message>`和`<h:commandButton>`等标签创建一个简单的登录表单。`#{bean.userName}`和`#{bean.password}`通过表达式绑定到后端Bean...
这里使用了`<h:outputText>`标签来显示表头文本,通过`styleClass`属性设置样式。 ##### 4. 显示数据 每列的具体数据通过`<h:column>`标签来定义,如: ```xml <h:column> <h:outputText value="#{car.name}"/> </...
- **简单表格**:使用`<h:dataTable>`或`<h:table>`等标签创建基本的表格结构。 - **表头、表尾**:可以使用`<f:facet>`来定义表头和表尾。 - **TableModel类**:用于处理表格数据的模型,提供了更高级的表格功能,...
5. **数据展示标签**:如`<h:dataTable>`,用于显示数据集。 JSF标签通过绑定到后台Bean的属性,使得UI和数据之间的交互变得简单。 ### JSF生命周期 JSF组件的生命周期包括六种不同阶段:恢复视图、应用请求值、...