Предположим, у нас есть список управляемых моделями для атрибута 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, связанный со свойством value компонента SelectOneChoice, но используя это, мы получаем индекс выбранногопункт, а не значение.Это связано с тем, что при перетаскивании атрибута в виде SelectOneChoice на страницу, SelectItems генерируется с индексами в качестве значений.
Отображение выбранного значения на странице jspx
В этом разделе мы увидим, как получить выбранное значение без написания одной строки кода Java.Создайте компонент outputText со свойством value, связанным с # {bindings.Deptno.attributeValue} вместо # {bindings.Deptno.inputValue}, и сделайте его обновляемым на основе выбора списка, добавив свойствоpartalTriggers.
<af:outputText value = "Selected Value: #{bindings.Deptno.attributeValue}" id="ot1" partialTriggers="soc1"/>
Приведенный выше код дает значение Deptno для выбранного элемента.Если Deptno для 'SALES' равен 30, 30 будет отображаться на outputText при выборе '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);
}