使用表中的数组数据类型
在這篇文章中,我想跟進我以前關于Oracle集合數據類型的文章 ,并且我將集中精力使用af:table組件中的oracle.jbo.domain.Array屬性。
因此,在我的數據庫中,我具有以下SQL類型:
我有下表:
create table testarray ( SomeField Number, ArrValue VARCHAR2_ARRAY_TYPE) nested table ArrValue store as arrvalue_tab return as value;ADF BC模型中有一個基于testarray表的實體:
屬性Arrvalue的數據類型為oracle.jbo.domain.Array。
綁定容器中有一個相應的屬性綁定:
<attributeValues IterBinding="VTestarrayIterator" id="Arrvalue"><AttrNames><Item Value="Arrvalue"/></AttrNames></attributeValues>顯示此屬性值的最簡單方法如下:
<af:table value="#{bindings.Arrvalue.inputValue.array}" var="row" id="t1"><af:column sortable="false" headerText="Array Values" id="c1"><af:inputText value="#{row}" id="ot3"/>???????????? </af:column> </af:table>結果看起來非常不錯:
這種方法的唯一問題是該表不可更新。 它是只讀的。
EL表達式“#{bindings.Arrvalue.inputValue.array}”將調用方法oracle.jbo.domain.Array.getArray() ,該方法返回一個不變的Object []數組,并且對該數組的所有修改都將丟失。
如果我們需要能夠更新表中的數據,則必須執行以下操作:
因此,我們將制作一個副本并將其保留在請求范圍托管的bean中:
private Object[] array = null;private Object[] createArray() {JUCtrlValueBinding dcb = getArrayCtrlBinding();if (dcb!=null){Array arr = (Array) dcb.getInputValue();if (arr!=null) {array = arr.getArray();}????????? }return array; }public void setArray(Object[] array) {this.array = array; }public Object[] getArray() {return (array == null ? createArray() : array); }private JUCtrlValueBinding getArrayCtrlBinding() {BindingContext bc = BindingContext.getCurrent();DCBindingContainer binding = (DCBindingContainer) bc.getCurrentBindingsEntry();return (JUCtrlValueBinding ) binding.findCtrlBinding("Arrvalue"); }當使用此副本作為表的值時,我們可以執行以下操作:
<af:table value="#{TheBean.array}" var="row" id="t1"varStatus="status"><af:column sortable="false" headerText="Array Values" id="c1"><af:inputText value="#{TheBean.array[status.index]}" id="ot3"/>???????????? </af:column></af:table>請注意,我們不僅使用#{row}作為inputText的值。 這將不起作用,因為#{row}只會返回一個不變的String。 取而代之的是,我們使用了varStatus表屬性。 EL表達式#{TheBean.array [status.index]}使框架能夠在“更新模型值”階段調用相應的setter方法,因此表中所做的所有修改都將保存到TheBean.array中 。
最后一步是在“更新模型值”階段將TheBean.array放回屬性值。 為此,我們可以使用偽造的不可見的inputText :
<af:inputText value="#{TheBean.dummy}" visible="false" converter="EmptyConverter"id="it2"/>此輸入文本應放在頁面上表格的下方。 這種方法的優點在于,框架將嘗試在每個請求上更新inputText值。 因此,將表值保存到TheBean.array之后,將在更新模型值階段對每個請求調用setter方法TheBean.setDummy(String dummy) 。 現在,我們將把數組包裝到oracle.jbo.domain.Array中 ,然后放回Arrvalue.inputValue :
public void setDummy(String dummy) {getArrayCtrlBinding().setInputValue(new Array(array));?? array = null; }此虛擬 inputText的秘密隱藏在EmptyConverter中:
public class EmptyConverter implements Converter {public Object getAsObject(FacesContext facesContext,UIComponent uIComponent, String string) {return null;}public String getAsString(FacesContext facesContext,UIComponent uIComponent, Object object) {return null;} }它模擬已隨請求為此組件提交了空值。 另一方面, 偽獲取器總是返回一個非空值:
public String getDummy() {return DUMMY;}因此,該框架別無選擇,只能在“更新模型值”階段調用setDummy方法。
本文的示例應用程序需要JDeveloper 11.1.1.7。
而已!
翻譯自: https://www.javacodegeeks.com/2014/04/working-with-the-array-data-type-in-a-table.html
總結
以上是生活随笔為你收集整理的使用表中的数组数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓加速器永久破解版(加速器安卓破解版)
- 下一篇: JUnit ExpectedExcept