2013-03-28 41 views
0

我有一個包含從列表填充的數據表的頁面。該列表有許多ID,我需要傳遞給bean方法並執行數據庫操作。我使用commandButton的呈現屬性來調用bean方法(findInfo())。我需要從列表中一次一個地傳遞一個ids(myBean.testList.id)給這個bean方法,這樣我就可以返回布爾值。首先,我不知道如何傳遞id(到我的bean中的findInfo方法),其次,如果我使用標籤,我最終只發送一個ID。任何人都可以請給我一個解決方案。我試着用下面的代碼來做這件事。將參數從JSF 2.0中的視圖/頁面中的數據表傳遞給bean方法

我的豆

@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> 

UPDATE: 我試圖遵循BalusC的解釋(即kolossus發佈)的答案,我結束了傳遞ID爲空在f:param中。有什麼建議麼。我更新的代碼:

<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> 

我的更新豆

@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。

+0

可能重複(http://stackoverflow.com/questions/ 9701590 /傳遞參數之間管理的豆與請求範圍) – kolossus

+0

@kolossus我試圖根據您提到的帖子更改我的代碼。但它沒有奏效。我粘貼了我更新的代碼。任何幫助讚賞。 – mona

+0

「沒有工作」.equals(「?」)。 :)它沒有參數返回null?它是否拋出異常?這些都是灼燒的問題@mona。希望你不要忘記爲'indId'添加getter和setter(我在這裏看不到它),你的'@ RequestScoped'來自'javax.faces.bean'包。作爲最後一種選擇,您可以直接在標記'action =「#{someBean.loadReport(t.id)}」'中傳遞變量,並相應地更改您的方法簽名。這僅適用於使用EL2.2的JSF – kolossus

回答

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> 

UPDATE:既然你不使用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屬性應該是這樣的:有請求範圍管理bean之間傳遞參數]的

<h:commandButton value="View" action="#{someBean.loadReport}" 
       rendered="#{t.idPresent}" /> 
+0

OP不能使用'not myBean.findInfo(t。 id)',她不在EL 2.2上 – kolossus