2011-01-25 30 views
5

Trong Primefaces Hướng dẫn mua nó cho thấy ví dụ về làm thế nào để làm cho AJAX gọi đến máy chủSử dụng Primefaces hoạt Javascript để gọi một phương thức JSF trên đậu trên máy chủ

PrimeFaces.ajax.AjaxRequest('/myapp/createUser.jsf', 
{ 
    formId: 'userForm', 
    oncomplete: function(xhr, status) {alert('Done');} 
}); 

Những gì tôi không thể hiểu là như thế nào để gọi một phương thức cụ thể. Mục tiêu của tôi là làm mất hiệu lực phiên từ ứng dụng khách bằng JavaScript.

Trả lời

1

Thực hiện trong phương thức @PostConstruct của đậu phạm vi yêu cầu được liên kết với trang JSF được yêu cầu bởi EL như #{bean}.

@ManagedBean 
@RequestScoped 
public class Bean { 

    @PostConstruct 
    public void init() { 
     // Here. 
    } 

} 

Không liên quan đến câu hỏi, tôi chỉ tự hỏi tại sao bạn đã bao giờ làm điều đó theo cách đó? JSF/PrimeFaces cung cấp nhiều cách đẹp hơn bằng cách sử dụng <f:ajax><p:ajax> và các liên kết.

Có ý định chạy điều này trong các sự kiện unload hoặc beforeunload của Window không? Nếu vậy, sau đó tôi phải cảnh báo bạn rằng điều này là không đáng tin cậy. Nó phụ thuộc vào trình duyệt cho dù một yêu cầu như vậy sẽ thực sự đến được máy chủ hay không. Thường thì nó sẽ không. Chỉ sử dụng nó cho mục đích dọn dẹp thống kê hoặc làm sạch sớm, không nhằm mục đích kinh doanh nhạy cảm.

+0

tôi có thể có, tại bất kỳ thời điểm nào, lên đến 5 ứng dụng đang chạy, mỗi phiên của riêng mình. Khi người dùng chuyển từ ứng dụng sang ứng dụng, tôi giữ các ứng dụng khác "còn sống" để chúng không bị mất thời gian. Tuy nhiên, sau khi ứng dụng "hoạt động" hết thời gian, sau đó tôi cần phải "đăng xuất" những người khác để đảm bảo rằng họ không ở lại xung quanh. Tôi có 1 servlet App, 3 struts Apps và 1 JSF App. Bất kỳ ai có thể là ứng dụng "hoạt động" tại bất kỳ thời điểm nào. –

+1

Nếu chúng chạy ở cùng một vùng chứa, chỉ cần cho phép tất cả cùng chia sẻ cùng một phiên. Trong ví dụ Tomcat, bạn có thể đạt được điều này bằng 'emptySessionPath =" true "' trong '' trong '/ conf/server.xml'. – BalusC

+0

Cảm ơn, đó là những gì tôi đề xuất, nhưng đây là những ứng dụng hiện có đang chạy trên Weblogic. Tôi không nghĩ rằng họ có thể đảm bảo rằng dữ liệu từ một ứng dụng sẽ không va chạm với những người khác. Nói cách khác, tôi không nghĩ rằng họ có thể chia sẻ một phiên duy nhất với ra chà đạp lẫn nhau. –

4

Điều tôi thường làm là đặt p: commandLink ẩn trên trang, sau đó yêu cầu Javascript gọi sự kiện click() trên đó.

<p:commandLink id="hiddenLink" 
    actionListener="#{bean.methodToInvoke}" style="display:none"/> 

Sau đó

$('#hiddenLink').click(); 
+0

Ý tưởng tuyệt vời. Nhưng làm thế nào để vượt qua các thông số cho đậu? –

+0

Phụ thuộc vào việc các tham số đó có được sửa hay cần phải được điều chỉnh phía máy khách thông qua javascript hay không. Nếu chúng không thay đổi, bạn có thể sử dụng thuộc tính f:. Nếu họ có thể thay đổi phía máy khách, tôi đã sử dụng h: inputHidden ở nơi khác trên biểu mẫu để đẩy những người đó đến bean được quản lý. – wrschneider

+0

Trong trường hợp của tôi, phần tử từ KHÔNG được gán cho id "hiddenLink". Thay vào đó, nó được gán cho id "j_idt5: hiddenLink". Vì vậy, tôi không thể tìm thấy nó. – gromit190

16

RemoteCommand là một cách tốt đẹp để đạt được điều đó bởi vì nó cung cấp cho bạn một hàm JavaScript mà không những thứ (gọi ủng hộ đậu, làm mới, gửi một hình thức, vv, tất cả mọi thứ liên kết lệnh đó có thể thực hiện).

Từ PrimeFaces 3.4 documentation:

<p:remoteCommand name="increment" actionListener="#{counter.increment}" 
out="count" /> 

<script type="text/javascript"> 
function customFunction() { 
    //your custom code 
    increment(); //makes a remote call 
} 
</script> 
Các vấn đề liên quan