Выражения значений привязаны к свойствам, предоставляемым общедоступными методами получения / установки.
<h:inputText value="#{bean.value}" />
Для этого требуются методы public T getValue()
и public void setValue(T value)
. Обратите внимание, что наличие свойства private T value;
с буквально одинаковым именем не обязательно. В чистых компонентах вывода, таких как <h:outputText>
, <h:dataTable>
, <f:selectItems>
и т. Д., Метод установки также не обязателен.
Выражения методов привязаны к не получающим / устанавливающим методам (методам "действия").
<h:commandButton value="submit" action="#{bean.submit}" />
Для этого требуется метод public T submit()
, где T
может в конечном итоге быть void
, а метод может в конечном итоге принимать дополнительные аргументы, в зависимости от сигнатуры выражения метода атрибута. Точную информацию можно прочитать в документации по языку декларации , например, <h:inputText>
, <h:commandButton>
и <f:ajax>
те. Вот выдержка из определений атрибутов action
и 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".
Да, я согласен, что спецификация несколько небрежна в утверждении, что все атрибуты поддерживают выражения значений. Как правило, они фактически означают, что все атрибуты поддерживают язык выражений, как в #{}
. С другой стороны, вы также можете интерпретировать выражения методов, как если бы они были просто «особыми» выражениями значений, хотя это не совсем так. Я опубликовал отчет о проблеме спецификации с просьбой прояснить некоторую путаницу: выпуск 1036 .