0

我有一个包含从列表中填充的数据表的页面。该列表有许多 id,我需要将它们传递给 bean 方法并执行数据库操作。我正在使用 commandButton 的 render 属性来调用 bean 方法 (findInfo())。我需要一次将列表中的 id (myBean.testList.id) 传递给这个 bean 方法,以便我得到布尔值。首先,我不确定如何传递 id(到我的 bean 中的 findInfo 方法),其次,如果我使用标签,我最终只发送一个 ID。谁能给我一个解决方案。我尝试使用以下代码进行操作。

我的豆子

@ManagedBean(name="myBean")
public class MyBean(){

  public boolean findInfo(Integer indId){
    boolean var = dataProvider.isIdPresent(indId); // database operation
    if (var)
        return true;
    else 
        return false;
  }
}

xhtml页面

<h:dataTable value="#{myBean.testList}" var="t" >

  <h:column>
    <f:facet name="header">
        <h:outputText value="Actions" />
    </f:facet>

    <h:commandButton value = "Add"
    action = "#{someBean.loadReport}"
    rendered = "#{myBean.findInfo() == false}"/>

    <h:commandButton value = "View"
    action = "#{someBean.loadReport}"
    rendered = "#{myBean.findInfo() == true}"/>

</h:column>
<h:column>
...
</h:column>
</h:dataTable>

更新: 我试图按照 BalusC 解释的答案(kolossus 发布),我最终在 f:param 中将 id 作为 null 传递。有什么建议么。我更新的代码:

<h:dataTable value="#{myBean.testList}" var="t" >

<h:column>
    <f:facet name="header">
        <h:outputText value="Actions" />
    </f:facet>


    <h:commandButton value = "Add"
    action = "#{someBean.loadReport}"
    rendered = "#{myBean.findInfo() == false}">
        <f:param name="id" value="#{t.id}" /> 

    </h:commandButton>

    <h:commandButton value = "View"
    action = "#{someBean.loadReport}"
    rendered = "#{myBean.findInfo() == true}">
        <f:param name="id" value="#{t.id}" /> 
    </h:commandButton>

</h:column>
<h:column>
...
</h:column>

我更新的 Bean

@ManagedBean(name="myBean")
@RequestScoped
public class MyBean(){

@ManagedProperty("#{param.id}")
private Integer indId;

public boolean findInfo(){
    boolean var = dataProvider.isIndIdPresent(indId);
    if (var)
        return true;
    else 
        return false;
}
}

另外,我认为我不能使用 f:ViewParam,因为我正在同一个视图中从数据表中调用 bean。

4

1 回答 1

2

首先,您应该将您的 bean 声明为@ViewScoped. 然后,你可以保持你的findInfo方法如下:

@ManagedBean(name="myBean")
@ViewScoped
public class MyBean(){
    private List testList;    

    public boolean findInfo(Integer indId){ ... }

    // Getters and Setters
}

以下代码段应该可以完成这项工作:

<h:dataTable value="#{myBean.testList}" var="t" >
    <h:column>
        <h:commandButton value="Add" action="#{someBean.loadReport}"
                         rendered="#{not myBean.findInfo(t.id)}" />

        <h:commandButton value="View" action="#{someBean.loadReport}"
                         rendered="#{myBean.findInfo(t.id)}" />
    </h:column>
</h:dataTable>

更新:由于您没有使用 EL 2.2,因此您可能需要在呈现表格之前处理每一行的布尔值。将对象包装在testList一个包含布尔值的虚拟对象内部应该可以完成这项工作:)。像这样的东西:

@ManagedBean(name="myBean")
@ViewScoped
public class MyBean(){
    private List<DummyObject> testList;    

    @PostConstruct
    public boolean prepareTestList(){ 
        // Initiate test list
        List<AnObject> oriList = ....;

        // Process oriList to create a testList
        this.testList = new LinkedList();
        for (AnObject o : oriList) {
            DummyObject do = new DummyObject();
            do.setObject(o);
            do.setIdPresent(findInfo(o.getId()));
            this.testList.add(do);
        }
    }

    public boolean findInfo(Integer indId) { ... }

    public class DummyObject {
       private boolean  idPresent;
       private AnObject object;

       // Getters and Setters
    }

    // Getters and Setters
}

那么你的rendered属性应该是这样的:

<h:commandButton value="View" action="#{someBean.loadReport}"
                 rendered="#{t.idPresent}" />
于 2013-03-29T07:42:05.323 回答