Spring中通过实现Validator接口进行编程式验证

网上找了关于SimpleFormController表单验证的资料,再经过自己的思考和总结,程序终于能够跑起来了!

在以下程序中可以知道如何解决[color=red]Neither BindingResult nor plain target object for bean name 'user' available as request attribute[/color]问题!

以下为一个简单的登录表单验证功能,验证用户名和密码是否为空,当两都都不为空时进入成功页,当两者中有一个为空,则提示错误信息

该应用中包含index.jsp,success.jsp页面,UserController.java,UserValidator.java,User.java类
index.jsp和success.jsp放置在WEB-INF/pages/目录下

index.jsp登录主页面

<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<html>
<head>
<title>用户登录</title>
</head>
<body>
<form action="register.htm" method="post">
<table>
<tr>
<td>
用户名:
</td>
<td>
<spring:bind path="user.username">
<input type="text" name="${status.expression}"
value="${status.value}" />
<font color="red">${status.errorMessage}</font>
</spring:bind>
</td>
</tr>
<tr>
<td>
密码:
</td>
<td>
<spring:bind path="user.password">
<input type="password" name="${status.expression}"
value="${status.value}" />
<font color="red">${status.errorMessage}</font>
</spring:bind>
</td>
</tr>
<tr>
<td>
<input type="submit" value=" 提交 " />
</td>
<td>
<input type="reset" value=" 重置 " />
</td>
</tr>
</table>
</form>
</body>
</html>


success.jsp页面代码

<%@ page contentType="text/html;charset=utf-8"%>
<html>
<head>
<title>登录成功</title>
</head>
<body>
欢迎<font color="red">${user.username}</font>进入系统!
</body>
</html>


UserController.java为用户登录控制器

public class UserController extends SimpleFormController {

@Override
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
User user = (User) command;

return new ModelAndView(this.getSuccessView(), "user", user);
}
}


UserValidator.java类中包含用户基本信息的验证

public class UserValidator implements Validator {

private String className;

@SuppressWarnings("unchecked")
public boolean supports(Class clazz) {
//因为clazz没有重写equals()方法,这里跟类的限定名称进行比较
return clazz.getName().equals(className);
}

public void validate(Object obj, Errors error) {
User user = (User) obj;

if (user.getUsername() == null || "".equals(user.getUsername())) {
ValidationUtils.rejectIfEmptyOrWhitespace(error, "username",
"username.required", "用户名不能为空!");
}

if (user.getPassword() == null || "".equals(user.getPassword())) {
ValidationUtils.rejectIfEmptyOrWhitespace(error, "password",
"password.required", "密码不能为空!");
}
}

public String getClassName() {
return className;
}

public void setClasName(String className) {
this.className = className;
}
}


dispatcher-servlet.xml文件配置信息

<?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:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.0.xsd">

<!-- 处理器映射 -->
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="register.htm">registerController</prop>
</props>
</property>
</bean>

<!-- 请求参数解析 -->
<bean id="paramResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="action" />
</bean>

<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>

<bean id="userValidator" class="com.test.validator.UserValidator">
<property name="clasName" value="com.test.vo.User" />
</bean>

<bean id="registerController"
class="com.test.controller.UserController">
<property name="commandName" value="user" />
<property name="commandClass" value="com.test.vo.User" />
<property name="formView" value="index"/>
<property name="successView" value="success" />
<property name="validator" ref="userValidator" />
</bean>

</beans>



这里有几点需要注意下:
1)当用户第一次请求时必须要经过DispatcherServlet的拦截,否则不能把表单信息绑定到User对象里!(我一开始把index.jsp页面放置在WebRoot根目录下,当访问直接index.jsp时老报错,因此就把index.jsp放置在WEB-INF/pages目录下,首先经过DispatcherServlet的拦截再跳转到formView属性指定的页面,结果就能正常访问)
2)<spring:bind path="user.username" />标签中的path属性的user值必须与commandName的属性值一致!
3)如果没有指定commandName属性值的话,默认的值为command,那么在<spring:bind path="command.username">标签应该这样指定path的值

UserController类中的其他属性就不介绍了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值