【问题标题】:Passing parameters to a bean method from a datatable within a view/page in JSF 2.0从 JSF 2.0 中的视图/页面中的数据表将参数传递给 bean 方法
【发布时间】:2013-03-19 09:09:18
【问题描述】:

我有一个包含从列表中填充的数据表的页面。该列表有许多 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。

【问题讨论】:

  • @kolossus 我尝试根据您提到的帖子更改我的代码。但它没有用。我粘贴了我更新的代码。任何帮助表示赞赏。
  • "没用".equals("?")。 :) 参数是否返回 null?它抛出异常了吗?这些是@mona 亟待解决的问题。希望您不要忘记为indId 添加getter 和setter(我在此处的任何地方都看不到),并且您的@RequestScoped 来自javax.faces.bean 包。作为最后的替代方案,您可以直接在标记action = "#{someBean.loadReport(t.id)}" 中传递变量,并相应地更改您的方法签名。这仅适用于使用 EL2.2 的 JSF
  • f:param 返回 null 给托管 bean。我有 indId 的 getter/setter,@RequestScoped 来自 javax.faces.bean 包,但我无法在我的 bean 中获取 indId。我没有将 JSF 与 EL2.2 一起使用,因此不能选择您建议的最后一个替代方案。上面粘贴的更新代码是我现在所做的所有更改。感谢您的建议,如果您认为我应该添加更多内容,请告诉我......谢谢
  • 我完全忽略了渲染条件。您的渲染条件非常复杂:它取决于在评估值时始终为 0 的值。要验证这是现在问题的根本原因,请将其删除并尝试传递参数。最终,要修复,在使用@PostConstruct 注释的方法中执行检查,并在渲染条件中使用eq 运算符(而不是==

标签: jsf-2 datatable parameter-passing


【解决方案1】:

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

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

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

    // Getters and Setters
}

下面的 sn-p 应该可以完成这项工作:

<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}" />

【讨论】:

  • OP 不能使用not myBean.findInfo(t.id),她不在 EL 2.2 上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2011-08-04
  • 2012-01-26
  • 2014-02-09
  • 2012-12-19
相关资源
最近更新 更多