2009-10-31 8 views
17

J'utilise la bibliothèque Spring Form pour gérer une page de recherche dans mon application. Voici un snipped de mon DD montrant la configuration de haricot:Printemps Forms - Comment rechercher une erreur sur un chemin spécifique

<bean name="/search.html" class="myapp.web.AccountSearchController"> 
     <property name="sessionForm" value="true"/> 
     <property name="commandName" value="searchAccounts"/> 
     <property name="commandClass" value="myapp.service.AccountSearch"/> 
     <property name="validator"> 
      <bean class="myapp.service.AccountSearchValidator"/> 
     </property> 
     <property name="formView" value="accountSearch"/> 
     <property name="successView" value="accountSearch"/> 
    </bean> 

La classe validateur est assez simple:

package myapp.service; 

import org.springframework.validation.Validator; 
import org.springframework.validation.Errors; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class AccountSearchValidator implements Validator { 

    /** Logger for this class and subclasses */ 
    protected final Log logger = LogFactory.getLog(getClass()); 

    public boolean supports(Class clazz) { 
     return AccountSearch.class.equals(clazz); 
    } 

    public void validate(Object obj, Errors errors) { 
     AccountSearch accountSearch = (AccountSearch) obj; 
     if (accountSearch == null) { 
      errors.rejectValue("domainName", "error.accountSearch.neither-specified", null, "Value required."); 
     } else if (accountSearch.getAccountId().isEmpty() && 
        accountSearch.getDomainName().isEmpty()) { 
      errors.rejectValue("domainName", "error.accountSearch.neither-specified", null, "Value required."); 
     } 
    } 
} 

Dans mon JSP, ma forme est affichée dans un tableau HTML. Je souhaite que les erreurs spécifiques au champ soient affichées sous le champ correspondant sous la forme d'une ligne de tableau séparée. Voici un extrait:

  <tr> 
       <td align="right" valign="top"><form:label path="domainName">Domain Name</form:label>:</td> 
       <td><form:input path="domainName" size="30"/></td> 
      </tr> 
      <tr> 
       <td>&nbsp;</td> 
       <td><form:errors path="domainName" cssClass="error"/></td> 
      </tr> 

La question que j'ai est - comment puis-je faire la sortie de la ligne d'erreur à l'existence de l'erreur? L'instance de Validator est-elle accessible depuis ma JSP? Quel serait le test pour un c: if tag?

Merci,

-aj

Répondre

34

OK il m'a fallu quelques jours, mais j'ai tout compris:

<c:set var="domainNameErrors"><form:errors path="domainName"/></c:set> 
    <c:if test="${not empty domainNameErrors}"> 
     <tr> 
      <td>&nbsp;</td> 
      <td>${domainNameErrors}</td> 
     </tr> 
    </c:if> 

Cet article a été très utile: http://forum.springsource.org/archive/index.php/t-51044.html

1

Je pense que this article décrit ce que vous avez besoin de bons détails

+0

Salut, Merci pour votre commentaire, mais je ne vois pas où dans le lien que vous avez fourni qu'ils utilisent la bibliothèque Spring Form. Si vous avez des informations spécifiques au formulaire de printemps, veuillez poster une autre réponse. Merci! –

7

Utilisez <spring:hasBindErrors name="loginPasswordForm">

3

Utilisez <spring:bind path="fieldName"> et vérifiez status.error pour voir si le champ a erreur

Exemple

<spring:bind path="phoneNumber"> 
    <form:input path="phoneNumber" /> 
    <form:errors path="phoneNumber" cssClass="error" /> 
    ${status.error ? 'has error' : ''} 
</spring:bind> 

Remarque

<form:input path="" /> doit être à l'intérieur <spring:bind > tag

+0

Comment pouvons-nous utiliser cette méthode pour les chemins? Que faire si je déclare '' au début du formulaire, comment cela sera-t-il utilisé pour les chemins individuels? –

+0

Ce que j'ai trouvé est la forme: les entrées doivent être dans la balise ''. Ce qui signifie que pour chaque chemin, vous devez définir l'attribut '' – Smith

3

S'il vous plaît vérifier segment de code

<spring:bind path="domainName"> 
    <c:if test="${status.error}"> 
    <tr> 
     <td>&nbsp;</td> 
     <td><form:errors path="domainName" cssClass="error"/></td> 
    </tr> 
    </c:if> 
</spring:bind> 
2

Actuellement, il existe une solution simple. Je ne l'ai vu nulle part mais il me semble que c'est le plus simple.

<tr> 
    <td align="right" valign="top"><form:label path="domainName">Domain Name</form:label>:</td> 
    <td><form:input path="domainName" size="30"/></td> 
</tr> 
<form:errors path="domainName"> 
<tr> 
    <td>&nbsp;</td> 
    <td><form:errors path="domainName" cssClass="error"/></td> 
</tr> 
</form:errors> 

Lorsque le formulaire: balise d'erreurs n'a pas de corps, il rend l'erreur avec le mécanisme par défaut, mais lorsque l'étiquette a un corps, il rend tout le corps en cas d'erreur pour cette voie.

+0

Cela semble fonctionner dans l'environnement servlet, mais échoue dans l'environnement de portlet. Toujours en cours d'analyse, voir ma question http://stackoverflow.com/q/35596690/637423 – Geert

Questions connexes