JSF 2.1规范的第3.1.4节说明标准组件的所有属性是值表达式启用。
我想为commandButton的action属性赋值表达式:
<h:commandButton value="OK" action="#{myBean.valExp}" />
我还在bean的类中定义了相应的getValExp和setValExp方法。
然而,我的JSF实现(JBoss 6)将该表达式作为方法表达式,因此产生“找不到方法”错误,因为没有valExp() - 方法。
我做错了什么,或者规范是否过于草率并且实际上并不意味着全部,而只是非方法表达属性?或者我误解了规范?
[备注:这个问题的原因不是实际的技术问题,而是我试图理解价值和方法表达的区别。]
答案 0 :(得分:8)
值表达式绑定到公共getter / setter方法公开的属性。
<h:inputText value="#{bean.value}" />
这需要public T getValue()
和public void setValue(T value)
方法。请注意,private T value;
属性的字面名称完全相同,不是是必需的。在纯<h:outputText>
,<h:dataTable>
,<f:selectItems>
等输出组件中,setter方法也不是必需的。
方法表达式绑定到非getter / setter方法(“action”方法)。
<h:commandButton value="submit" action="#{bean.submit}" />
这需要public T submit()
方法,其中T
最终可以是void
,并且该方法最终可以采用其他参数,具体取决于属性的方法表达式签名。您可以在view declaration language documentation中阅读确切的详细信息,例如<h:inputText>
,<h:commandButton>
和<f:ajax>
。以下是action
的{{1}}和actionListener
属性定义的摘录:
<h:commandButton>
是的,我同意该规范有点草率,声明所有属性支持值表达式。通常,它们实际上意味着所有属性都支持表达式语言,如Name: action
Type: javax.el.MethodExpression (signature must match java.lang.Object
action())
Description: MethodExpression representing the application action to invoke when
this component is activated by the user. The expression must
evaluate to a public method that takes no parameters, and returns an
Object (the toString() of which is called to derive the logical
outcome) which is passed to the NavigationHandler for this
application.
Name: actionListener
Type: javax.el.MethodExpression (signature must match void
actionListener(javax.faces.event.ActionEvent))
Description: MethodExpression representing an action listener method that will be
notified when this component is activated by the user. The
expression must evaluate to a public method that takes an
ActionEvent parameter, with a return type of void, or to a public
method that takes no arguments with a return type of void. In the
latter case, the method has no way of easily knowing where the event
came from, but this can be useful in cases where a notification is
needed that "some action happened".
中所示。另一方面,您也可以将方法表达式解释为它们只是“特殊”值表达式,尽管它们并非如此。我已经发布了一个关于此问题的规范问题报告,要求澄清一些混淆:issue 1036。