从JSF页面调用带参数的Bean方法

18
有没有可能从视图中直接调用bean方法并向其传递参数,而不需要先设置bean属性,然后使用commandButton或类似的方法调用没有参数的方法?
我有一个项目列表,每个项目都有一系列的操作。为了减少状态,我正在使用单个Primefaces remoteCommand代替几个命令按钮(commandButton)。当从视图获取到操作触发时,我将从javascript调用remoteCommand, 但是由于remoteCommand是一个但用于多个项目,因此我需要传递项目ID。我想知道是否有一种方法可以将项目ID直接作为参数传递给bean方法,而不是首先将其设置为bean属性?有这样的方法吗?
实际上,我正在寻找更好的处理页面上多个命令按钮时的方法,当页面上有很长的项目列表时。
有什么建议吗?谢谢。
使用JSF 2.1.6 Mojarra与Primefaces 3.0RC1
3个回答

25

自EL 2.2开始支持传递方法参数,它是Servlet 3.0的一部分。因此,如果您的Web应用程序在Servlet 3.0兼容的容器(Tomcat 7、Glassfish 3等)上运行,并且使用符合Servlet 3.0规范的web.xml(由于您正在使用JSF 2.1,这很可能是真的),那么您将能够以以下形式向bean action方法传递方法参数:

<h:commandButton value="Submit" action="#{bean.submit(item.id)}" />

使用

public void submit(Long id) {
    // ...
}

你甚至可以像这样传递完整的对象:

<h:commandButton value="Submit" action="#{bean.submit(item)}" />

使用

public void submit(Item item) {
    // ...
}
如果你的目标是一个Servlet 2.5容器,那么你可以通过替换EL实现(例如支持相同结构的JBoss EL)来实现相同的效果。还请参考Invoke direct methods or methods with arguments / variables / parameters in EL

在标签或组件内部是否也可以实现这个功能?当我将一个bean传递给组件/标签时,我会调用保存bean的属性上的方法,例如 action="#{myBean['actionToCall']}"。从我的角度来看,我不知道如何使用括号语法传递参数,除非使用 f:setPropertyActionListener 来设置它,在这种情况下我们需要使用括号而不是点,对吗? - Louise
1
@Louise:只需使用 action="#{myBean['actionToCall'](someParam)}"。请注意,这种语法在旧版Tomcat和Glassfish中存在错误。只有自Tomcat 7.0.22和Glassfish 3.1.2以来,它才能正常工作。 - BalusC
这个“item”(或“item.id”)是从哪里来的?它可以是像在p:tabView(primefaces)中选择的p:tab的id吗? - Miklos Jakab

11

是的,它是。

<h:commandButton action="#{bean.method(object)}" />

请查看这个链接


9
您可以像这样调用带有参数的ManagedBean方法。
<h:commandButton actionListener="#{stateBean.delete(row.stateID)}" 
 value="Delete" id="btnDeleteS">

   <f:ajax event="action" execute="@form" render="@form"/>
</h:commandButton>

相应的ManagedBean将如下所示。
@ManagedBean
@RequestScoped
public class StateBean
{
    @EJB
    private RemoteInterface obj=null;

    public void delete(String stateID)
    {
        //Code stuff here.
    }
}

你也可以直接使用<f:setPropertyActionListener></f:setPropertyActionListener>来设置ManagedBean属性值,像这样。
<h:commandButton value="Delete" id="btnDeleteS">

     <f:setPropertyActionListener target="#{stateBean.someProperty}"
       value="#{someValue}"/>
     <f:ajax event="action" execute="@form" render="@form"/>
</h:commandButton>

2
+1 thee propertyActionListener 是我最喜欢的方式。 - jpganz18

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接