2011-12-25 5 views
10

Có thể gọi phương thức bean & trực tiếp truyền tham số cho chúng từ chế độ xem thay vì yêu cầu đầu tiên đặt thuộc tính bean và sau đó gọi phương thức không có đối số bằng cách sử dụng commandButton hoặc tương tự?Gọi phương thức bean với đối số từ các trang JSF

Tôi có một danh sách các mục với mỗi mục có danh sách các hành động. Để giảm tiểu bang, tôi đang sử dụng một dấu phẩy đơn lẻ remoteCommand, thay cho một số commandButton (s). Khi nhận được trình kích hoạt hành động từ chế độ xem, tôi sẽ gọi số remoteCommand từ javascript nhưng vì remoteCommand là một nhưng được sử dụng cho nhiều mục nên tôi cũng cần phải chuyển id của mục đó. Tôi tự hỏi nếu có một cách để vượt qua id của mặt hàng để các phương pháp đậu trực tiếp như là một đối số thay vì đầu tiên thiết lập nó như là một tài sản đậu? Có cách nào để làm như vậy không?

Thực ra tôi đang xem một cách tốt hơn để xử lý nhiều lệnh trên một trang khi có một danh sách dài các mục trên trang.

Đề xuất? Cảm ơn.


Sử dụng JSF 2.1.6 cá móm với Primefaces 3.0RC1

Trả lời

18

Đi qua đối số phương pháp được hỗ trợ từ EL 2.2 là một phần của Servlet 3.0. Vì vậy, nếu webapp của bạn chạy trên một thùng chứa tương thích Servlet 3.0 (Tomcat 7, Glassfish 3, v.v.) với thông số Servlet 3.0 được công bố phù hợp (có thể là đúng khi bạn đang sử dụng JSF 2.1, điều này hoàn toàn yêu cầu Servlet 3.0), thì bạn sẽ có thể để vượt qua đối số phương pháp để các phương pháp hành động đậu trong các hình thức sau đây:

<h:commandButton value="Submit" action="#{bean.submit(item.id)}" /> 

với

public void submit(Long id) { 
    // ... 
} 

bạn thậm chí có thể vượt qua đối tượng fullworthy cùng giống như:

<h:commandButton value="Submit" action="#{bean.submit(item)}" /> 

với

public void submit(Item item) { 
    // ... 
} 

Nếu bạn nhắm mục tiêu một container Servlet 2.5, sau đó bạn có thể đạt được như vậy bằng cách thay thế việc thực hiện EL bởi ví dụ JBoss EL mà hỗ trợ các cấu trúc tương tự. Xem thêm Invoke direct methods or methods with arguments/variables/parameters in EL.

+0

cũng có thể có các thẻ hoặc thành phần bên trong không?Khi tôi chuyển đậu cho thành phần/thẻ, tôi gọi phương thức trên thuộc tính chứa bean, ví dụ: 'action =" # {myBean ['actionToCall']} "'. Từ phía trên đầu của tôi, tôi sẽ không biết cách chuyển một tham số trong cú pháp ngoặc đơn khác hơn là thiết lập nó bằng 'f: setPropertyActionListener', và chúng ta cần dấu ngoặc trong các dấu chấm trong trường hợp này, phải không? – Louise

+1

@Louise: chỉ cần sử dụng 'action =" # {myBean ['actionToCall'] (someParam)} "'. Lưu ý rằng cú pháp này có lỗi trong các phiên bản Tomcat và Glassfish cũ hơn. Chỉ kể từ Tomcat 7.0.22 và Glassfish 3.1.2 nó sẽ hoạt động bình thường. – BalusC

+0

Trường hợp "mục" (hoặc "item.id") này xuất phát từ đâu? Nó có thể là một cái gì đó giống như id của p: tab đã chọn trong một p: tabView (các dấu phẩy) không? –

7

Bạn có thể gọi các phương thức ManagedBean với lập luận như thế này.

<h:commandButton actionListener="#{stateBean.delete(row.stateID)}" 
value="Delete" id="btnDeleteS"> 

    <f:ajax event="action" execute="@form" render="@form"/> 
</h:commandButton> 

ManagedBean tương ứng sẽ như thế này.

@ManagedBean 
@RequestScoped 
public class StateBean 
{ 
    @EJB 
    private RemoteInterface obj=null; 

    public void delete(String stateID) 
    { 
     //Code stuff here. 
    } 
} 

Bạn cũng có thể trực tiếp thiết lập giá trị của tài sản ManagedBean sử dụng <f:setPropertyActionListener></f:setPropertyActionListener> như thế này.

<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 tài sản theeActionListener là cách tốt nhất cho tôi – jpganz18