使用JSF页面中的参数调用bean方法

时间:2011-12-25 19:03:29

标签: jsf primefaces

是否可以调用bean方法&直接从视图中将参数传递给它们,而不是要求首先设置bean属性,然后使用commandButton或类似方法调用不带参数的方法?

我有一个项目列表,每个项目都有一个操作列表。为了减少状态,我使用单个素数remoteCommand代替几个commandButton(s)。在从视图中获取动作触发器时,我会从javascript调用remoteCommand,但由于remoteCommand是一个但是用于多个项目,因此我也需要传递项目的ID。我想知道是否有办法将项目的id直接作为参数传递给bean方法,而不是先将其设置为bean属性?有没有办法这样做?

实际上,当页面上有很长的项目列表时,我正在寻找一种更好的方法来处理页面上的多个commandButtons。

建议?感谢。


使用JSF 2.1.6 Mojarra和Primefaces 3.0RC1

3 个答案:

答案 0 :(得分:20)

自从作为Servlet 3.0的一部分的EL 2.2以来,支持传递方法参数。因此,如果您的webapp在Servlet 3.0兼容容器(Tomcat 7,Glassfish 3等)上运行,并且web.xml声明符合Servlet 3.0规范(这可能是正确的,因为您使用的是JSF 2.1,而后者隐含地需要Servlet 3.0),然后您将能够以下列形式将方法参数传递给bean操作方法:

<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容器,那么您可以通过用例如支持相同构造的JBoss EL替换EL实现来实现相同的目的。另请参阅Invoke direct methods or methods with arguments / variables / parameters in EL

答案 1 :(得分:10)

是的,是的。

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

请参阅此http://www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/

答案 2 :(得分:8)

您可以使用这样的参数调用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>