SpringMVC服务器验证—-JSR-303 java Bean 验证标准。
客户端验证:如果填写的数据不符合规则,就不会把数据提交到服务器(例如登录时,不填写账号和密码,不会把数据提交到服务器,客户端验证提示不能为空)。
服务器验证(两种情况):1.当通过非正常手段,跳过客户端验证,把不符合规则的数据提交到了服务器,此时需要进行客户端验证(例如登录时,直接通过地址栏把数据提交到服务器,不经过客户端验证) —–跟客户端验证的功能一样,服务器验证是档户通过非正常手段跳过了客户端验证。 2.当客户端没有进行客户端验证时,也需要进行服务器验证。
服务器验证目的:验证从客户端提交到服务器的数据的格式正确与否,如果传来的数据格式不正确,提示客户数据不正确,减轻了服务器的压力。
案例:用户的登录,如果不填写账号和密码,通过服务器验证,会显示账号和密码不能为空,只有当两者都填写了之后才会通过验证。
用springmvc来连接客户端与服务器时,会自动把数据封装到请求方法的参数上,此时需要对传来的参数进行验证。 假设实体类是User
public class User {
private String username;
private String password;
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;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
1. 导入验证需要的jar包。
1.1 JSR-303 java Bean 的三个jar包
1.2 SLF4J日志包俩个
1.3 支持springMVC的额外包
1.3.1 spring核心包 5个
1.3.2 springweb包 3个
2. 创建验证类。实现validator接口
public class MyValidate implements Validator{
/*springMVC数据的封装功能 指定符合条件的目标封装类(封装的目标类)需要验证*/
//是否需要验证
public boolean supports(Class<?> arg0) {
return User.class.equals(arg0); //指定user这个目标封装类需要验证
}
//验证
public void validate(Object arg0, Errors error) {
System.out.println("验证user"+arg0);
ValidationUtils.rejectIfEmpty(error, "username", null, "用户名不能为空"); //如果username是空,则返回错误信息
ValidationUtils.rejectIfEmpty(error, "password", null, "密码不能为空"} //同上
}
**3. 设置验证类** --当给一个类设置了验证类,这个类才具有服务器验证能
@Controller //该类对象的创建交给springIoc去创建
public class MyController {
/**
* 给这个类绑定一个验证类
* @param binder
*/
@InitBinder
public void initBinder(DataBinder binder){
binder.setValidator(new MyValidate());
}
@RequestMapping("/index")
public String index(HttpServletRequest request){
request.setAttribute("user", new User());
return "index";
}
@RequestMapping("/login")
public String login(User user) {
if(!error.hasErrors()){
//如果有错误信息,则不进行任何操作,在客户端给用户提示用户名不为空或密码不为空的的信息
System.out.println(user);
return "index";
}
}
}
**4. 在需要验证的bean的方法的参数上加上注解 @valid**
目的:请求这个特定的方法时,会进行服务器验证
/**
* 前提:给这个类设置了验证类 及上面initBinder()这个方法
* 当前提成立时,客户端请求服务器这个方法,会把数据封装到user对象中,如果前面写了@valid,则会验证,如果没有则不会验证
*
* 客户端请求的方法必须带 Errors 这个参数 否则报org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
* Field error in object 'user' on field 'username': rejected value []; codes [null.user.username,null.username,null.java.lang.String,null]; arguments []; default message [用户名不能为空]
* Field error in object 'user' on field 'password': rejected value []; codes [null.user.password,null.password,null.java.lang.String,null]; arguments []; default message [密码不能为空]
* 错误
*/
@RequestMapping("/login")
public String login(@Valid User user,Errors error) {
if(!error.hasErrors()){
//如果有错误信息,则不进行任何操作,在客户端给用户提示用户名不为空或密码不为空的的信息
System.out.println(user);
return "index";
}
}
**5.客户端获取服务器验证错误信息**
黄色部分获取步骤2中存放的错误信息