initbinder对ajax不起作用,Spring MVC InitBinder验证方法
使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的,也即比较复杂的验证情况下才会使用。大部份简单的表单验证,使用annotation验证即可以解决。
这里需要注意的一点:InitBinder和Annotation两种验证只能二选一,如果使用了InitBinder,就不能使用Annotation验证。
前面的web.xml和spring.xml的配置就不再重复,可参见上面链接中的配置。一模一样。
直接上代码:
1、User5 model实体类
package com.my.controller.bean;
import java.util.Date;
public class User5 {
private long id;
private String name;
private String password;
private Date createTime;
private int age;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2、新增一个Validator:
package com.my.controller.validator;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import com.my.controller.bean.User5;
@Component
public class TestValidator implements Validator {
@Override
public boolean supports(Class> paramClass) {
return User5.class.equals(paramClass);
}
@Override
public void validate(Object obj, Errors errors) {
User5 user = (User5) obj;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "valid.name", null, "");
if(user.getAge() < 18) {
errors.rejectValue("age", "valid.ageMin", new Object[]{"age" ,18}, "年龄不能小于{1}岁");
}
}
}
这里需要加入@Component,注入DI
3、Controller
package com.my.controller;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.my.controller.bean.User5;
@Controller
@RequestMapping(value="binder")
public class TestInitBinderController {
@Autowired
@Qualifier(value="testValidator")
private Validator validator;
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(validator);
}
@RequestMapping(method=RequestMethod.GET)
public String index() {
return "/TestInitBinder/index";
}
@RequestMapping(value="add", method=RequestMethod.POST)
public ModelAndView add(@ModelAttribute @Valid User5 user, BindingResult result) {
ModelAndView view = new ModelAndView("TestInitBinder/index");
view.addObject("user", user);
if(result.hasErrors()) {
List errs = result.getFieldErrors();
Map mapErrors = new LinkedHashMap();
for(FieldError err : errs) {
System.out.println("ObjectName:" + err.getObjectName() + "\tFieldName:" + err.getField()
+ "\tFieldValue:" + err.getRejectedValue() + "\tMessage:" + err.getDefaultMessage());
mapErrors.put(err.getField(), err.getDefaultMessage());
view.addObject("errors", mapErrors);
}
return view;
}
return view;
}
}
把Validator注入到Controller中。
事实上,使用InitBinder,在add controller中的err.getDefaultMessage()方法是取不到对应正确的message的。可以看最后的输入打印结果。
4、View
Init binder
User name:
Password:
Age:
Error:
注意,这里只能使用来取得错误信息,且,这个一定要在
当中。
5、结果测试
点击Add button:
打印输出:
可以看到,这里取不到错误的正确信息
事实上,在一个非常复杂表单页面,里头所提交的数据验证有一定的业务逻辑性时,InitBinder应该都不多用,因为很多时候我们可以使用一个Map,把errors插入进去,在页面读取即可。比如:
Map errors;
errors.add("name", "user name can NOT be empty!");
:
:
页面中只需要使用:
${errors.name}
即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
initbinder对ajax不起作用,Spring MVC InitBinder验证方法相关推荐
- Spring MVC自定义验证注释
在上一教程中,我展示了如何使用注释来验证表单 . 这对于简单的验证非常有用,但是最终,您需要验证一些现成的注释中没有的自定义规则. 例如,如果您需要根据输入的出生日期来验证用户已超过21岁,或者可能需 ...
- initbinder对ajax不起作用,ajax – @InitBinder与@RequestBody在Spring 3.2.4中转义XSS
我在我的方法中有一个@RequestBody注释参数,如下所示: @RequestMapping(value = "/courses/{courseId}/{name}/comment&qu ...
- [Spring MVC] - InitBinder验证
Spring MVC使用InitBinder验证: 使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的,也即比较复杂的验证情况下才会使用.大部份简单的 ...
- initbinder对ajax不起作用,详解SpringMVC注解@initbinder解决类型转换问题
在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换,而SpringMVC默认不支持这个格式的转换,所以需要手动配置,自定义数据的绑定才能解决这个问题. ...
- Spring MVC数据验证简介
用户的输入一般是随意的,为了保证数据的合法性,数据验证是所有 Web 应用必须处理的问题. 在 Spring MVC 框架中有以下两种方法可以验证输入数据: 利用 Spring 自带的验证框架. 利用 ...
- Spring MVC数据验证
文章目录 客户端验证 服务器端验证 自定义 Spring 验证器 Validator接口 ValidationUtils 类 Spring MVC验证器应用实例 JSR 303 验证 Hibernat ...
- Spring MVC Hibernate验证器使用示例
下面的示例演示如何使用Spring Web MVC框架在表单中使用错误处理和验证器. 首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web ...
- Spring MVC JSR-303验证框架之Hibernate-Validator
对于 JSR 303 验证,目前有两个实现,一个是 Hibernate Validator,一个是 Apache BVal.本教程采用的是 Hibernate Validator,注意它和 Hiber ...
- Spring MVC 自定义验证器示例
在任何 spring web mvc 应用程序中,我们经常必须处理表单.应用程序首先显示一个表单,然后用户填写该表单并将其提交给服务器.在服务器上,应用程序需要捕获表单输入并处理输入(例如,存储在数据 ...
最新文章
- win7下面安装mongo步骤(开发环境为pycharm)
- docker部署openvas
- Mysql和Hadoop+Hive有什么关系?
- JavaFX UI控件教程(二十五)之Color Picker
- 【mysql】提取字符串中的数字、字母、中文,或任意组合
- Controller接口控制器详解(1)
- cin.ignore()函数的使用
- XJOI 3266 Dyeing 染色 题解
- IDE警告信息不应该被忽略
- maven编译报程序包不存在_Hadoop学习之路(二)Hadoop2.7.5在CentOS6.7上的编译
- VC 中一些控件的使用方法(TabControl, 工具栏)
- mysql主从复制是拉模式吗,CentOS 7系统配置MySQL的主从复制模式 (Master-Slave Replication)...
- 云南满泽生物科技有限公司 满泽玛卡玛咖精片 东革阿里 奶昔
- Windows中I/O完成端口机制详解
- Go语言%d,%p,%v等占位符
- JAVA守护线程 非守护线程
- 白盒/黑盒/灰盒测试的区别
- 'config.h' file not found 的解决方法以及可能遇到的问题
- Linux实现ISCSI共享设备
- MathType 安装到 WPS 的小插曲