facelets:使用ui:param将bean名称传递给action属性

时间:2009-11-23 14:01:15

标签: jsf facelets ajax4jsf

由于某些自定义组件在其属性中需要bean名称(而不是bean实例),我需要在页面之间传递实际的bean名称。由于bean本身也被非自定义组件使用,我想避免使用额外的ui:param(如此处所述Passing action in <rich:modalPanel>),因为它基本上会指定相同的bean。

是否可以使用ui:param提供的bean名称指定组件的操作?

基本上我正在努力实现以下目标:

<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 个答案:

答案 0 :(得分:5)

您应该能够通过其范围引用bean:

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

答案 1 :(得分:2)

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

传递的参数

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

如果您的操作名称已修复,则可以使用#{bean['delete']}