2016-04-14 34 views
1

後要求我在JSF 2.2的一種形式:JSF沒有重定向文件輸入阿賈克斯

<h:form enctype="multipart/form-data"> 
    <h:outputLabel>title *</h:outputLabel> 
    <h:inputText value="#{bean.title}" required="" /> 

    <h:outputLabel>Image *</h:outputLabel> 
    <h:inputFile value="#{bean.picutreFile}" a:accept="image/*"> 
     <f:ajax listener="#{bean.uploadPicture}" /> 
    </h:inputFile> 

    <h:commandLink action="#{bean.save}"> 
     Save 
    </h:commandLink> 
</h:form> 

功能:

public String save() { 
    return "/index?faces-redirect=true"; 
} 

public void uploadPicture() { 
    // Do nothing 
} 

但之後我選擇的圖像,並得到uploadPicture函數的調用, save函數不能重定向頁面。它調用save但重定向不起作用,只刷新當前頁面。

如果我跳過文件上傳,它會正常重定向。我怎樣才能使它工作?

編輯
我注意到,如果我刪除了ajax <f:ajax listener="#{bean.uploadPicture}" />它按預期工作。但我必須擁有該AJAX,因爲我想在上傳後顯示圖像。

EDIT 2
我可以看到,所謂的阿賈克斯之後,JSF在它的身體產生在頁面底部的奇怪的IFRAME與​​標籤,當我按「Save` iframe是重定向到目的地。這是爲什麼??

+0

哪個JSF impl/version?早期的2.2版本與h:inputFile有童年的錯誤。有關提示,另請參閱http://stackoverflow.com/tags/jsf/info。 – BalusC

+0

@BalusC當我在NetBeans的GlassFish庫中打開JSF的JAR時,我可以看到'Bundle-Name:Mojarra JSF Implementation 2.2.12(20150720-0848)https:/ /svn.java.net/svn/mojarra~svn/tags/2.2.12 @ 14885',我也使用GlassFish 4.1.1 – nrofis

回答

2

我轉載了它。我確實認爲這種行爲是令人困惑和不直觀的,但我不會說這是JSF實現中的一個錯誤,因爲你基本上將ajax與常規請求混合在一起,這在第一時間是錯誤的。請參閱此相關問題httpError: The Http Transport returned a 0 status code

正確的做法是要麼使命令鏈接的AJAX鏈接,以及,

<h:commandLink action="#{bean.save}"> 
    Save 
    <f:ajax execute="@form" /> 
</h:commandLink> 

以除去從<h:inputFile><f:ajax>(和在save()執行上載處理)。

<h:inputFile value="#{bean.picutreFile}" a:accept="image/*" /> 

該iframe,你所看到的是順便把古老的伎倆在文件上傳到模擬異步行爲,XHR2/FormData API被標準化之前發明長。由於Web瀏覽器(特別是MSIE)具有更好的向後兼容性,因此這種方法在JSF 2.2開發中優先於XHR2。另見a.o. How to make Asynchronous(AJAX) File Upload using iframe?

+0

我不知道混合Ajax與常規是錯誤的,因爲Ajax只是用於圖像的顯示預覽。但是用''它的作品完美。謝謝! – nrofis

-1

據我所知,JSF阻止你的請求,直到ajax呼叫安全。也許你可以把一個處理欄或類似的東西,而阿賈克斯調用。所以用戶不能點擊保存按鈕,直到Ajax調用完成。

點擊上傳按鈕後,點擊保存按鈕,你能等一會兒嗎?它應該工作如果我是對的。

+0

當我調試它時,我在'uploadPicture'結束後按下「保存」。不夠好?順便說一句,我只使用5KB的照片,所以我不認爲它需要這麼多的等待時間 – nrofis