Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 理解javax.el.ValueExpression的用途_Jsf_Jsf 2_El - Fatal编程技术网

Jsf 理解javax.el.ValueExpression的用途

Jsf 理解javax.el.ValueExpression的用途,jsf,jsf-2,el,Jsf,Jsf 2,El,我试图理解JSF中UIInput组件和EL表达式的工作原理。以下是UIInput组件源代码的代码片段: public void updateModel(FacesContext context) { if (context == null) { throw new NullPointerException(); } if (!isValid() || !isLocalValueSet()) { r

我试图理解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}" />
据我所知,
updateModel
方法由继承自
UIComponentBase
class
processUpdates(FacesContext)
方法调用,该方法是
更新模型值
阶段的标准回调。所以,在
//1
处设置断点并执行下一步后,流在相应的bean属性setter方法处停止

我的问题是关于
javax.el.ValueExpression
的用途。它是否负责组件类和bean属性之间的所有交互(incapscales),以便获取/设置bean属性的值?

EL就像一条“路径”,需要导航bean。UIInput是由bean表示的MVC“模型”的MVC“视图”。EL将两者联系在一起。它只封装遍历本身。它标识交互的主体,但交互是由组件类定义的。比较
h:outputText
h:inputText
:两者基本上都采用
value=“#{some.el}”
属性;允许用户修改的事实是关于组件的事实,而不是bean属性本身的路径

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


JSF生命周期要求事情以一定的总体顺序发生,但组件作者仍然有足够的机会通过自己的方式进行创造性(或破坏)。

那么为什么在调用
ValueExpression.setValue(ELContext,Object)时总是设置bean属性这对我来说似乎是90%的重点…为什么你会感到惊讶或困惑?如果不允许用户编辑值,整个JSF概念将非常有限。不,我问的是,值表达式是否专门设计用于通过它们与bean的属性进行交互?EL的设计使通过JavaBean对象图提供路径变得容易,最终目的地通常是值,但它也可以是非JavaBean方法。正如您所知,ValueExpressions可以将该位置的值替换为另一个值,这几乎是任何UIInput的基本功能。如果这不能回答您的问题,您需要重申一下。有一点需要澄清:我们可以说值表达式以JavaBean样式(即getValue(),setValue())表示值访问吗?
@ManagedBean
@SessionScoped
public class MyBean{
    private String hello;
    //getter,setter
}