数据验证分为前台验证和后台验证
前台验证是不安全的 适合简单的验证
例如
<script type="text/javascript">
function checkSubmit(){
var userName=document.getElementsByName("userName")[0].value;
if(userName==null||userName==""){
alert("用户名不能为空");
return;
}
var password=document.getElementsByName("password")[0].value;
var repassword=document.getElementsByName("repassword")[0].value;
if(password!=repassword){
alert("两次输入密码不一致");
return;
}
document.forms[0].submit();
}
</script>
form表单
<form action="${pageContext.request.contextPath}/myreg" method="get">
用户名:<input type="text" name="userName">
密码:</s:message>:<input type="password" name="password">
确认密码:<input type="password" name="repassword">
<input type="button" οnclick="checkSubmit()" value="<s:message code="refer"></s:message>">
</form>
在浏览器=====javascript.doucment.forms[0].submit() 可以直接绕过前台验证
后台验证
1、要在pom.xml中引入jsr303的jar包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.2.Final</version>
</dependency>
JSR 303是Java为Bean数据合法性校验所提供的标准框架,它已经包含在Java EE 6.0中。JSR303通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。
你可以通过http://jcp.org/en/jsr/detail?id=303了解JSR303的详细内容。
注 解 | 功能说明 |
@Null | 被注释的元素必须为null |
@NotNull | 被注释的元素必须不为null |
@AssertTrue | 被注释的元素必须为true |
@AssertFalse | 被注释的元素必须为false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
<mvc:annotation-driven/>会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注@Valid注解即可让SpringMVC在完成数据绑定后执行数据校验的工作。
<!-- 启用注解驱动 -->
<mvc:annotation-driven validator="localValidatorFactoryBean"></mvc:annotation-driven>
1.声名式
实体类 与表单的name值一致
package cn.et.springmvc.lesson03;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
public class UserInfo {
/**
* NotNull 属性名 !=null
* NotEmpty 属性名!=null && !属性名.equals("")
*/
@NotEmpty(message="用户名不能为空")
private String userName;
@NotEmpty(message="密码不能为空")
private String password;
@NotEmpty(message="再次输入不能为空")
private String repassword;
// lixin@126.com
@Pattern(message="邮箱格式错误",regexp=".+@.+\\..+")
@Email(message="邮箱格式不正确")
private String email;
@NotEmpty(message="年龄不能为空")
@Max(value=100,message="年龄必须小于100")
@Min(value=1,message="年龄大于1")
private String age;
@Size(min=11, max=11,message="手机号码必须是11位")
private String phone;
@Pattern(message="网址格式不正确",regexp="^(?=^.{3,255}$)(http(s)?:\\/\\/)?(www\\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\\d+)*(\\/\\w+\\.\\w+)*$")
private String website;
@Pattern(message="时间格式错误",regexp="(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)")
private String date;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website = website;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "UserInfo [age=" + age + ", email=" + email + ", password="
+ password + ", phone=" + phone + ", repassword=" + repassword
+ ", userName=" + userName + "]";
}
}
package cn.et.springmvc.lesson03;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* 编程式
*
* 生名式
*
*
*
* 后台验证步骤
* 1、javabean添加验证注解
* 2、action中使用@valid表示javabean 使用Errors或者BindingResult判断是否验证失败
* 3、出现jar包冲突
* @author THINK
*
*/
@Controller
public class RegController {
@RequestMapping(value="/reg",method=RequestMethod.POST)
//@ModelAttribute("userInfo") 修改对象名
public String index(@ModelAttribute("userInfo") @Valid UserInfo user,BindingResult error){
if(error.hasErrors()){//出现错误 跳到登陆页面并提示错误信息
return "/lesson03/reg.jsp";
}
return "/lesson03/suc.jsp";//成功的页面
}
}
前台的页面
jsp页面引入 <%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 标签库
打印错误信息 <font color=red><form:errors path="userInfo.userName"></form:errors></font>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'reg.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<script type="text/javascript">
function checkSubmit(){
/*var userName=document.getElementsByName("userName")[0].value;
if(userName==null||userName==""){
alert("用户名不能为空");
return;
}
var password=document.getElementsByName("password")[0].value;
var repassword=document.getElementsByName("repassword")[0].value;
if(password!=repassword){
alert("两次输入密码不一致");
return;
}*/
document.forms[0].submit();
}
</script>
<body>
<form action="${pageContext.request.contextPath}/reg" method="post">
用户名:<input type="text" name="userName"><font color=red><form:errors path="userInfo.userName"></form:errors></font><br/>
密码:<input type="password" name="password"><font color=red><form:errors path="userInfo.password"></form:errors></font><br/>
再次输入密码<input type="password" name="repassword"><font color=red><form:errors path="userInfo.repassword"></form:errors></font><br/>
邮件:<input type="text" name="email"><font color=red><form:errors path="userInfo.email"></form:errors></font><br/>
年龄:<input type="text" name="age"><font color=red><form:errors path="userInfo.age"></form:errors></font><br/>
手机号码:<input type="text" name="phone"><font color=red><form:errors path="userInfo.phone"></form:errors></font><br/>
个人网站:<input type="text" name="website"><font color=red><form:errors path="userInfo.website"></form:errors></font><br/>
出生日期:<input type="text" name="date"/><font color=red><form:errors path="userInfo.date"></form:errors></font><br/>
<input type="button" οnclick="checkSubmit()" value="提交">
</form>
</body>
</html>
页面效果(显示的效果不是很好) 我们可以和编程式结合是使用 把实体类的年龄验证注释掉
package cn.et.springmvc.lesson03;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* 编程式
*
* 生名式
*
*
*
* 后台验证步骤
* 1、javabean添加验证注解
* 2、action中使用@valid表示javabean 使用Errors或者BindingResult判断是否验证失败
* 3、出现jar包冲突
* @author THINK
*
*/
@Controller
public class RegController {
@RequestMapping(value="/reg",method=RequestMethod.POST)
//@ModelAttribute("userInfo") 修改对象名
public String index(@ModelAttribute("userInfo") @Valid UserInfo user,BindingResult error){
if(!user.getPassword().equals(user.getRepassword())){
error.addError(new FieldError("userInfo","repassword","两次密码输入不一致"));
}
if(user.getAge()==null||"".equals(user.getAge())){
error.addError(new FieldError("userInfo","age","年龄不能空"));
}else{
Integer age;
try {
age = Integer.parseInt(user.getAge());
if(age<1||age>100){
error.addError(new FieldError("userInfo","age","年龄不合法"));
}
} catch (NumberFormatException e) {
error.addError(new FieldError("userInfo","age","必须是数字"));
}
}
if(error.hasErrors()){
return "/lesson03/reg.jsp";
}
return "/lesson03/suc.jsp";
}
}
结合后的页面(这样就比前面的美观多了)