使用JSTL检查弹簧绑定错误

时间:2010-07-17 11:23:01

标签: spring-mvc

我已经尝试了一段时间,但找不到合适的解决方案。

我想使用JSTL来检查我的Spring MVC 2.5中是否存在任何绑定错误(字段错误或全局错误)。

我知道我可以使用这段代码:

<p>
    <spring:hasBindErrors name="searchItems">
        An Error has occured
    </spring:hasBindErrors>
</p>

但我想利用JSTL检查是否有任何错误。

我使用JSTL尝试过这个:

<c:if test="${not empty errors}">
    An Error has occured
</c:if>

但似乎我无法正确捕捉它。

我需要使用JSTL,因为JSP的其他部分依赖于是否存在绑定错误。

3 个答案:

答案 0 :(得分:6)

如上所述

  

我想利用JSTL检查是否有任何错误

只是使用(它只适用于Spring MVC 2.5 - 对于Spring MVC 3.0不可移植虽然我认为它是 requestScope ['bindingResult。&lt; COMMAND_NAME_GOES_HERE&gt; .allErrors']

<c:if test="${not empty requestScope['org.springframework.validation.BindingResult.<COMMAND_NAME_GOES_HERE>'].allErrors}">
    An Error has occured!!!
</c:if>

请记住默认命令名称是非限定命令类名称,首字母小写。请注意,下面的命令名称是 pet

private PetValidator petValidator = new PetValidator();

@RequestMapping(method.RequestMethod.POST)
public void form(Pet command, BindingResult bindingResult) {
    if(petValidator.validate(command, bindingResult)) {
        // something goes wrong
    } else {
        // ok, go ahead
    }
}

所以你的表单应该是

<!--Spring MVC 3.0 form Taglib-->
<form:form modelAttribute="pet">

</form:form>
<!--Spring MVC 2.5 form Taglib-->
<form:form commandName="pet">

</form:form>

除非您使用@ModelAttribute

@RequestMapping(method.RequestMethod.POST)
public void form(@ModelAttribute("command") Pet command, BindingResult bindingResult) {
    // same approach shown above
}

这样,您的表单应该是

<!--Spring MVC 3.0 form Taglib-->
<form:form modelAttribute="command">

</form:form>
<!--Spring MVC 2.5 form Taglib-->
<form:form commandName="command">

</form:form>

答案 1 :(得分:4)

这样的事情:

<spring:hasBindErrors name="userName">
    <c:set var="userNameHasError" value="true" />
</spring:hasBindErrors>

<c:choose>
    <c:when test="${userNameHasError}">
         <%-- Display username as textbox --%>
    </c:when>
    <c:otherwise>
         <%-- Display username as label --%>
    </c:otherwise>
</c:choose>

您也可以设置错误以捕获页面上的所有错误(未经测试):

<spring:hasBindErrors name="*">
    <c:set var="userNameHasError" value="true" />
</spring:hasBindErrors>

享受!

答案 2 :(得分:3)

在使用<spring:hasBindErrors>标签后,我发现它有一些限制:

  • 仅在出现错误时才有用。

  • org.springframework.validation.Errors对象只能在标记

  • 中访问

如果只是想知道是否有错误怎么办?如果没有错误,<spring:hasBindErrors>将变得无用。在与我的同事做了一些研究之后,我们打印出了所有的请求属性。原来有一个名为:

的属性
  

org.springframework.validation.BindingResult.command

此处的命令对象是表单支持命令对象。 由于它可能被命名为不直观,因此该属性包含对我们的Errors对象的引用。 因此,这有效:

${requestScope['org.springframework.validation.BindingResult.command'].errorCount}

并让我们处理 JSTL

中备受追捧的错误对象