2010-07-17 3 views
6

Ich habe dies seit einer Weile versucht, aber kann nicht die richtige Lösung finden.Überprüfen Sie JSTL in Bezug auf Spring Binding Error

Ich möchte JSTL verwenden, um zu überprüfen, ob Binding-Fehler (Feldfehler oder globaler Fehler) in meinem Spring MVC 2.5 aufgetreten sind.

Ich weiß, dass ich diesen Code verwenden können:

<p> 
    <spring:hasBindErrors name="searchItems"> 
     An Error has occured 
    </spring:hasBindErrors> 
</p> 

Aber ich will JSTL nutzen für Fehler zu überprüfen.

habe ich versucht, diese eine mit JSTL:

<c:if test="${not empty errors}"> 
    An Error has occured 
</c:if> 

Aber es scheint, dass ich es nicht richtig fangen kann.

Ich brauche JSTL, da es andere Teile der JSP gibt, die auf das Vorhandensein oder Fehlen eines Bindungsfehlers angewiesen sind.

Antwort

6

Wie gesagt

Ich möchte JSTL nutzen für Fehler zu überprüfen

Verwenden Sie einfach (Es funktioniert nur auf Spring MVC 2.5 - nicht tragbar für Spring MVC 3.0 obwohl ich angenommen ist es requestScope ['bindingResult. <COMMAND_NAME_GOES_HERE> .allErrors'])

<c:if test="${not empty requestScope['org.springframework.validation.BindingResult.<COMMAND_NAME_GOES_HERE>'].allErrors}"> 
    An Error has occured!!! 
</c:if> 

Halte Standard Befehlsname ist die nicht-qualifizierte Befehlsklassennamen mit den ersten Buchstaben kleingeschrieben im Auge behalten. Hinweis unten Befehlsname ist pet

private PetValidator petValidator = new PetValidator(); 

@RequestMapping(method.RequestMethod.POST) 
public void form(Pet command, BindingResult bindingResult) { 
    if(petValidator.validate(command, bindingResult)) { 
     // something goes wrong 
    } else { 
     // ok, go ahead 
    } 
} 

So Ihre Form sollte aussieht

<!--Spring MVC 3.0 form Taglib--> 
<form:form modelAttribute="pet"> 

</form:form> 
<!--Spring MVC 2.5 form Taglib--> 
<form:form commandName="pet"> 

</form:form> 

Sofern verwenden Sie @ModelAttribute

@RequestMapping(method.RequestMethod.POST) 
public void form(@ModelAttribute("command") Pet command, BindingResult bindingResult) { 
    // same approach shown above 
} 

Auf diese Weise Ihre Form sollte wie folgt aussieht

<!--Spring MVC 3.0 form Taglib--> 
<form:form modelAttribute="command"> 

</form:form> 
<!--Spring MVC 2.5 form Taglib--> 
<form:form commandName="command"> 

</form:form> 
3

Etwas wie folgt aus:

<spring:hasBindErrors name="userName"> 
    <c:set var="userNameHasError" value="true" /> 
</spring:hasBindErrors> 

<c:choose> 
    <c:when test="${userNameHasError}"> 
     <%-- Display username as textbox --%> 
    </c:when> 
    <c:otherwise> 
     <%-- Display username as label --%> 
    </c:otherwise> 
</c:choose> 

Sie können sich wahrscheinlich setzen auch die Fehler ein Setup, um alle Fehler auf der Seite (nicht getestet) zu fangen: Genießen

<spring:hasBindErrors name="*"> 
    <c:set var="userNameHasError" value="true" /> 
</spring:hasBindErrors> 

!

3

Nachdem mit <spring:hasBindErrors> Tag herum spielen, fand ich es gewisse Einschränkungen hatte:

  • Es ist nur sinnvoll, wenn es Fehler gibt.

  • org.springframework.validation.Errors Objekt ist nur innerhalb des Tags

Was wollten, wenn nur wissen, ob es Fehler gibt oder nicht. Wenn keine Fehler vorliegen, wird <spring:hasBindErrors> unbrauchbar gemacht. Nach einer Recherche mit meinem Kollegen haben wir alle Anforderungsattribute ausgedruckt. Stellt sich heraus, es ein Attribut namens:

org.springframework.validation.BindingResult.command

Der Befehl Objekt hier ist Ihre Form Unterstützung Befehlsobjekt. Dieses Argument enthält einen Verweis auf unser Errors-Objekt, da es nicht intuitiv ist. So , das funktioniert:

${requestScope['org.springframework.validation.BindingResult.command'].errorCount} 

und gibt uns einen Griff über die gefragten Fehler in JSTL Objekt