【问题标题】:Displaying validation Errors in form with Spring MVC使用 Spring MVC 在表单中显示验证错误
【发布时间】:2016-08-09 20:33:53
【问题描述】:

我已经搜索了该论坛的几个教程和答案以尝试解决我的问题:我想使用 spring MVC 在我的表单中显示来自我的 bean 的验证错误。

无论我尝试什么,我都无法让它发挥作用。我没有使用重定向,我的绑定结果直接在模型类之后等等。

这是我目前所拥有的:

登录类:

public class LoginUser implements Serializable {

    @NotNull
    @Column(name="username", unique=true)
    @Size(min=5)
    private String username;

    @NotNull
    @Size(min=5)
    private String password;

登录控制器:

@Transactional
@Controller
public class LoginController {

    @Autowired
    UserDao dao;

    @RequestMapping(value = "enter", method = RequestMethod.POST)
    public String doLogin(@ModelAttribute("user") @Valid LoginUser user, BindingResult result, HttpSession session) {
        if (result.hasErrors()) {
            return "login/loginForm";
        } else {
            if (dao.authenticate(user)) {
                session.setAttribute("userLoggedIn", user.getUsername());
                return "forward:index";
            } else {
                return "redirect:login";
            }
        }

    }

登录表格:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" src="resources/js/bootstrap.js"></script>
<script type="text/javascript" src="resources/js/jquery-3.1.0.min.js"></script>
<link rel="stylesheet" href="resources/css/bootstrap.css">
<title><spring:message code="title.login" /></title>
</head>
<body>
    <spring:message code="login.message.login" />
    <form:form action="enter" commandName="loginForm" method="POST">
        <spring:message code="username.login" />
        <input type="text" name="username" id="username" /><br />
        <form:errors path="username" />
        <spring:message code="password.login" />
        <input type="password" name="password" id="password" /><br /> <input
            type="submit" value="<spring:message code='button.login'/>"><br />
        <spring:message code="does.not.have.account.login" />
        <a href="register"><spring:message code="register.link.login" /></a>
    </form:form>
</body>
</html>

哦,我忘了添加 - 我配置了 messages.properties(工作正常,经过测试),消息从那里传来。这是与表单相关的行:

messages_en.Properties

NotEmpty.loginForm.username= Please fill the username field

顺便说一句,可能值得注意的是,我的视图是通过一个复合视图(由 JSP 制成,包括页眉、主页和页脚)安装的,它覆盖了 Sping-MVC 中的常规视图加载。

【问题讨论】:

  • 我可以建议我这样做的方式。就我而言,例如,我的用户类 @Column @Pattern (regexp = "^[a-zA-Z_-]{2,30}$", message = "First name shall consist of 2-30 English letters") @NotEmpty (message = "First name is required.") private String firstName; 中有这样的字段,jsp 注册页面中有这样的相应代码 &lt;label for="firstName" class="col-sm-2 control-label"&gt;First name&lt;/label&gt; &lt;form:input path="firstName" type="text" class="form-control" placeholder="First Name"/&gt; &lt;form:errors path="firstName" cssStyle="color: #ff0000;"/&gt;

标签: spring validation spring-mvc


【解决方案1】:

您正在使用RedirectAttributes,但您没有将用户重定向到任何地方。尝试使用"redirect:/&lt;register_path&gt;" 或将Model model 添加到方法参数并使用model.addAtribute("someName", result);

【讨论】:

  • 当我重定向时,它也不起作用(代码上留下的内容是早期尝试的垃圾)。此外,测试了模型方法,但它没有工作。
【解决方案2】:

试试下面的代码..

<form:form action="enter" commandName="loginForm" method="POST">

commandName 是 loginForm 所以@ModelAttribute("loginForm")。

@RequestMapping(value = "enter", method = RequestMethod.POST)
    public String doLogin( @Valid  @ModelAttribute("loginForm") LoginUser user, BindingResult result, Map<String, Object> model,  HttpSession session) {
        if (result.hasErrors()) {
            return "login/loginForm";
        } else {
            if (dao.authenticate(user)) {
                session.setAttribute("userLoggedIn", user.getUsername());
                return "forward:index";
            } else {
                return "redirect:login";
            }
        }
    }

更新:

您使用的是NotEmpty.loginForm.username= Please fill the username field,这是错误,应该是NotNull.loginForm.username= Please fill the username field

还有

@NotNull 不会验证空字符串。来自前端的请求将是 "",它不为空。因此请改用@NotEmpty

如果您仍想使用@NotNull,请在控制器中添加InitBinder,如下所示

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}

然后它将验证空字符串。

这就是您直接收到size error 的原因,因为您没有提到任何消息,因此没有显示任何消息。

【讨论】:

  • 也不起作用,想在 Spring 中进行,因为它会更容易。但它比预期的要复杂。
  • 你到底得到了什么错误..bindingResult 对象有错误??或者它没有显示在前端??
  • 不显示在前端...例如:空的用户名消息没有出现。我猜这与我制作的复合视图有关......
  • 绑定结果对象有错误??能否显示绑定结果对象内容
  • 我得到字段:大小错误:大小字段:大小错误:大小字段:username.empty 错误:username.empty 字段:password.empty 错误:password.empty
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 2015-12-20
  • 2011-11-25
  • 2015-12-14
  • 2014-09-23
  • 2012-04-08
相关资源
最近更新 更多