1.概述
在web页面,验证请求参数一般使用jquery Validation 。
如果有人恶意绕过页面验证,进行请求,或者js验证规则不好实现,可使用spring mvc和Hibernate Validator进行验证。
2. 源码和配置实例
1,一个实体类User
@Entity
@Table(name = "ss_user")
public class User extends IdEntity {
@NotEmpty
private String loginName;
//其他属性和验证规则就不多写了
//getter 和setters
@NotEmpty(message = "Password must not be blank.")
private String password;
}
persistence相关标签是为了持久化,在此不是必须的
@NotEmpty :hibernate validator的一个规则,表示此属性不能为空
password使用了自定义的错误消息提示
2.控制器
@RequestMapping(value = "/reg", method = RequestMethod.POST)
public String login(@Valid User user, BindingResult result) {
for (Object object : result.getAllErrors()) {
if (object instanceof FieldError) {
FieldError fieldError = (FieldError) object;
System.out.println(fieldError.getField() + ":"
+ fieldError.getCode());
}
if (object instanceof ObjectError) {
ObjectError objectError = (ObjectError) object;
}
}
if (result.hasErrors()) {
return "register";
}
//accountService.saveUser(user);
return "success";
}
@Valid 使用
JSR303 BeanValidator 验证。hibernate validator 是 JSR303 BeanValidator 的一个实现
BindResult result 验证结果,可通过接下来的方法遍历查看验证结果。在页面显示的时候,也需要使用它。
3.配置文件 spring-mvc.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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<mvc:annotation-driven />
<context:component-scan base-package="com.blueinfo.jee.web" />
<mvc:resources location="/static/" mapping="/static/**"/>
<!-- 设置freeMarker的配置文件路径 -->
<bean id="freemarkerConfiguration"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:freemarker.properties" />
</bean>
<!-- 注意:FreeMarker与SpringMVC集成时,其配置一定要放在SpringMVC的配置之前 -->
<!-- 否则:在访问"/getUser"时服务器就会报告[HTTP Status 404 - /WEB-INF/jsp/myfree.jsp] -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!-- 指定FreeMarker模板文件目录 -->
<property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
<property name="freemarkerSettings" ref="freemarkerConfiguration" />
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="prefix" value=""/>
<property name="suffix" value=".ftl"/>
<property name="contentType" value="text/html; charset=UTF-8"/>
<property name="requestContextAttribute" value="ctx"/>
</bean>
mvc:annotion-driven 配置了此项才能才能在controller中使用@Valid
其它都是普通的spring mvc配置,主要配置freemarker作为页面模板。
4,页面register.ftl
<#import "spring.ftl" as spring /> -------------------------1
<html>
<head>
<#assign ct = ctx.contextPath >
<title>登陆页</title>
<link href="${ct}/static/bootstrap/2.3.0/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="${ct}/static/jquery-validation/1.11.0/validate.css" type="text/css" rel="stylesheet" />
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
background-color: #f5f5f5;
}
.form-signin {
max-width: 300px;
padding: 19px 29px 29px;
margin: 0 auto 20px;
background-color: #fff;
border: 1px solid #e5e5e5;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.05);
-moz-box-shadow: 0 1px 2px rgba(0,0,0,.05);
box-shadow: 0 1px 2px rgba(0,0,0,.05);
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin input[type="text"],
.form-signin input[type="password"] {
font-size: 16px;
height: auto;
margin-bottom: 15px;
padding: 7px 9px;
}
</style>
</head>
<body>
<div class="container">
<form class="form-signin" id="loginForm" action="reg" method="post">
<h2 class="form-signin-heading">请填写注册信息</h2>
<@spring.bind "user.loginName" /> ----------------------2
<#list spring.status.errorMessages as error> <font style="color:red;"><b>${error}</b></font> <br> </#list>----------------3
用户名:<input type="text" class="input-block-level " placeholder="" name="loginName">
邮箱:<input type="text" class="input-block-level " placeholder="Email address" name="email">
<@spring.bind "user.password" /> ---------------------4
<#list spring.status.errorMessages as error> <font style="color:red;"><b>${error}</b></font> <br> </#list> ------------5
密码:<input type="password" class="input-block-level " placeholder="Password" name="password" >
<button class="btn btn-large btn-primary" type="submit">提交</button>
</form>
</div>
<script src="${ct}/static/jquery/jquery-1.9.1.min.js" type="text/javascript"></script>
<script src="${ct}/static/bootstrap/2.3.0/js/bootstrap.min.js"></script>
<script src="${ct}/static/jquery-validation/1.11.0/jquery.validate.min.js" type="text/javascript"></script>
<script src="${ct}/static/jquery-validation/1.11.0/messages_bs_zh.js" type="text/javascript"></script>
<script>
$(document).ready(function() {
$("#loginForm").validate();
});
</script>
</body>
</html>
在1处,引用freemarker的宏,官方建议引用为spring
在2处,绑定实体类对象的loginName属性,使得spring.status中的信息是和loginName相关,包括(errorMessages,value,expression),我是这样理解的,有不对的地方请不吝指教。
在3处,提取loginName的验证信息,显示出来。
4和5重复2,3动作。不过是针对password属性。
结果图
这是 不填写任何数据提交后返回的页面。用户名显示的默认错误信息,密码显示的是自定义的信息提示。
成功页面就不贴了,只是一个显示页面。
3. 参考手册
hibernate validator:http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#validator-defineconstraints-builtin\
spring 模板的form相关宏操作:http://static.springsource.org/spring/docs/2.5.x/reference/view.html#view-velocity-forms