【问题标题】:how to show validation error in jsp in spring mvc如何在spring mvc中的jsp中显示验证错误
【发布时间】:2017-01-16 13:33:54
【问题描述】:

我想在我的 jsp 页面中显示验证错误。

我的对象是:

public class MyObjectDTO{ @valid private TextDTO text1; @valid private TextDTO text2 }

public class TextDTO{ @NotBlank private String code;@NotBlank private String label;}

我的控制器:

@RequestMapping(value = "/create", method = RequestMethod.POST)
public String creationProjet(@Valid @ModelAttribute MyObjectDTO obj, BindingResult result,
                             Model model) {
    if (result.hasErrors()) {
        model.addAttribute("hasErrors", true);
        return "create";
    } else {
        ....
        return "redirect:/list";
    }
}

我的jsp

<div class="col-md-6 form-group ${requestScope['org.springframework.validation.BindingResult.obj'].hasFieldErrors('text1') ? 'has-error' : ''}">
    <label class="col-lg-3 control-label">my label</label>
    <div class="col-lg-5">
        <form:select class="form-control" name="type" path="text1.code" id="selectType">
    <option value="">---------</option>
            <c:forEach items="${types }" var="type">
                <form:option value="${type.id }">
                    <c:out value=" ${type.code}"></c:out>
                </form:option>
            </c:forEach>
        </form:select>
        <form:errors path="text1.code" class="has-error  error"></form:errors>
    </div>
</div>

我的控制器重定向到页面创建,但没有显示错误。在调试模式下,有一个错误表明text1.code 不能为空白。

【问题讨论】:

    标签: java spring validation jsp spring-mvc


    【解决方案1】:

    在您的 Jsp 页面中添加以下行

    <div class="col-md-6 form-group ${requestScope['org.springframework.validation.BindingResult.obj'].hasFieldErrors('text1') ? 'hasErrors' : ''}">
    

    或改用hasFieldErrors()

    <div class="col-md-6 form-group ${requestScope['org.springframework.validation.BindingResult.obj'].hasFieldErrors()}">
    

    关于addAttributes("hasErrors",true),请使用addFlashAttribute(),它存储在flashmap 和Object 中(在您的情况下,当您导航到创建页面或在两个控制器之间重定向时,错误消息会一直存在。)Look at this for more

    在你的控制器中添加RedirectAttributes这样的对象

    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public String creationProjet(@Valid @ModelAttribute MyObjectDTO obj,     
    BindingResult result,
    RedirectAttributes redirectAtt,
    Model model) {
    if (result.hasErrors()) {
        redirectAtt.addFlashAttribute("hasErrors","ur message");//instead of true you can write your own message 
        return "create";
    } else {
        ....
        }
        return "redirect:/list";
    }
    
    }
    

    如果你写自己的信息而不是真的

    <c:if test="${not empty hasErrors">
         <p>${hasErrors}</p>
    </c:if>
    

    【讨论】:

    • 我在我的 jsp &lt;div class="col-md-6 form-group ${requestScope['org.springframework.validation.BindingResult.obj'].hasFieldErrors('text1') ? 'hasErrors' : ''}"&gt; 中使用了这个,在我的页面中我没有使用某些东西来读取模型中的属性,我使用这个 &lt;form:errors path="text1.code" class="has-error error"&gt;&lt;/form:errors&gt;
    【解决方案2】:

    只有你缺少的是模型地图的一部分。你只放了标志。但你需要把结果。

    if(result.hasErrors()){             
        mm.addAttribute("errors", result);
        return "create";
    }
    

    【讨论】:

    • 在我的jsp中我不使用这个标志mm.addAttribute("errors", result);
    • 它不是标志。它包含所有绑定结果集合。请尝试并告诉我。
    • 我同意你的观点,但是当我们用这个mm.addAttribute("errors", result); 在模型中添加一些东西时,我们应该在页面中阅读它,但我使用` ` 及其对非复杂对象的作用
    • 我的表单以:&lt;form:form id="myForm" method="post" action="${create}" class="form-horizontal" modelAttribute="obj"&gt; 开头
    • 而不是
    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2014-10-17
    • 2014-09-23
    相关资源
    最近更新 更多