2009-11-23 3 views
2

Из-за некоторых пользовательских компонентов, которые ожидают имя компонента (НЕ экземпляр компонента) в своих атрибутах, мне нужно передать фактическое имя компонента между страницами. Поскольку сам компонент также используется нестандартными компонентами, я хотел бы избежать использования дополнительных ui:param (как описано здесь Passing action in <rich:modalPanel>), поскольку он будет по существу определять один и тот же компонент.facelets: передача имени bean с атрибутом ui: param to action

Можно ли указать действие компонента с использованием имени бобов, предоставленного с помощью 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:/templ ate.xhtml @ 201,89 действие = "# {} beanName.delete": Метод не найден: sessionBean.delete()

ответ

5

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

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

Опережаем здесь: bean должен быть уже создан и помещен в область действия - это выражение не создаст управляемый компонент. – McDowell

+0

Спасибо, это решило! – orom

+0

Привет :) Очень интересно. Но что такое «delete», это не параметр тега, а константа? Я имею в виду, должно ли оно быть выражением как '' # {sessionScope [beanName] '. Delete'} "или как скомбинировать выражение в этом случае? – user390525

2
<a4j:commandButton value="test" action="#{bean[action]}" /> 

В PARAMS пройти

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

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

+0

Это именно то, что я хотел бы избежать - определить дополнительные параметров с экземпляром компонента. «Метод не найден: sessionBean.delete()» дал мне подозрение, что возможно как-то использовать bean name (not instance!) Для метода action, поскольку beanName в моем случае, очевидно, правильно разрешено. – orom

 Смежные вопросы

  • Нет связанных вопросов^_^