af:selectManyChoice 是一個(gè)下拉多選框,如下圖:
這個(gè)組件使用起來不是那么容易,它需要將表單中的一個(gè)column的attribute 和 組件中的selectitems之間互相轉(zhuǎn)換。
正好今天有個(gè)客戶問起,興致所致就寫了簡(jiǎn)單的例子,下載。
我不詳細(xì)展開講了,簡(jiǎn)要描述下:
1) af:selectManyChoice 的value attribute 綁定到一個(gè)managed bean的get和set 方法上
2) af:selectManyChoice的autosumit=true, immediate=true
3) 可選擇值為一個(gè)Static List的View Object, 在頁(yè)面的binding中配置該lov,并且在selectItems的value屬性綁定到該lov。
4)在af:selectManyChoice 的value對(duì)應(yīng)的manage bean的get/set方法中,將頁(yè)面選擇的index對(duì)應(yīng)到lov的具體值并存放到數(shù)據(jù)庫(kù),讀取則反之。
下載包的密碼是: gene.xujin@gmail.com
在ADF頁(yè)面上有兩種EL的引用af:tree,af:treeTable,af:table的數(shù)據(jù)集合的方式。一種是#{row.attributeName},另一種是#{row.bindings.attributeName.inputValue}。 這兩者的區(qū)別是:前者是只讀的 而后者是可讀寫的。前者這是將該屬性以字符串的形式返回,該EL的返回值是一個(gè)String類型,后者則不同,#{row.bindings.attributeName}是一個(gè)Attribute Binding, 在運(yùn)行時(shí)是一個(gè)FacesCtrlAttrsBinding 類的實(shí)例,該類是框架內(nèi)部使用的類,繼承了JUCtrlAttrsBinding。所以只要表格需要更新,就應(yīng)該使用{row.bindings.attributeName.inputValue},另外一個(gè)例子是#{node.attributeName},node表示了樹組件中的一個(gè)節(jié)點(diǎn),可以對(duì)應(yīng)到table組件的row。
ADF具有一個(gè)非常健壯的驗(yàn)證框架。表單驗(yàn)證可以在各個(gè)層次上進(jìn)行(view, model和business service)。如果需要詳細(xì)研究驗(yàn)證機(jī)制,請(qǐng)參考Fusion Developer's Guide for Oracle Application Development Framework.
在現(xiàn)實(shí)的開發(fā)過程中,經(jīng)常有一些頁(yè)面需要暫時(shí)的跳過默認(rèn)的驗(yàn)證,本文旨在討論下常見的use case:
1. Keep immediate=true
一個(gè)最常用的方式就是將UICOMPONENT的immediate屬性設(shè)置為true,這樣可以將對(duì)組件的處理提前到Apply Request Values階段。關(guān)于immediate屬性可以參考 wiki
典型用例:cancel button,在取消按鈕點(diǎn)擊時(shí),頁(yè)面是不需要驗(yàn)證提交的表單的。可以將按鈕組建的immediate屬性設(shè)為'true'來實(shí)現(xiàn)這個(gè)功能。 如果是一個(gè)reset按鈕,那么除了immediate屬性需要設(shè)為'true‘外,最好還要調(diào)用下相關(guān)其他input組件的resetValue()方法,來恢復(fù)初始狀態(tài)。
2. SkipValidation
另外一種方式,是設(shè)置pagedefinition 文件的SkipValidation 屬性。該屬性可以控制跳過model層的驗(yàn)證。需要注意的是,這個(gè)屬性只對(duì)entity level的validation rule起作用,對(duì)于entity object的attribute上定義的validation rule是沒有作用的。另外對(duì)于瀏覽器端的驗(yàn)證(javascript),這個(gè)屬性也是沒法控制的。
這個(gè)屬性可以在每個(gè)頁(yè)面對(duì)應(yīng)的Page Definition 文件中找到,如下圖:

