了解javax.el.ValueExpression的用途

时间:2015-08-09 04:39:25

标签: jsf jsf-2 el

我试图理解JSF中UIInput组件和EL表达式的工作原理。以下是UIInput组件源代码的代码片段:

public void updateModel(FacesContext context) {

        if (context == null) {
            throw new NullPointerException();
        }

        if (!isValid() || !isLocalValueSet()) {
            return;
        }
        ValueExpression ve = getValueExpression("value");
        if (ve != null) {
            Throwable caught = null;
            FacesMessage message = null;
            try {
                ve.setValue(context.getELContext(), getLocalValue()); //1
                setValue(null);
                setLocalValueSet(false);
            }
            //catch clause

现在,我有一个简单的bean,输入组件绑定到它的属性:

<h:inputText value="#{myBean.hello}" />
@ManagedBean
@SessionScoped
public class MyBean{
    private String hello;
    //getter,setter
}

据我所知,updateModel方法是从UIComponentBaseprocessUpdates(FacesContext)方法继承而来的,Update Model Values方法是//1阶段的标准回调。因此,在javax.el.ValueExpression设置断点并执行下一步后,流程停止在相应的bean属性setter方法。

我的问题是关于{{1}}的目的。它是否适用于组件类和bean属性之间的所有交互(封装),以便获取/设置bean的属性值?

1 个答案:

答案 0 :(得分:3)

EL就像一条&#34;路径&#34;并且需要导航bean。 UIInput是MVC&#34; view&#34;到MVC&#34;模型&#34;由你的bean代表。 EL将两者连接在一起。它只封装了遍历本身。它标识了交互的主题,但交互是由组件类定义的。将h:outputTexth:inputText进行比较:两者基本上都采用value="#{some.el}"属性;一个允许用户修改它的事实是关于组件的事实,而不是bean属性本身的路径。

某些组件定义应该通过引用方法而不是bean属性来填充的属性,但同样,EL只是遍历调用,这些方法是组件所做的事情。在这种情况下,您将处理MethodExpression而不是ValueExpression

JSF生命周期决定事情以某种整体顺序发生,但组件作者仍然有充分的机会通过自己的方式做事来创造性(或肆虐)。