Как получить доступ к Spring 3 результата проверки MVC в JSP без использования формы taglib

У меня есть простая форма Spring 3 MVC с использованием jsp taglib. Мне нужно добавить класс, основанный на том, имеет ли поле в форме какие-либо ошибки, связанные с ним или нет. Вот сниппет моего 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>

Итак, в первой строке атрибут класса имеет два класса: "control-group" и "error". Мне нужно добавить класс ошибки, только если это поле связано с ошибкой. Я знаю, что WebDataBinder как-то включен в страницу, но я не знаю, как получить к нему доступ. По сути, я просто хочу выполнить какую-то хорошую старую моду <% = binding.hasError()? "error": ""% > , но как мне получить доступ к связующему на странице?

Ответ 1

Хотя это немного более непонятно, я думаю, что это проще, потому что это единственная строка, которая была бы такой, какой была бы, если бы я просто использовал скрипты, как любой здравомыслящий Java-разработчик. Тэглибы должны умереть умереть, а затем умереть еще. Они ужасны, и я не могу поверить, что разработчики Java по-прежнему считают, что они действительно помогают, а не тратят свое время. PHP-разработчики смеются над нами, когда мы используем эти вещи.

<div class="control-group ${requestScope['org.springframework.validation.BindingResult.user'].hasFieldErrors('firstName') ? 'error' : ''}">

Ответ 2

Вы пробовали тег <spring:hasBindErrors> (я не понимаю, что вы имеете в виду, пишите "без использования формы 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}' />">

Изменить после комментариев:

Внутри тега <spring:hasBindErrors> есть переменная errors (см. errors интерфейс), привязанная к фактическим ошибкам привязки. Вы можете проверить, есть ли у поля ошибки с помощью errors.hasFieldErrors(fieldName).


И действительно непонятным способом получения полевых ошибок без какого-либо тега является requestScope['org.springframework.validation.BindingResult.yourCommandName'].hasFieldErrors('username')...

Ответ 3

Существует лучший способ получить сообщение об ошибке

<spring:hasBindErrors name="yourCommandName">
    ${errors.hasFieldErrors('userId') ? errors.getFieldError('userId').defaultMessage : ''}
</spring:hasBindErrors>

И один вкладыш

 ${requestScope['org.springframework.validation.BindingResult.user'].hasFieldErrors('emailId') ? requestScope['org.springframework.validation.BindingResult.user'].getFieldError('emailId').defaultMessage : ''}