1

我正在尝试将表单验证添加到工作应用程序。我首先在登录表单中添加了一个 NotNull 检查。我正在使用 Bean Validation api 的 Hibernate impl。

这是我写的代码

@Controller
@RequestMapping(value="/login")
@Scope("request")
public class LoginController {

  @Autowired
  private CommonService commonService;

  @Autowired
  private SiteUser siteUser;

  @InitBinder
  private void dateBinder(WebDataBinder binder) {
      SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
      CustomDateEditor editor = new CustomDateEditor(dateFormat, true);
      binder.registerCustomEditor(Date.class, editor);
  }

  @ModelAttribute
  protected ModelMap setupForm(ModelMap modelMap) {
    modelMap.addAttribute("siteUser", siteUser);
    return modelMap;
  }

  @RequestMapping(value="/form", method = RequestMethod.GET)
  public ModelAndView form(ModelMap map){
    if (siteUser.getId() == null){
      map.addAttribute("command",new SiteUser());
      return new ModelAndView("login-form",map);
    }else {
      return new ModelAndView("redirect:/my-dashboard/"+siteUser.getId());
    }
  }

  @RequestMapping(value="/submit", method=RequestMethod.POST)
  public ModelAndView submit(@Valid SiteUser user, ModelMap map, BindingResult result){
    if (result.hasErrors()) {
      map.addAttribute("command", user);
      System.out.println("Login Error block");
      return new ModelAndView("login/form",map);
    }
    else {
      User loggedInUser = commonService.login(user.getEmail(), user.getPassword());
      if (loggedInUser != null) {
        siteUser.setId(loggedInUser.getId());
        siteUser.setName(loggedInUser.getName());
        System.out.println("site user attr set");
      }
      return new ModelAndView("redirect:/my-dashboard/"+loggedInUser.getId());
    }
  }
}

模型是

@Component
@Scope("session")
public class SiteUser {
private Integer id = null;
@NotNull
private String name = null;
private String email = null;
private String password = null;
private List<String> displayPrivList = null;
private List<String> functionPrivList = null;
    // And the getters and setters
}

JSP 是

    <c:url var="loginSubmitUrl" value="/login/submit"/>
    <form:form method="POST" action="${loginSubmitUrl}">
        <form:errors path="*" />
        <div class="row">
            <div class="span4">
            </div>
            <div class="span4">
                <h3>Please Login</h3>
                <label><span style="color:red">*</span>Email</Label><form:input path="email" type="text" class="input-medium" />
                <label><span style="color:red">*</span>Password</Label><form:input path="password" type="password" class="input-medium" />
                <br/>       
                <button type="submit" class="btn btn-primary">Login</button>
                <button type="button" class="btn">Cancel</button>
            </div>
        </div>          
    </form:form>

我在上下文 xml 中添加了 messages.properties 和注释驱动的 bean def。关于该主题的其他答案谈论未发布的表单字段。就我而言,这是预期的行为——如果我提交一个空白表格,我应该会收到一个错误。

请告知我错过了什么?

4

3 回答 3

16

我认为这个问题与您的问题相同

在 Spring MVC(使用休眠验证器)中提交带有无效数据的表单时发送的语法错误请求

这只是指出

您必须修改参数的顺序。始终将BindingResult结果参数直接放在带有@Value注释的参数之后

于 2013-03-26T15:33:27.467 回答
1

你需要这个:<form:errors path="email" cssClass="errors" /> 对每个具有相同“路径”名称的输入使用标签形式:错误。

如果您不放置路径,也可以同时列出所有错误。

在这里,查看带有示例代码的完整示例,您可以下载以了解如何操作: http ://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/

于 2013-02-07T14:54:38.307 回答
0

您可以尝试<form:form>通过像这样包含命令名称来更改它吗

     <form:form method="POST" action="${loginSubmitUrl}" commandName="user"> 
于 2013-02-06T23:10:37.180 回答