了解 javax.el.ValueExpression 目的
Understanding javax.el.ValueExpression purpose
我想了解 UIInput
组件和 EL 表达式在 JSF 中的工作原理。下面是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
方法由继承自 UIComponentBase
class processUpdates(FacesContext)
方法调用,这是 Update Model Values
阶段。因此,在 //1
处设置断点并执行下一步后,流程在相应的 bean 属性 setter 方法处停止。
我的问题是关于 javax.el.ValueExpression
的目的。它是否负责组件 class 和 bean 的 属性 之间的所有交互(封装)以便 getting/setting 值成为 bean 的属性?
EL 类似于 "path" 并且需要导航 bean。 UIInput 是由您的 bean 表示的 MVC "view" 到 MVC "model"。 EL 将两者联系在一起。它只封装了遍历本身。它标识交互的主题,但交互由组件 class 定义。比较 h:outputText
和 h:inputText
:两者基本上都带有 value="#{some.el}"
属性;允许用户修改它的事实是关于组件的事实,而不是 bean 属性 本身的路径。
一些组件定义的属性应该通过对方法的引用而不是 bean 属性来填充,但同样,EL 只是遍历——调用这些方法是组件所做的事情。在那种情况下,您将处理 MethodExpression
而不是 ValueExpression
.
JSF 生命周期规定事情按一定的总体顺序发生,但组件作者仍然有充足的机会通过按照自己的方式做事来发挥创造力(或造成破坏)。
我想了解 UIInput
组件和 EL 表达式在 JSF 中的工作原理。下面是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
方法由继承自 UIComponentBase
class processUpdates(FacesContext)
方法调用,这是 Update Model Values
阶段。因此,在 //1
处设置断点并执行下一步后,流程在相应的 bean 属性 setter 方法处停止。
我的问题是关于 javax.el.ValueExpression
的目的。它是否负责组件 class 和 bean 的 属性 之间的所有交互(封装)以便 getting/setting 值成为 bean 的属性?
EL 类似于 "path" 并且需要导航 bean。 UIInput 是由您的 bean 表示的 MVC "view" 到 MVC "model"。 EL 将两者联系在一起。它只封装了遍历本身。它标识交互的主题,但交互由组件 class 定义。比较 h:outputText
和 h:inputText
:两者基本上都带有 value="#{some.el}"
属性;允许用户修改它的事实是关于组件的事实,而不是 bean 属性 本身的路径。
一些组件定义的属性应该通过对方法的引用而不是 bean 属性来填充,但同样,EL 只是遍历——调用这些方法是组件所做的事情。在那种情况下,您将处理 MethodExpression
而不是 ValueExpression
.
JSF 生命周期规定事情按一定的总体顺序发生,但组件作者仍然有充足的机会通过按照自己的方式做事来发挥创造力(或造成破坏)。