Struts2-EINGANG Ergebnis: wie funktioniert es? Wie sind die Konvertierung / Validierung Fehler behandelt?
Wichtigste Frage
Den Arbeitsablauf sollte wie folgt sein: wenn ein String eingegeben wird, anderes als eine Zahl, zuerst sollte es passieren eine Ausnahme Abfangjäger, und wenn Sie durch param interceptor, während der Konvertierung zu int-Typ ist, wird es nicht in der Lage, es zu tun mit Integer.parseInt
und eine Ausnahme auftreten würde; sollte nicht die Ausnahme (das ist NumberFormatException
) geschoben werden, in dem Wert-Stack ? Warum tut Sie es nicht zeigen NumberFormatException
und zeigen Sie das Ergebnis, obwohl das Ergebnis nicht gedruckt werden sollen, statt ?
Seite Frage
Immer, wenn ich, fügen Sie ein alphabet in der form geändert, null...? Warum ist das so ?
index.jsp
<%@ taglib uri="/struts-tags" prefix="s"%>
<s:form action="divide">
<s:textfield name="number1" label="number1"/>
<s:textfield name="number2" label="number2"/>
<s:submit value="divide"/>
</s:form>
divide.java
package actions;
public class divide {
int number1,number2,result;
public String execute() throws Exception
{
result=number1/number2;
return "success";
}
public int getNumber1() {
return number1;
}
public void setNumber1(int number1) {
this.number1 = number1;
}
public int getNumber2() {
return number2;
}
public void setNumber2(int number2) {
this.number2 = number2;
}
public int getResult() {
return result;
}
}
Ergebnis.jsp
<%@taglib uri="/struts-tags" prefix="s" %>
<b>
the result of division is
<s:property value="result"/>
</b>
<jsp:include page="index.jsp"></jsp:include>
handler jsp
<%@taglib uri="/struts-tags" prefix="s"%>
<b>
following exception occured during the processing
<s:property value="exception"/>
</b>
<jsp:include page="index.jsp"/>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="yo" extends="struts-default">
<action name="divide" class="actions.divide">
<exception-mapping result="error" exception="Exception"/>
<result name="success">/result.jsp</result>
<result name="error">/handler.jsp</result>
</action>
</package>
</struts>
- was das bedeutet : Wann immer ich eine alphabet in
- bedeutet, zu sagen,in das input Feld Schreibe ich einen b oder c,statt einer Nummer,es sollte eine exception werfen,aber Sie behandeln Sie es als null an
- Definieren von input Ergebnis, denn du hast einen Fehler bei der überprüfung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konzept
Struts 2 Griffen beide Konvertierungsfehler und Validierung Fehler automatisch: es wird keine Ausnahme ausgelöst, weil Sie nicht blockierende Fehler, aber Eingabefehler, daher der beste Weg zu gehen ist, um den Benutzer zu informieren, dass die Eingabe eingereicht war falsch, und bat ihn für eine neue, gültige Eingabe. Um dies zu erreichen, eine ein Ergebnis zurückgegeben wird, während die Ausnahme wird ignoriert.
Detaillierte worflow
Den
- Parameter Interceptor
versucht, um die Parameter einzustellen. Wenn einRuntimeException
(wieNumberFormatException
) gefangen ist unddevMode
isttrue
ist, wird eine Fehlermeldung Hinzugefügt, um dieAction Errors
, sonst die Ausnahme ist, einfach geschluckt. Aus dem Quellcode:Den
Konvertierungsfehler Interceptor
überprüft, ob etwaige Fehler bei der Konvertierung passiert ist: für jeden einzelnen gefunden, es fügt eineField Error
; es speichert auch die ursprünglichen Werte, so dass alle nachfolgenden Anfragen auf diesen Wert zurück der ursprüngliche Wert und nicht den Wert, der in der Aktion. Aus der Dokumentation:Den
Validierung Interceptor
führt alle mit der überprüfung angefordert (definiert in XML, Annotationen oder durch dasvalidate()
odervalidateXXX()
Methoden der Aktion) hinzufügen eine oder mehrere Fehlermeldungen, dieField Errors
für jedes Feld nicht und übergeben den oder die überprüfungskriterien.Den
Workflow-Interceptor
überprüft, ob esField Errors
(beide kommen von der Konvertierung Fehler oder Fehler). Wenn keine Fehler gefunden werden, geht es die Kette an den nächsten Interceptor. Wenn ein oder mehr Fehler gefunden werden, gibt es einen INPUT Ergebnis.Gewährleisten dieser Mechanismus funktioniert, müssen Sie definieren diese vier Abfangjäger in der richtigen Reihenfolge in Ihre Benutzerdefinierte Stapel, wenn Sie nicht die Standard-Interceptors-Stack (Sie brauchen nicht zu tun, nichts sonst). Von
struts-default.xml
:Die original-Antwort war: der Rahmen wurde nicht in der Lage, eine
String
in eineint
Feld bei der Buchung der Anfrage an den server, und beim abrufen der Wert in der resultierenden Seite, es ruft die Get-Methode der variable; da Sie definiert eineint
und nicht einInteger
, und einint
kann nicht null sein, wird es wieder den Standardwert für einint
: 0.Aber ich war nicht erinnern, dass die Umstellung Interceptor Ansprüche (Lesen Sie Punkt n. 2) speichern Sie die ursprünglichen Werte, um Sie in nachfolgenden zukünftige Anforderungen, im Ort des Geschehens-Werte (das wäre null oder 0 sind). Dies ist auch erwähnt in Typ-Konvertierung Fehlerbehandlung:
Statt, ich wurde gut erinnern das beschriebene Verhalten in Ihrer Frage.
Also dieser Fall wurde bereits behandelt... warum es nicht funktioniert, dann ?
Der Schuldige, in meinem Fall (und wahrscheinlich auch Ihr), war die
value
Attribut:Dies wird Ihnen
0
beim buchenabc
:weil eine weitere Konvertierung Fehler aufgetreten ist.
Diesen zwei Fällen statt der Arbeit, wie oben beschrieben, geben Sie
abc
beim buchenabc
:Schlussfolgerungen
value
Attribut.Zum Zwecke der Prüfung, versuchen, das entfernen des
value
Attribut überhaupt auf den ersten, um zu sehen, dass es funktioniert den rechten Weg, dann auf die Suche nach dem Fehler.