2011-12-25 73 views
10

是否可以調用Bean方法&直接從視圖向它們傳遞參數,而不是先要設置bean屬性,然後使用commandButton或類似方法調用沒有參數的方法?從JSF頁面調用具有參數的bean方法

我有一個項目列表,每個項目都有一個操作列表。爲了減少這種狀態,我使用了一個單一的基數remoteCommand,而不是幾個commandButton(s)。在從視圖中獲取動作觸發器時,我會從javascript調用remoteCommand,但由於remoteCommand是一個但用於多個項目,因此我需要傳遞該項目的ID。我想知道是否有一種方法將項目的id直接作爲參數傳遞給bean方法,而不是先將其設置爲bean屬性?有沒有辦法做到這一點?

實際上,我正在尋找一種更好的方法來處理頁面上多項命令按鈕,當頁面上有一長串項目時。

建議?謝謝。


使用JSF 2.1.6鑽嘴魚科用Primefaces 3.0RC1

回答

18

傳遞方法的參數,因爲EL 2.2也就是Servlet 3.0的一部分被支撐。因此,如果您的web應用程序在一個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) { 
    // ... 
} 

你甚至可以通過fullworthy對象一起類似爲:

<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

+0

這也可以在標籤或組件?當我將一個bean傳遞給組件/標籤時,我會調用包含該bean的屬性的方法,例如'動作= 「#{爲myBean [ 'actionToCall']}」'。從頭開始,我不知道如何在括號內傳遞一個參數,而不是用'f:setPropertyActionListener'來設置它,在這種情況下,我們需要在點上加括號,對不對? – Louise 2012-08-24 15:46:33

+1

@Louise:只需使用'action =「#{myBean ['actionToCall'](someParam)}」'。請注意,此語法在舊版Tomcat和Glassfish版本中存在一個錯誤。只有從Tomcat 7.0.22和Glassfish 3.1.2開始,它才能正常工作。 – BalusC 2012-08-24 15:53:19

+0

「item」(或「item.id」)來自哪裏?它可以像p:tabView(primefaces)中所選p:tab的id一樣嗎? – 2017-10-27 12:48:48

7

你可以調用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> 
+2

+1你的propertyActionListener是我最好的方式 – jpganz18 2014-06-10 09:08:54