JSF - Submit nach Validation-Failed

fsicher

Bekanntes Mitglied
Hallo allerseits.

Ich habe in einem Projekt PrimeFaces (3.4.2) im Einsatz, aber das Problem, das ich habe, ist vermutlich JSL-Problem (oder auch nicht ...).

Ich habe eine Seite, die für die Eingabe von Daten verwendet wird. Von 36 Inut-Felder sind ca. 20 'required'. Die Verteilung von Eingeabe-Felder habe ich mit TabView und AccordionPanel-Komponenten realisiert: sieht an sich gut aus und funktioniert auch. Was ist dann das Problem?

Wenn aus die Schaltfläche "Speichern" (commandButton) gelickt wird, wobe nich alle Inputs 'valid' sind, werden alle Felder mit 'invalid' Inhalten entsprechend markiert und anschliessend die Tab-Componente (aus TabView) geöffnet, in der die erste Komponente enthalten ist, die einen 'invalid' Inhalt hat. Wenn ich jetzt in diesem Tab alle 'invalid' Inhalte korrigiere und anschliessend auf 'Speichern' klicke, würde ich erwarten, dass danach automatisch das Tab geöffnet wird, in dem die nächste Komponente mit einem 'invalid' Inhalt enthalten ist. Leider passiert dies nicht:

  • nach dem Klick auf 'Speichern' werden die zuvor korrigierten Input-Felder Inhalte validiert, die Anzeige bleibt auf dem gleichen Tab, die Markierung wird aufgehoben (da Inhalte nicht mehr 'invalid').
  • nach dem zweiten Klick auf 'Speichern' wird das Tab angezeigt, in dem die nächste 'invalid'-Komponente enthalten ist.

Kurz gesagt: ich muss die Schaltfläche 'Speichern' zweimal anklicken, was ich unschön finde. Wie könnte man dies beheben?

Der Code für 'commandButton' sieht wie folgt aus:

[XML]
<p:commandButton value="#{msg.lbl_btn_save}"
title="#{msg.btn_data_speichern_tooltip}"
actionListener="#{dataManagedBean.save(dataBean)}"
update=":frm_add_data"
oncomplete="if (args.validationFailed){tabs.select(#{dataManagedBean.activeIndex})}" />
[/XML]

Der Wert für 'activeIndex' wird in der Methode 'getActiveIndex' so manipuliert, dass er den Indexwert des nächsten 'invalid'-Tabs bekommt, falls weitere 'invalid'-Komponenten existieren sollten. ActiveIndex wird korrekt bestimmt (durch Logging kontrolliert), leider fehlt das "Umschalten" auf das nächste 'invalid'-Tab.

Wenn ich keine Tabs hätte, wäre dies an sich kein Problem, da alle Felder sofort sichtbar. Mit Tabs muss ich die Schaltfläche 'Speichern' einmal mehr anklicken, um die Anzeige des nächsten 'invalid' Tabs zu realisieren.

Vielen Dank für jeden Tipp.
 
Zuletzt bearbeitet:

fsicher

Bekanntes Mitglied
Hm, habe mit Vizard noch nicht gearbeitet. Aber sieht wirklich danach aus, als ob das ein guter Ansatz wäre. Ich werde es mir noch etwas genauer anschauen müssen ...

Vielen Dank.
 

fsicher

Bekanntes Mitglied
Hallo allerseits

Habe jetzt die Implementierung mit Wizard gemacht und es funktioniert. Nun müsste ich jetzt auch in der Lage sein, ein RESET an einem beliebigen Ort (Tab) durchzuführen:

  1. Alle Input-Felder sollten dabei resetet werden (Textfelder leer)
  2. Das erste Tab soll angezeigt werden.

Leider funktioniert das nur dann, wenn alle Eingaben 'valid' sind. Sobald die Validierung misslingt, funktioniert das RESETen nicht mehr.

Ich habe es wie folgt gemacht:
- BackingBean wird resetet (SessionScoped - kann nicht ViewScoped sein)
- Umschliessendes Formular updatet

Java:
public void reset() {
    // reset bean: alle Felder werden auf null / 0 / false gesetzt (Meth. 'reset' in DataBean implementiert)
    ((DataBean) FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap().get("dataBean")).reset();
}

