2013-09-03 33 views
9

Câu hỏi này có liên quan chặt chẽ đến this một câu hỏi (đã được trả lời).Gửi chuyển hướng từ bên trong phương thức nghe ajax

Trong suốt dự án, tôi điều hướng giữa các màn hình bằng cách sử dụng các nút lệnh JSF, trong đó thuộc tính action sẽ trỏ đến một hàm trả về một chuỗi. Chuỗi là tên của màn hình mới, ví dụ:

<h:commandButton value="Select" action="#{searchResultsBundledBean.selectFlight}"> 
</h:commandButton> 

selectFlight sẽ trả về một chuỗi, ví dụ: selected-flight-review sẽ hướng người dùng đến selected-flight-review.xhtml

Vì mục đích di động, tôi phải thực hiện một cú nhấp chuột panelGrid bằng cách sử dụng cuộc gọi ajax, ví dụ:

<h:panelGrid> 
    <f:ajax event="click" listener="#{searchResultsBundledBean.clickFlight(lowFareBundledSearchItem)}"/> 
</h:panelGrid 

này hoạt động, tôi đã thử nghiệm nó, và kết quả đúng được trả về (Tested với đăng nhập nó ngay trước khi nó được trả lại)

Tuy nhiên, không chuyển hướng diễn ra. Cuộc gọi ajax vẫn chưa thực hiện. Làm cách nào để chuyển hướng đến một màn hình khác? Tôi không phải gửi qua bất kỳ biến nào, tôi chỉ cần màn hình mới được hiển thị. Tôi có nên sử dụng một cái gì đó khác hơn là ajax (tôi không muốn), hoặc là có một số cách để làm cho công việc này theo cách nó bây giờ?

+0

Bạn đã thử sử dụng '? Faces-redirect = true'? Xem http://stackoverflow.com/a/7928396/1199132 –

+0

Yea, đã thử điều đó. Nó trả về chuỗi được sửa đổi (với chuyển hướng được nối thêm), nhưng nó không thực sự làm bất cứ điều gì với nó. Vấn đề tôi đang mắc kẹt ở đây là ajax không liên kết với commandLink hoặc commandButton – Skytiger

Trả lời

17

Bạn có thể chuyển hướng các phản hồi từ đậu ủng hộ:

public void clickFlight(Item lowFareBundledSearchItem) throws IOException { 
    // ... 
    FacesContext.getCurrentInstance().getExternalContext().redirect("selected-flight-review.xhtml"); 
    FacesContext.getCurrentInstance().responseComplete(); 
} 
+0

Tốt hơn nên chuyển hướng qua NavigationHandler của JSF bằng cách sử dụng kết quả, thay vì sử dụng chuyển hướng URL nguyên cấp servlet. –

+0

Theo thông số kỹ thuật của JSF, bạn phải gọi FacesContext.getCurrentInstance(). ResponseComplete(); sau khi chuyển hướng bằng ngữ cảnh bên ngoài. –

+0

[ExternalContext javadoc] (http://docs.oracle.com/javaee/7/api/javax/faces/context/ExternalContext.html#redirect-java.lang.String-) cho biết: "Chuyển hướng yêu cầu đến URL được chỉ định và khiến phương thức responseComplete() được gọi trên cá thể FacesContext cho yêu cầu hiện tại. " Điều này làm cho tôi nghĩ rằng lời gọi rõ ràng tới 'responseComplete()' là không cần thiết. Có một số văn bản khác trong liên kết đó về cách gọi chuyển hướng hoạt động trong Ajax. – Pixelstix

-2

Chỉ cần thêm trong đậu ủng hộ của bạn trở lại "chọn-bay xem xét"; Bạn không cần phải thêm (.xhtml) Hoặc nếu bạn muốn chuyển hướng trả lại "đã chọn chuyến bay-đánh giá? Faces-redirect = true";

+0

Câu trả lời này không đúng. Câu hỏi hỏi rõ về phương pháp nghe ajax, không phải là phương thức hành động lệnh. Bạn chỉ có thể trả lại một trường hợp điều hướng trong một phương thức hành động lệnh. OP thậm chí đã đề cập rõ ràng điều này trong câu hỏi của ông. – BalusC

Các vấn đề liên quan