2013-09-03 16 views
9

Bu soru this one (ilgili yanıtlama) ile yakından ilgilidir.Bir ajax listener yönteminden bir yönlendirici gönderme

Projem boyunca, eylem özniteliğinin bir dize döndüren bir işlevi göstereceği JSF komut düğmelerini kullanarak ekranlar arasında geziniyorum. Dize, yeni ekranın adıdır.

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

selectFlight bir dize dönecekti, mesela selected-flight-review, kullanıcıyı selected-flight-review.xhtml 'a yönlendirir.

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

, bunu test ettik ve doğru sonucu döndürülür

Ancak, hiçbir yönlendirme gerçekleşir (o geri verdikten hemen önce giriş ile test edilmiştir). Ajax çağrısı henüz yapmıyor. Başka bir ekrana yönlendirmeyi nasıl yapabilirim? Herhangi bir değişkene göndermek zorunda değilim, sadece görüntülenecek yeni ekrana ihtiyacım var. Ajax dışında bir şey kullanmalı mıyım (yapmayı tercih etmemeliydim), yoksa bu işi şu anki haliyle yapmanın bir yolu var mı?

+0

“? Faces-redirect = true” ekli ile çalıştınız mı? Bunu zaten denediniz http://stackoverflow.com/a/7928396/1199132 –

+0

Yea. Değiştirilmiş dizeyi (eklenen yönlendirmeyle) döndürür, ancak aslında onunla hiçbir şey yapmaz. Burada takıldığım sorun ajax'ın bir commandLink veya commandButton – Skytiger

cevap

17

Sen yedekleme fasulye yanıtı yönlendirebilirsiniz:

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

ile ilişkilendirilmemesidir. Servlet düzeyinde ham URL yönlendirme kullanmak yerine, sonuçları kullanarak JSF's NavigationHandler aracılığıyla yeniden yönlendirmek daha iyidir. –

+0

JSF özelliklerine göre, FacesContext.getCurrentInstance(). ResponseComplete(); dış bağlam kullanarak yeniden yönlendirme. –

+0

[ExternalContext javadoc] (http://docs.oracle.com/javaee/7/api/javax/faces/context/ExternalContext.html#redirect-java.lang.String-) şöyle diyor: "Bir isteği yeniden yönlendir Belirtilen URL ve geçerli isteğin FacesContext örneğinde çağrılması için responseComplete() yönteminin kullanılmasına neden olur. " Bu bana 'responseComplete() 'için açık çağrıya gerek olmadığını düşünmemi sağlıyor. Ajax altında yeniden yönlendirme çağrısının nasıl yapıldığına dair bu linkte başka bir metin var. – Pixelstix

-2

Sadece "uçuş-yorum seçilen" senin yedekleme fasulye dönüş ekleyin; (.xhtml) 'u eklemeniz gerekmez. Veya yönlendirmeyi yeniden yönlendirmek isterseniz "selected-flight-review? Faces-redirect = true";

+0

Bu cevap yanlış. Soru, bir ajax dinleyici yöntemi hakkında açık bir şekilde sorulmakta, bir komut eylemi yöntemi değildir. Bir navigasyon durumunu sadece bir komut eylemi yönteminde döndürebilirsiniz. OP bile bu sorunda açıkça belirtmiştir. – BalusC