本文提供一個基于ADF Face組件開發樣例工程,實現表格開發中常見的處理:
1.Map對象+Bean對象填充表格的數據行。
2.使用靜態列、動態列、嵌套列的實現方法。
3.介紹表格中表單組件的使用方法。
4.介紹表格單行選中事件的處理過程。
本文是基于“ADF Faces 表格應用基礎案例一:應用List<Class>填充文本表格”編寫的,會省去許多細節部分的介紹。
實現的基本思路:
將樣例工程的創建過程分為幾個小的階段,每個階段實現了不同的目標。
第一階段:
表格數據:綁定管理Bean,應用List返回Map對象填充表格數據行
表格列結構:靜態列
第二階段:
表格數據:應用List返回(Map對象+Bean對象)混合使用,填充表格數據行
表格列結構:靜態列
第三階段:
表格數據:應用List返回(Map對象+Bean對象)
表格列結構:靜態列+動態列+嵌套列
第四階段:
表格數據:
1.字段中使用表單組件
表格事件:
2.數據修改事件(區分Map對象和Bean對象)
3.單行選中事件
第一階段:
應用List返回(Map對象+Bean對象)混合使用,填充表格數據行
創建工程

創建JSP頁面

拖入表格組件,選擇綁定數據行

填入管理Bean的信息,由IDE自動生成管理Bean代碼文件。

選中創建的管理Bean,點擊創建屬性按鈕,創建類型為List的屬性data。

在Bean中加入初始化表格數據的代碼:
package demo.table.app2.view;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DemoTableBean {
private List data;
public DemoTableBean() {
data = new ArrayList();
data.add(getRowData("r1"));
data.add(getRowData("r2"));
data.add(getRowData("r3"));
data.add(getRowData("r4"));
}
public void setData(List data) {
this.data = data;
}
public List getData() {
return data;
}
private Map<String, String> getRowData(String pfx) {
Map<String, String> data = new HashMap<String, String>();
data.put("header1", pfx + "1");
data.put("header2", pfx + "2");
data.put("header3", pfx + "3");
data.put("header4", pfx + "4");
data.put("header5", pfx + "5");
return data;
}
}有5列數據,列名為header1 至 header5。
有4行數據分別為 r11……r15至r41……r45。
在JSP中選擇表格組件,通過屬性頁為其增加字段,在Value位置寫入表達式“#{row.header1}”作為字段值的引用。

上圖中為表格增加了3個字段:header1、header2、header3。
填入后JSP頁面內代碼:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="http://xmlns.oracle.com/adf/faces/rich" prefix="af"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<af:document title="demo2.jsp" id="d1">
<af:form id="f1">
<af:table value="#{viewScope.bean1.data}" var="row" rowBandingInterval="0" id="t1">
<af:column sortable="false" headerText="col1" id="c1">
<af:outputText value="#{row.header1}" id="ot1"/>
</af:column>
<af:column sortable="false" headerText="col2" id="c2">
<af:outputText value="#{row.header2}" id="ot2"/>
</af:column>
<af:column sortable="false" headerText="col3" id="c3">
<af:outputText value="#{row.header3}" id="ot3"/>
</af:column>
</af:table>
</af:form>
</af:document>
</f:view>運行頁面,可以看到表格中填入了數據。

