2009-10-31 10 views
17

Używam biblioteki Form Spring do obsługi strony wyszukiwania w mojej aplikacji. Oto wycięte z mojego DD pokazujący konfigurację Fasola:Formy sprężyn - jak sprawdzić błąd na określonej ścieżce

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

klasa Walidator jest dość prosta:

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."); 
     } 
    } 
} 

W moim JSP, moja forma jest wyświetlana w tabeli HTML. Chcę, aby błędy specyficzne dla pola były wyświetlane pod odpowiednim polem jako osobny wiersz tabeli. Oto fragment:

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

Mam pytanie jest - jak mogę sprawić, że wyjście z rzędu błędu uzależnione od istnienia błędu? Czy instancja Validator jest dostępna z mojego JSP? Jaki byłby test dla znacznika c: if?

Dzięki,

-aj

Odpowiedz

34

OK zajęło mi kilka dni, ale zorientowaliśmy się:

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

Ten artykuł był bardzo pomocny: http://forum.springsource.org/archive/index.php/t-51044.html

1

myślę this article opisuje co trzeba w dobrych informacji

+0

Witam, Dziękuję za komentarz, ale nie widzę, gdzie w linku podałeś, że używają biblioteki Spring Form. Jeśli masz jakieś informacje dotyczące Spring Form, opublikuj inną odpowiedź. Dzięki! –

7

Zastosowanie <spring:hasBindErrors name="loginPasswordForm">

3

Zastosowanie <spring:bind path="fieldName"> i sprawdzić status.error aby sprawdzić, czy pole ma error

Przykład

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

Uwaga

<form:input path="" /> musi być wewnątrz <spring:bind > tagu

+0

Jak korzystać z tej metody dla ścieżek? Co się stanie, jeśli zadeklaruję '' na początku formularza, w jaki sposób będzie to używane dla poszczególnych ścieżek? –

+0

To, co znalazłem, to forma: input musi znajdować się w tagu ''. Które oznacza dla każdej ścieżki musisz zdefiniować '' – Smith

3

Proszę to sprawdzić segment kodu

<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

W rzeczywistości istnieje proste rozwiązanie. Nie widziałem go nigdzie, ale wydaje mi się, że jest najprostszy.

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

Kiedy postać: tag błędy nie ma ciała renderuje błąd z domyślną mecanism, ale kiedy tag ma ciało, to właśnie sprawia, że ​​ciało, jeśli wystąpi błąd na tej ścieżce.

+0

To wydaje się działać w środowisku serwletu, ale kończy się niepowodzeniem w środowisku portletu. Wciąż jednak sprawdzam, zobacz moje pytanie http://stackoverflow.com/q/35596690/637423 – Geert

Powiązane problemy