JSF 2.1 ValueExpression в действии-атрибуте - PullRequest
6 голосов
/ 09 сентября 2011

В разделе 3.1.4 спецификации JSF 2.1 сказано, что все атрибуты стандартных компонентов выражение значения включено .

Я хочу назначить выражение значения для атрибута действия commandButton:

<h:commandButton value="OK" action="#{myBean.valExp}" />

Я также определил соответствующие методы getValExp и setValExp в классе компонента.

Однако моя реализация JSF (JBoss 6) использует это выражение как выражение метода и, таким образом, выдает ошибку «метод не найден», потому что нет метода valExp ().

Я что-то не так делаю или спецификация слишком неряшливая и на самом деле означает не все, а только атрибуты выражения, не относящиеся к методу? Или я неправильно понимаю спецификацию?

[Примечание: причина этого вопроса не в технической проблеме, а в том, что я пытаюсь понять разницу в выражениях значения и метода.]

1 Ответ

8 голосов
/ 09 сентября 2011

Выражения значений привязаны к свойствам, предоставляемым общедоступными методами получения / установки.

<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 .

...