假設我們有一個綁定到DEPTNO屬性 在DNAME和selectOneChoice的 顯示值DEPTNO屬性模型驅動的列表JSPX頁面
<af:selectOneChoice value="#{bindings.Deptno.inputValue}" label="Select Department"
required="true" shortDesc="#{bindings.Deptno.hints.tooltip}"
id="soc1" autoSubmit="true">
<f:selectItems value="#{bindings.Deptno.items}" id="si1"/>
</af:selectOneChoice>
當我們要選擇的值,我們做的常見錯誤是使用 相同的EL勢必selectOneChoice組件的value屬性, 但是使用這個,我們得到的是所選項目的索引,而不是 。這是因爲當我們將屬性 SelectOneChoice拖放到頁面上時,SelectItems會以 索引作爲值生成。
顯示到頁面JSPX
在本節中選擇的值,我們可以看到如何讓選擇的值,而無需編寫Java代碼 一行。創建一個outputText組件,其 value屬性綁定到#{bindings.Deptno.attributeValue},而不是 #{bindings.Deptno.inputValue},並根據列表選擇通過添加partialTriggers屬性來使其可刷新。
<af:outputText value = "Selected Value: #{bindings.Deptno.attributeValue}" id="ot1" partialTriggers="soc1"/>
上面的代碼給出了所選項目的Deptno值。如果'SALES'的 Deptno是30,則將在outputText上顯示30,其中 從列表中選擇'SALES'。
如果我們希望顯示「SALES」本身則下面EL應 可以使用假設DNAME是第二屬性DeptView
<af:outputText value = "Display Value: #{bindings.Deptno.selectedValue ne ' ' ? bindings.Deptno.selectedValue.attributeValues[1] : ''}" id="ot2" partialTriggers="soc1"/>
內部值變化監聽
上述EL表達式評估ValueChangeListener內部不會給出當前選定值 ,而是給出先前選擇的 值,因爲所選值不會被更新爲模型調用時間的ValueChangeListener。
在這種情況下,在訪問選定的值之前,我們需要先更新 模型。
下面是示例代碼:
public void valueChanged(ValueChangeEvent valueChangeEvent) {
this.setValueToEL("#{bindings.Deptno.inputValue}", valueChangeEvent.getNewValue()); //Updates the model
System.out.println("\n******** Selected Value: "+resolveExpression("#{bindings.Deptno.attributeValue}"));
System.out.println("\n******** Display Value: "+resolveExpression("#{bindings.Deptno.selectedValue ne ' ' ? bindings.Deptno.selectedValue.attributeValues[1] : ''}"));
}
public Object resolveExpression(String el) {
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory expressionFactory = facesContext.getApplication().getExpressionFactory();
ValueExpression valueExp = expressionFactory.createValueExpression(elContext,el,Object.class);
return valueExp.getValue(elContext);
}
public void setValueToEL(String el, Object val) {
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory expressionFactory = facesContext.getApplication().getExpressionFactory();
ValueExpression exp = expressionFactory.createValueExpression(elContext, el, Object.class);
exp.setValue(elContext, val);
}
@BalusC - 這不是ADF具體的,如果你看過他的問題 - 這是JDeveloper的具體。 JDeveloper有超過3000頁的手冊是有原因的。 – GrrLex 2013-08-19 18:30:22