我使用Spring Web MVC框架在java中编写Web应用程序。某种方式验证不起作用。 下面描述了控制器类:
@Controller
public class UserNameController
{
@InitBinder()
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new UserNameValidator());
}
//
@RequestMapping(value="userName.htm", method=RequestMethod.POST)
public String doForm(@ModelAttribute("user") @Valid User user, BindingResult result, Model model)
{
System.out.println("------------ "+ user.getuName()+" ---------");
if (result.hasErrors()) {
System.out.print("===== errors ======");
}
model.addAttribute("user",user);
return "registration";
}
public class UserNameValidator implements Validator
{
public boolean supports(Class clazz)
{ System.out.println("========== "+User.class.isAssignableFrom(clazz)+" ===================");
return User.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors)
{
System.out.println("=======================");
User newUser = (User) target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "uName", "field.required", "Required field");
if(errors.hasFieldErrors("uName"))
{
// if(user.existUser() == true)
// {
//}
System.out.print("===== errors 2 ======");
}
}
}
}
虽然'validate'方法保持空闲,但调用方法'supports'会给出真值。有什么问题?
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="forum.web" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
</beans>
User.java源文件:
public class User
{
private String uName;
public User(){}
public User(String uName)
{ System.out.println("=== Constructor==== " + uName);
this.uName= uName;
}
public String toString()
{System.out.println("=====toString()==== " + uName);
return this.uName;
}
public String getuName()
{
return uName;
}
public void setuName(String uName)
{
this.uName = uName;
}
}
jsp页面的主要部分:
<form id="userName" action="userName.htm" method="post" accept="text/plain" accept-charset="UTF-8" enctype="application/x-www-form-urlencoded">
<td>
<label for> User Name:
</td>
<td> </td>
<td> </td>
<td>
<form:errors path="uName"/>
<input type="text" name="uName" maxlength="20" size="40" onmouseout="submitUName()" value="${user}"/> </p> </p>
</td>
<td>*</td>
</form>
</tr>
这是我更新的Controller(新版本):
@Controller
public class UserNameController
{
private Validator validator;
public void setValidator(Validator validator)
{
this.validator= validator;
}
@InitBinder("user")
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new UserNameValidator());
System.out.println("A binder for object: =============== " + binder.getObjectName());
}
@RequestMapping(value="userName.htm", method=RequestMethod.POST)
public String userName(@ModelAttribute("user") User user, BindingResult result, Model model)
{
this.validator.validate(user, result);
System.out.println("------------ "+ user.getuName()+" ---------");
if (result.hasErrors()) {
System.out.print("===== errors ======");
}
model.addAttribute("user",user);
return "registration";
}
public class UserNameValidator implements Validator
{
public boolean supports(Class clazz)
{ System.out.println("========== "+User.class.isAssignableFrom(clazz)+" ===================");
return User.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors)
{
System.out.println("=======================");
User newUser = (User) target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "uName", "field.required", "Required field");
if(errors.hasFieldErrors("uName"))
{
// if(user.existUser() == true)
// {
//}
System.out.print("===== errors 2 ======");
}
}
}
}
虽然由于某些原因,此行this.validator.validate(user, result);
会导致NullPointerException。无论如何,'validate'方法不会像上面那样被调用。
最好的问候
答案 0 :(得分:2)
尝试指定绑定器将应用于哪个对象(模型属性或请求参数),例如@InitBinder( “用户”)。请注意,您可以提供一系列名称。
此外,您可以通过initBinder方法了解更多有关正在进行的操作的信息: System.out.println(“对象的绑定程序:”+ binder.getObjectName());
要检查的另一件事:您的JSP使用与控制器相同的名称。你的标签是什么样的?它是否正确设置了modelAttribute =“user”属性?