I have a simple Spring 3 MVC form using jsp taglibs. I need to add a class based on whether a field within the form has any errors associated with it or not. Here is a snipet of my HTML:
<div class="control-group error"> <!-- HERE: binding.hasErrors() ? "error" : "" -->
<form:label path="username" cssClass="control-label">User Name</form:label>
<div class="controls">
<form:input path="username" cssClass="span3"/>
<form:errors path="username" cssClass="help-inline" />
</div>
</div>
So on the first line the class attribute has two classes "control-group" and "error". I need to add error class only if that field has an error associated with it. I know the WebDataBinder is included in the page somehow, but I don't know how to access it. Essentially I just want to execute some good old fashion <%= binding.hasError() ? "error" : "" %>, but how do I get access to the binder in the page?
BindingResult holds the result of a validation and binding and contains errors that may have occurred. The BindingResult must come right after the model object that is validated or else Spring fails to validate the object and throws an exception.
Each tag in the tag library provides support for the set of attributes of its corresponding HTML tag counterpart, making the tags familiar and intuitive to use. These tags renders the HTML tag that is HTML 4.01/XHTML 1.0 compliant. Spring's form tag library is integrated with Spring Web MVC.
43.6 The form tag Renders an HTML 'form' tag and exposes a binding path to inner tags for binding.
Did you try <spring:hasBindErrors>
tag (I don't understand what you mean writing "without using form taglib")?
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<spring:hasBindErrors name="yourCommandName">
<c:if test="${errors.hasFieldErrors('username')}">
<c:set var="errorClass" value="error" />
</c:if>
</spring:hasBindErrors>
<div class="control-group <c:out value='${errorClass}' />">
Edit after comments:
Inside <spring:hasBindErrors>
tag there is errors
variable (see Errors
interface) bound to actual binding errors. You can check if field has errors via errors.hasFieldErrors(fieldName)
.
And really obscure way to get field errors without any tag is requestScope['org.springframework.validation.BindingResult.yourCommandName'].hasFieldErrors('username')
...
While this is a little more obscure I think it's simpler because it's a single line which is what it would be if I were just using scriplets like any sane Java dev should. Taglibs need to die die die die, then die some more. They are horrible and I can't believe Java devs still think they actually help and not waste our utter time. PHP developers laugh at us when we use those things.
<div class="control-group ${requestScope['org.springframework.validation.BindingResult.user'].hasFieldErrors('firstName') ? 'error' : ''}">
There is a better way to get the error message
<spring:hasBindErrors name="yourCommandName">
${errors.hasFieldErrors('userId') ? errors.getFieldError('userId').defaultMessage : ''}
</spring:hasBindErrors>
And one liner
${requestScope['org.springframework.validation.BindingResult.user'].hasFieldErrors('emailId') ? requestScope['org.springframework.validation.BindingResult.user'].getFieldError('emailId').defaultMessage : ''}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With