facelets: передача имени bean-компонента с помощью ui:param для атрибута action

Из-за некоторых пользовательских компонентов, которые ожидают имя бина (НЕ экземпляр бина) в своих атрибутах, мне нужно передать фактическое имя бина между страницами. Поскольку сам компонент также используется не пользовательскими компонентами, я бы хотел избежать использования дополнительных ui:param (как описано здесь Передача действия в ;), поскольку он по существу будет указывать один и тот же компонент.

Можно ли указать действие компонента, используя имя компонента, предоставленное ui:param?

В основном я пытаюсь добиться следующего:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/template.xhtml">

   <ui:param name="beanName" value="sessionBean"/>
   ...

</ui:composition>

и template.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
template="/someothertemplate.xhtml">

  </ui:define name="somename">
    <h:form>
        <a4j:commandButton value="test" action="#{beanName.delete}"/>
    </h:form>
  </ui:define>
</ui:composition>

Хотя метод удаления определен правильно (проверено с помощью action="#{sessionBean.delete}") приведенный выше код дает мне

javax.faces.FacesException: #{beanName.delete}: javax.el.MethodNotFoundException: /template.xhtml @201,89 action="#{beanName.delete}": метод не найден: sessionBean.delete()

2 ответа

Решение

Вы должны иметь возможность ссылаться на bean-компонент через его область действия:

 <a4j:commandButton value="test"
      action="#{sessionScope[beanName].delete}"/>
<a4j:commandButton value="test" action="#{bean[action]}" />

Параметры для передачи

<ui:param name="bean" value="#{sessionBean}" />
<ui:param name="action" value="delete" />

ты можешь использовать #{bean['delete']} если имя вашего действия фиксировано.

Другие вопросы по тегам