我试图理解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
方法是从UIComponentBase
类processUpdates(FacesContext)
方法继承而来的,Update Model Values
方法是//1
阶段的标准回调。因此,在javax.el.ValueExpression
设置断点并执行下一步后,流程停止在相应的bean属性setter方法。
我的问题是关于{{1}}的目的。它是否适用于组件类和bean属性之间的所有交互(封装),以便获取/设置bean的属性值?
答案 0 :(得分:3)
h:outputText
与h:inputText
进行比较:两者基本上都采用value="#{some.el}"
属性;一个允许用户修改它的事实是关于组件的事实,而不是bean属性本身的路径。
某些组件定义应该通过引用方法而不是bean属性来填充的属性,但同样,EL只是遍历调用,这些方法是组件所做的事情。在这种情况下,您将处理MethodExpression
而不是ValueExpression
。
JSF生命周期决定事情以某种整体顺序发生,但组件作者仍然有充分的机会通过自己的方式做事来创造性(或肆虐)。