Kontextmenu:
[XML]
<p:contextMenu>
<p:menuitem value="#{msg.lbl_btn_reset}" actionListener="#{dataManagedBean.reset}" update="@form" icon="ui-icon-trash" oncomplete="addWizard.loadStep(addWizard.cfg.steps[0], true)" />
</p:contextMenu>
[/XML]

Das Reseten des Beans habe ich auf wie folgt versucht, aber auch ohne Erfolg:

Java:
public void reset() {
    // reset bean
   FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap().put("dataBean", new DataBean());
}

Wie gesagt: Wenn alle eingegebene Werte 'valid' sind, funktioniert das RESETen korrekt. Aber, wie müsste man das Reseten implementieren, damit es auch dann funktioniert, wenn die Validierung misslingt?

Danke für jeden Tipp.
 
Zuletzt bearbeitet:

fsicher

Bekanntes Mitglied
Vielen Dank.

Habe es gerade versucht, bin aber immer noch nicht ganz am Ziel ;-)

[XML]
<p:contextMenu>
<p:menuitem value="#{msg.lbl_btn_reset}" actionListener="#{dataManagedBean.reset}" update="@form" icon="ui-icon-trash" oncomplete="addWizard.loadStep(addWizard.cfg.steps[0], true)" immediate="true"/>
</p:contextMenu>
[/XML]

Komischerweise werden alle Eingaben resetet, ausser 'valid' Eingaben in dem Tab, in dem die Validierung nicht geklappt hat. Konkret:

TAB 1: drei InputFelder --> Eingaben korrekt --> Next
TAB 2: drei InputFelder --> Eingaben korrekt --> Next
TAB 3: drei InputFelder --> die letzte Eingabe nicht korrekt --> Next -- > VALIDATION FAILD, kann nicht weiter gehen.

Wenn ich jetzt im KontextMenu 'Reset' anklicke, wird das TAB 1 angezeigt.

TAB 1: alle InputFelder leer --> Eingaben (korrekt) werden gemacht --> Next
TAB 2: alle InputFelder leer --> Eingaben (korrekt) werden gemacht --> Next
TAB 3: InputFelder mit 'valid' Inhalten wurden nicht resetet (Inhalte weiterhin angezeigt), während das InputFeld mit dem 'invalid' Inhalt resetet wurde.

Es entsteht der Eindruck, dass die Inhalte, die validiert werden konnten (nach dem Klick auf Next), auch resetet werden können, asser der valid-Feld im TAB 3, da die Verarbeitung von Inhalten in dem Tab nicht zu Ende geführt werden konnte.
 

fsicher

Bekanntes Mitglied
Habe eine Lösung gefunden, die für mich funktioniert: resetInput

[XML]
<h:form id="frm_data">

...

<p:contextMenu>

<p:menuitem value="#{msg.lbl_btn_reset}" actionListener="#{dataManagedBean.reset}" update="@form" icon="ui-icon-trash" oncomplete="addWizard.loadStep(addWizard.cfg.steps[0], true)" immediate="true">
<p:resetInput target="frm_data" />
</p:menuitem>

</p:contextMenu>

....

</h:form>
[/XML]

