是否可以调用bean方法&直接从视图中将参数传递给它们,而不是要求首先设置bean属性,然后使用commandButton或类似方法调用不带参数的方法?
我有一个项目列表,每个项目都有一个操作列表。为了减少状态,我使用单个素数remoteCommand
代替几个commandButton
(s)。在从视图中获取动作触发器时,我会从javascript调用remoteCommand
,但由于remoteCommand
是一个但是用于多个项目,因此我也需要传递项目的ID。我想知道是否有办法将项目的id直接作为参数传递给bean方法,而不是先将其设置为bean属性?有没有办法这样做?
实际上,当页面上有很长的项目列表时,我正在寻找一种更好的方法来处理页面上的多个commandButtons。
建议?感谢。
使用JSF 2.1.6 Mojarra和Primefaces 3.0RC1
答案 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>