第二階段:
應用List返回(Map對象+Bean對象)混合使用,填充表格數據行
創建Java類“TableRow”,存儲表格行數據:
package demo.table.app2.view;
public class TableRow {
private String header1, header2, header3, header4, header5;
public TableRow(String pfx) {
super();
header1 = pfx + "1";
header2 = pfx + "2";
header3 = pfx + "3";
header4 = pfx + "4";
header5 = pfx + "5";
}
public void setHeader1(String header1) {
this.header1 = header1;
}
public String getHeader1() {
return header1;
}
public void setHeader2(String header2) {
this.header2 = header2;
}
public String getHeader2() {
return header2;
}
public void setHeader3(String header3) {
this.header3 = header3;
}
public String getHeader3() {
return header3;
}
public void setHeader4(String header4) {
this.header4 = header4;
}
public String getHeader4() {
return header4;
}
public void setHeader5(String header5) {
this.header5 = header5;
}
public String getHeader5() {
return header5;
}
}修改管理Bean代碼,在初始化階段增加3行數據,以“tr”為前綴
package demo.table.app2.view;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DemoTableBean {
private List data;
public DemoTableBean() {
data = new ArrayList();
data.add(getRowData("r1"));
data.add(getRowData("r2"));
data.add(getRowData("r3"));
data.add(getRowData("r4"));
data.add(new TableRow("tr1"));
data.add(new TableRow("tr2"));
data.add(new TableRow("tr3"));
}
public void setData(List data) {
this.data = data;
}
public List getData() {
return data;
}
private Map<String, String> getRowData(String pfx) {
Map<String, String> data = new HashMap<String, String>();
data.put("header1", pfx + "1");
data.put("header2", pfx + "2");
data.put("header3", pfx + "3");
data.put("header4", pfx + "4");
data.put("header5", pfx + "5");
return data;
}
}運行頁面,可以看到表格中填入了數據。

第三階段:
表格數據:應用List返回(Map對象+Bean對象)
表格列結構:靜態列+動態列+嵌套列
修改頁面標簽,實現嵌套列:

為管理Bean增加返回動態列名的方法:

public String[] getCols(){
return new String[]{"header4","header5"};
}上述代碼將header4和header5兩列作為動態列。
修改頁面標簽,在table標簽內加入foreache標簽循環輸出列信息。

<af:forEach varStatus="vs" var="v" items="#{viewScope.bean1.cols}">
<af:column sortable="false" headerText="#{v}" id="c7">
<af:outputText value="#{row[v]}" id="ot12"/>
</af:column>
</af:forEach>items綁定獲取了動態列名數組,輪詢輸出為表格列。
運行頁面文件

其中二、三列被嵌套表現了層次關系,而后兩列(header4、header5)為輪詢輸出的動態列。
第四階段:
表格數據:
1.字段中使用表單組件
表格事件:
2.數據修改事件(區分Map對象和Bean對象)
3.單行選中事件
修改數據環節,表格行數據載體Map和Bean對象是有區別的,Bean對象可以實現更靈活的數據修改動作。
設定Bean對象的修改處理代碼,在TableRow類中:
public void setHeader1(String header1) {
this.header1 = header1;
header2 = header1 +"aa";
}即當header1的值發生變化的時候,更新header2的值為更新header1值加尾綴“aa”。
修改JSP頁面,選擇table標簽,在Columns屬性頁中,變更字段1的組件為af:inputText

將字段1(對應的列名是header1)輸出組件修改為文本框之后,即可實現對字段內容的修改。
修改字段2的輸出組件的屬性partialTriggers值為“it1”,指向字段1的輸出組件id。

當字段1的值被修改的時候,字段2會自動跟著刷新。
設定表格的行選擇方式為“單選”,并綁定selectionListener事件至管理Bean。

<af:table value="#{viewScope.bean1.data}" var="row" rowBandingInterval="0" id="t1"
rowSelection="single"
selectionListener="#{viewScope.bean1.onSelection}">修改管理Bean的事件處理代碼,輸出選擇行的調試信息
public void onSelection(SelectionEvent se) {
RichTable tab = (RichTable)se.getSource();
//System.out.println("getSelectedColumns:" + tab.getSelectedColumns());
System.out.println("getSelectedRowData:" + tab.getSelectedRowData().getClass().getName());
System.out.println( tab.getSelectedRowData().toString());
System.out.println("getSelectedRowKeys:" + tab.getSelectedRowKeys().getClass().getName());
System.out.println( tab.getSelectedRowKeys().toString());
}運行頁面:
測試選中表格行,后臺會得到并輸出行的綁定的數據對象。
測試修改字段1的值,若行數據的后臺是Map對象(前4行)則字段2不會有變化,若行數據的后臺是TableRow對象,則字段2的值會一并被修改。

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。