Mehr dazu:
PrimeFaces - ShowCase
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Selectbox nach klick submit Web Tier 1
M JSF ValueChangeEvent bei Submit eines Formulars Web Tier 1
Y Welcher Submit-Button wurde gedrückt? Web Tier 0
B Mit JavaServlet Submit Button ermitteln Web Tier 5
M Struts 2 Submit Button lokalisieren Web Tier 5
M Servlet Submit ergebniss in seite einbauen Web Tier 2
I HTML nach Image Web Tier 1
F Formular nach erfolgreichem Login ausblenden Web Tier 0
J Session ist nach Klick auf Zurück-Button wieder aktiv Web Tier 3
N RequestDispatcher: include-Aufruf einer jsp scheitert nach mehreren forward-Aufrufen Web Tier 1
J Suche nach einem Webframework Web Tier 5
A Faces Context nicht mehr erreichbar nach Servlet Aufruf Web Tier 1
S Rendern einer Komponente nach actionListener Web Tier 2
A Wartezeit nach Tomcat start wegen Servlets zu hoch Web Tier 2
W JSF Komisches Verhalten nach Login per Realm Web Tier 4
J Nach SVN-Update alle Beans resolved to null Web Tier 3
V JSF oncomplete-Attribut nach action-Attribut auswerten Web Tier 3
K JSP String[] Array nach Javascript Web Tier 4
M JSF Dialog nur nach erfolgreicher Action schließen Web Tier 4
R Errorpage nach ViewExpiredException Web Tier 7
T Seam-Komponenten oder Java Bean soll direkt nach Appserver-Start "leben" Web Tier 4
P JSF Ajax refresh nach Linkklick Web Tier 4
M JSF Kein Zugriff auf ManagedBeans, nach JSF Migration von 1.2 nach 2.0 Web Tier 4
T JSF URL "hängt nach" - warum? Ausblenden möglich? Web Tier 4
T JSF ViewScoped - Zustand verliert sich nach Seitenaktualisierung Web Tier 8
F Migration eines CMS von PHP nach JAVA Web Tier 3
K Bilder nach dem Upload nutzen Web Tier 10
J Memory Leak in Servlet nach längere Laufzeit Web Tier 6
C Formulardaten der Reihe nach auslesen Web Tier 5
E JSF Datatable erst nach Buttonklick anzeigen Web Tier 2
S Webapp und mysql. mysql verliert die verbindung nach langer zeit Web Tier 6
E CSS wird nach RequestDispatcher.redirect nicht mehr geladen Web Tier 7
U SessionAttribut nach j_security_check setzen Web Tier 3
F Redirect nach Aufruf einer JSP Web Tier 5
S [SelectItems value(herkunft bean)] in [UI:repeat] lädt daten nicht neu nach Web Tier 3
hdi File Upload erst nach Prüfung Web Tier 4
D JSF: Best Practice "Session invalidate nach Schließen des Browsers"? Web Tier 3
D JSF: locale verliert Wert nach Navigation Web Tier 6
ruutaiokwu Wert hinter JSP-Tag nach Java-String in Skriptlet Web Tier 4
D Die ewige Suche nach dem richtigen Web-Framework Web Tier 34
M Properties der JSP nach input-result leer (Struts 2) Web Tier 2
S Attribute in Objektliste nach gecheckten Checkboxen setzen Web Tier 4
T Liste nach Anfangsbuchstaben getrennt ausgeben? Web Tier 2
Q browserfenster schließen nach HTTP-Authentifizierung Web Tier 3
G Seitenumbruch nach x Elementen Web Tier 3
M Authentifizierung über PhaseListener je nach Seite Web Tier 11
L Argumentübergabe von JSP nach Applet Web Tier 4
F nach Update auf RichFaces 3.2.0 Fehlermeldungen Web Tier 5
I servlet: init wird auch nach ServletException aufgerufen Web Tier 3
S JSF: Ändern von CSS Styles in commandLink nach Klick Web Tier 4
L Validation über ManagedBeans Web Tier 7
E Struts XML validation schlägt immer fehl Web Tier 1
A JSF form absenden ohne require validation (andere schon) Web Tier 4
K JSF Custom Validation Messages Migration von JSF 1.2 auf 2.0 Web Tier 5
J Validieren abhängiger Felder mit JEE6/Bean validation Web Tier 33
S Style bei fehlerhafter Eingabe (Bean Validation) ändern Web Tier 2
S Bean Validation (JSF 2.0) funktioniert nicht. Web Tier 4
L Struts 2 Iterator Validation Web Tier 4
D Ajax und Validation ohne große Umstrukturierung Web Tier 3
P Struts2 - Mehrere Methoden/Actions in einer Klasse + Validation Web Tier 2
L Struts Validation Error Web Tier 17
G Struts 2 Validation Web Tier 5
G Struts 2 - Validation Frage Web Tier 5
S Facelets Form: Validation abschalten bei Abbrechen-Button Web Tier 2

Ähnliche Java Themen

Neue Themen


Oben