2016-04-14 5 views
1

Ich habe ein Formular in JSF 2.2:JSF nicht umleiten Anfrage nach Ajax-Datei Eingang

<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> 

Die Funktionen:

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

public void uploadPicture() { 
    // Do nothing 
} 

Aber nachdem ich ein Bild auswählen und den Anruf von uploadPicture Funktion erhalten, Die Funktion save kann die Seite nicht umleiten. Es ruft save, aber die Umleitung funktioniert nicht, und aktualisieren Sie nur die aktuelle Seite.

Wenn ich den Dateiupload überspringe, wird er normal umgeleitet. Wie kann ich es zum Arbeiten bringen?

EDIT
Ich habe bemerkt, dass wenn ich die Ajax entfernen <f:ajax listener="#{bean.uploadPicture}" /> es wie erwartet funktioniert. Aber ich muss diesen Ajax haben, weil ich das Bild nach dem Upload anzeigen möchte.

EDIT 2
Ich kann sehen, dass nach der Ajax genannt, die JSF am unteren Rand der Seite mit partial-response Tag in seinen Körper eine seltsame iframe schafft, und wenn ich ‚Save` drücken dass Iframe leitet zum Ziel um. Warum das??

+0

Welche JSF Impl/Version? Frühe 2.2 Versionen haben Kindheit Bugs mit h: inputFile. Siehe auch http://StackOverflow.com/Tags/JSF/info für Hinweise. – BalusC

+0

@BalusC Wenn ich das JAR des JSF innerhalb der GlassFish Bibliotheken in NetBeans öffne, kann ich 'Bundle-Name: Mojarra JSF Implementation 2.2.12 (20150720-0848) https:/ /svn.java.net/svn/mojarra~svn sehen/tags/2.2.12 @ 14885', Ich benutze auch GlassFish 4.1.1 – nrofis

Antwort

2

Ich reproduzierte es. Ich stimme zu, dass das Verhalten verwirrend und nicht intuitiv ist, aber ich würde nicht sagen, dass dies ein Fehler in der JSF-Implementierung ist, weil Sie Ajax im Wesentlichen mit regulären Anfragen mischen, was an erster Stelle falsch ist. Siehe auch diese verwandte Frage httpError: The Http Transport returned a 0 status code.

Der richtige Ansatz ist entweder die Befehlsverbindung eine Verbindung ajax sowie zu machen,

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

oder<f:ajax> vom <h:inputFile> zu entfernen (und Upload-Verarbeitung in save() zuführen).

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

Die iframe Sie sehen durch die Art und Weise ist der uralte Trick asynchrones Verhalten während des Hochladen von Dateien zu simulieren, erfunden, lange bevor XHR2/FormData API standardisiert wurde. Dieser Ansatz wurde während der Entwicklung von JSF 2.2 gegenüber XHR2 aufgrund der besseren Rückwärtskompatibilität in Webbrowsern (insbesondere MSIE) bevorzugt. Siehe auch a.o. How to make Asynchronous(AJAX) File Upload using iframe?

+0

Ich wusste nicht, dass das Mischen von Ajax mit regulären falsch ist, weil der Ajax nur für die Vorschau des Bildes war. Aber mit '' funktioniert es perfekt. Vielen Dank! – nrofis

-1

Wie ich weiß JSF blockiert Ihre Anfrage bis Ajax Sicherheitsanruf. Vielleicht können Sie während des Ajax-Aufrufs eine Verarbeitungsleiste oder etwas Ähnliches einstellen. Daher kann der Benutzer nicht auf die Schaltfläche "Speichern" klicken, bis der Ajax-Anruf beendet ist.

Können Sie nach dem Klicken auf die Upload-Schaltfläche ein wenig warten und dann auf die Schaltfläche Speichern klicken? Es sollte funktionieren, wenn ich recht habe.

+0

Wenn ich es debugge, drücke ich "Speichern", nachdem 'uploadPicture' endet. Ist nicht gut genug?BTW, ich benutze nur 5KB Fotos, also denke ich nicht, dass es so viel Wartezeit braucht – nrofis

Verwandte Themen