Facelets:使用 ui:param 将 bean 名称传递给操作属性

发布于 2024-08-12 07:29:49 字数 1323 浏览 2 评论 0原文

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

Due to some custom components which expect a bean name (NOT the bean instance) in their attributes I need to pass the actual bean name between pages. As the bean itself is also used by non-custom components, I would like to avoid using additional ui:param (like described here Passing action in <rich:modalPanel>) since it will essentially specify the same bean.

Is it possible to specify component's action using bean name provided with ui:param?

Basically I am trying to achieve the following:

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

and template.xhtml is

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

Although delete method is properly defined (verified with action="#{sessionBean.delete}") the above code gives me

javax.faces.FacesException: #{beanName.delete}: javax.el.MethodNotFoundException: /template.xhtml @201,89 action="#{beanName.delete}": Method not found: sessionBean.delete()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

陌伤浅笑 2024-08-19 07:29:50

您应该能够通过其作用域引用该 bean:

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

You should be able to reference the bean via its scope:

 <a4j:commandButton value="test"
      action="#{sessionScope[beanName].delete}"/>
因为看清所以看轻 2024-08-19 07:29:50
<a4j:commandButton value="test" action="#{bean[action]}" />

传递的参数。

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

如果您的操作名称是固定的,则可以使用 #{bean['delete']}

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

The params to pass

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

you can use #{bean['delete']} if your action name is fixed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文