這個(gè)屬性可能有的值,見下圖:

a. SkipValidation=true
設(shè)為true則在form提交過程中會(huì)跳過Model層的驗(yàn)證,直到commit的時(shí)候才會(huì)進(jìn)行驗(yàn)證。
典型場(chǎng)景:如需要在一張表中輸入很多行信息,用戶可能希望可以在頁(yè)面中以任何順序輸入信息,不希望每次table selection事件都會(huì)觸發(fā)驗(yàn)證。
b. SkipValidation=custom
設(shè)為custom的時(shí)候,需要開發(fā)人員實(shí)現(xiàn)一個(gè)oracle.binding.BindingContainerValidator的接口的類,并用EL配置,如圖:

這個(gè)選擇項(xiàng)給了開發(fā)人員更多的空間來應(yīng)對(duì)復(fù)雜的業(yè)務(wù)需求,開發(fā)人員可以自定義如何對(duì)表單進(jìn)行驗(yàn)證。
c. SkipValidation = skipDataControls
skipDataControls 選擇項(xiàng)的意思是會(huì)跳過data control這個(gè)level的驗(yàn)證,或者說是事務(wù)級(jí)別的驗(yàn)證。它只會(huì)對(duì)當(dāng)前的binding container中的iterator的current row進(jìn)行驗(yàn)證,而不會(huì)對(duì)其他不相關(guān)的提交的數(shù)據(jù)進(jìn)行驗(yàn)證。
典型場(chǎng)景: 在一個(gè)頁(yè)面上使用了多個(gè)data control,提交一個(gè)data control不會(huì)驗(yàn)證同一個(gè)頁(yè)面中的其他data control中的數(shù)據(jù)。
d. SkipValidation=false
默認(rèn)值,不會(huì)跳過驗(yàn)證。
摘要: 在af|inputDate 組件上防止鍵盤輸入 gene 有些情況下,我們會(huì)需要日期輸入控件不允許用戶用鍵盤輸入日期。要實(shí)現(xiàn)這樣的功能就需要使用到Javascript。功能的效果如下圖: Javascript:?12<af:resource> function disableEntry(evt){ evt.cancel(); }</af:resour...
閱讀全文
在刪除某幾條數(shù)數(shù)據(jù)的時(shí)候,可以用多選項(xiàng)選中多條記錄,再點(diǎn)擊刪除按鈕的時(shí)候需要做一下判斷是否確認(rèn)刪除,如果一條記錄都沒有刪除,那么就不彈出確認(rèn)的對(duì)話框。
<script>
function CheckAll(srcElem, do_check){
??????? if(typeof(srcElem)=='undefined') return;
??????? var cnt = (typeof(srcElem.length)!='undefined')? srcElem.length : 0;
??????? if(cnt){
??????????????? for(var i=0;i<cnt; i++)
??????????????????????? srcElem[i].checked = do_check;
??????? }else
??????????????? srcElem.checked = do_check;
}
function deleteYN(){
//if(YN(this.form.elements['delBox'], this.checked)){if(!confirm('確實(shí)要?jiǎng)h除嗎?')) return false;}else return false;
if(typeof(form1.elements['delBox'])=='undefined'){
return false;
}else{
?if(form1.delBox.checked==true){??
??if(!confirm('確實(shí)要?jiǎng)h除嗎?'))
????return false;
???else
?????? return true;
?}else{?
?for(var i=0;i<form1.delBox.length; i++){
??if(form1.delBox[i].checked==true){
???if(!confirm('確實(shí)要?jiǎng)h除嗎?'))
????return false;
???else
?????? return true;?
??}
?}
?}
return false;?
}
return false;
}
</script>
<input type="submit" name="delSubmit" value="刪除" onClick="return YN();" >
<input type="checkbox" name="alcheck" value="0" title="點(diǎn)擊全選或者全不選" onclick="CheckAll(this.form.elements['delBox'], this.checked)" >