2012-01-16 63 views
0

我在Spring 3上创建验证表单,我的问题是,我看到很多带验证表单的例子。我甚至创建了一个。但我的表单传递“result.hasErrors()”方法,即使存在错误。使用Spring 3的验证表单

我的代码是:

控制器:

package com.esb.sso; 

import java.io.*; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLEncoder; 

import javax.servlet.http.*; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.validation.BindingResult; 
import java.util.Map; 

import javax.validation.Valid; 

import com.esb.sso.form.LoginForm; 
import javax.servlet.http.HttpServletRequest; 

/** 
* Handles requests for the application home page. 
*/ 
@Controller 
@RequestMapping(value = "/") 
public class HomeController { 

LoginForm loginForm = new LoginForm(); 

     model.put("loginForm", loginForm); 

     return "home"; 
    } 


@RequestMapping(method = RequestMethod.POST) 
public String validation(@Valid LoginForm loginForm, BindingResult result, 
     Map model) throws IOException { 

    logger.info("Login POST var"); 

    logger.info(loginForm.getLogin()); 
    logger.info(loginForm.getPassword()); 

    if (result.hasErrors()) { 
     logger.info("error"); 
     return "home"; 
    } 

    model.put("loginForm", loginForm); 

    return "logged"; 

} 

} 

验证:

包com.esb.sso.form;

import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 

public class LoginForm { 

    @NotNull(message = "notNull") 
    @Size(min=1, max=50, message="mote charters") 
    private String login; 

    @NotNull(message = "notNull") 
    @Size(min=1, max=50, message="mote charters") 
    private String password; 

    public void setLogin(String login){ 
     this.login = login; 
    } 

    public String getLogin(){ 
     return login; 
    } 

    public void setPassword(String password){ 
     this.password = password; 
    } 

    public String getPassword(){ 
     return password; 
    } 


} 

查看:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 
<html> 
<head> 
    <title>Home</title> 
</head> 
<body> 
Autoryzacja!!! 
<form:form action="" commandName="loginForm"> 

<table> 

<tr> 

<td>User Name:<FONT color="red"><form:errors path="login" /></FONT></td> 

</tr> 

<tr> 

<td><form:input path="login" /></td> 

</tr> 

<tr> 

<td>Password:<FONT color="red"><form:errors path="password" /></FONT></td> 

</tr> 

<tr> 

<td><form:password path="password" /></td> 

</tr> 

<tr> 

<td><input type="submit" value="Submit" /></td> 

</tr> 

</table> 

</form:form> 
</body> 
</html> 

的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/root-context.xml</param-value> 
    </context-param> 

    <!-- Creates the Spring Container shared by all Servlets and Filters --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Processes application requests --> 
    <servlet> 
     <servlet-name>appServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>appServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

</web-app> 

的servlet上下文:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> 

    <!-- Enables the Spring MVC @Controller programming model --> 
    <annotation-driven /> 

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> 
    <resources mapping="/resources/**" location="/resources/" /> 

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> 
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
    </beans:bean> 

    <context:component-scan base-package="com.esb.sso" /> 

    <beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
     <beans:property name="basename" value="/WEB-INF/messages" /> 
    </beans:bean> 

</beans:beans> 

和messages.properties:

NotNull.loginForm.login=must not be blank. 
NotNull.loginForm.password=must not be blank. 
Size.loginForm.login=Login size must be between 1 and 50 charters. 
Size.loginForm.password=Password size must be between 1 and 50 charters. 

我不知道问题出在哪里

Coul'd enybody帮助我 ?

回答

0

假设HomeController中的复制粘贴错误 - “/”映射方法的get方法。

要回答您的问题 - 您必须指定LoginForm对象作为模型属性,以便将验证绑定到BindingResult。下面是正确的代码

public String validation((@ModelAttribute("loginForm") @Valid LoginForm loginForm, BindingResult result, 
     Map model) throws IOException { 

仅供参考看到documentation

+0

我已经添加@ModelAttribute,但什么都没有改变。我仍然没有正确的验证。 :( – Ilkar 2012-01-17 08:02:12

+0

你可以尝试'@NotEmpty'注释从Hibernate验证器(hibernate-validator-4.0.2.GA.jar)而不是'@NotNull'。实际上可能是因为'form:input'标签提交了一个空值字符串,当你没有指定任何输入,从而通过@NotNull验证。 – 2012-01-18 07:14:09

+0

这个改变什么也没做。我的项目是基于'http://www.roseindia.net/tutorial/spring/spring3/web/spring-3-mvc -validation-example.html'。当我下载该示例时,它的工作原理是正确的。但是当我尝试用自己的方法构建它时,或者只是将文件从该示例复制到新项目时,表单无法验证。验证不起作用,每个表单都通过验证,也许我应该尝试其他示例? – Ilkar 2012-01-18 08:28:32