2009-10-31 16 views
17

Estoy usando la biblioteca Spring Form para manejar una página de búsqueda en mi aplicación. Aquí está un cortado con tijeras de mi DD muestra la configuración de frijol:Formularios de resorte: cómo buscar errores en la ruta específica

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

clase El validador es bastante 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."); 
     } 
    } 
} 

En mi JSP, mi formulario se muestra en una tabla HTML. Deseo que los errores específicos de campo se muestren debajo del campo respectivo como una fila de tabla separada. He aquí un fragmento:

  <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 pregunta que tengo es - ¿cómo puedo hacer que la salida de la hilera de error a la existencia del error? ¿Es accesible la instancia de Validator desde mi JSP? ¿Cuál sería la prueba para una etiqueta c: if?

Gracias,

-aj

Respuesta

34

OK me tomó unos días, pero lo he descubierto:

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

Este artículo fue muy útil: http://forum.springsource.org/archive/index.php/t-51044.html

1

Creo this article describe lo que necesita en buenos detalles

+0

Hola, Gracias por su comentario pero no veo en el enlace que proporcionó que están utilizando la biblioteca de Spring Form. Si tiene información específica sobre Spring Form, publique otra respuesta. ¡Gracias! –

7

Uso <spring:hasBindErrors name="loginPasswordForm">

3

Uso <spring:bind path="fieldName"> y comprobar status.error para ver si el campo tiene un error

Ejemplo

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

Nota

<form:input path="" /> debe estar dentro <spring:bind > etiqueta

+0

¿Cómo podemos usar este método para las rutas? ¿Qué sucede si declaro '' al comienzo del formulario, ¿cómo se usará esto para rutas individuales? –

+0

Lo que encontré es form: las entradas deben estar dentro de la etiqueta ''. Lo que significa que para cada ruta debe definir '' – Smith

3

Por favor marque esta segmento de código

<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

En realidad, hay una solución simple. No lo he visto en ninguna parte, pero me parece que es el más 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> 

cuando la forma: Etiqueta de errores no tiene un cuerpo que hace que el error con el MECANISMO defecto, pero cuando la etiqueta tiene un cuerpo, que sólo hace que el cuerpo si hay un error de ese camino.

+0

Esto parece funcionar en el entorno de servlet, pero falla en el entorno del portlet. Sin embargo, aún estoy investigando, vea mi pregunta http://stackoverflow.com/q/35596690/637423 – Geert

Cuestiones relacionadas