Spring MVC:验证器和@InitBinder

很难想象没有针对用户数据的验证逻辑的Web应用程序。 几乎所有用户的数据都有一些限制,例如,出生日期应由日,月,年等组成。SpringMVC拥有自己的数据验证解决方案,并且在Validator界面的帮助下可用。 Spring-MVC验证

Spring MVC Validator的用法

当您从用户那里收到某种数据时,及时进行验证是有意义的。 一种明显的方法是使用Web表单。 Validator接口是一种实现整个Spring MVC应用程序验证逻辑的方法。 听起来很有前途。

要开始使用Validator,需要做三件事:

  • 为某些域模型创建一个验证器类,并实现Validator接口。
  • 重载support(Class clazz)方法。
  • 重载validate(Object target,Errors errors)方法。

现在,您已经知道Validator接口用法的基础知识。 理论够了,让我们继续实践。

Vlidator Spring MVC示例

我想在先前的教程之一中演示Validator接口的实际作用,其中的验证不会多余。 我的意思是带有Spring Data的示例应用程序。 首先,您需要更新pom.xml文件,添加以下依赖项:

...
		<dependency>
			<groupid>javax.validation</groupid>
			<artifactid>validation-api</artifactid>
			<version>1.0.0.GA</version>
		</dependency>
		<dependency>
			<groupid>org.hibernate</groupid>
			<artifactid>hibernate-validator</artifactid>
			<version>4.3.0.Final</version>
		</dependency>
...

在项目中,我有一个POJO:

@Entity  
    @Table(name = "shops")  
    public class Shop {  

        @Id  
        @GeneratedValue  
        private Integer id;  

        private String name;  

        @Column(name = "employees_number")  
        private Integer emplNumber;  

        public Integer getId() {  
            return id;  
        }  

        public void setId(Integer id) {  
            this.id = id;  
        }  

        public String getName() {  
            return name;  
        }  

        public void setName(String name) {  
            this.name = name;  
        }  

        public Integer getEmplNumber() {  
            return emplNumber;  
        }  

        public void setEmplNumber(Integer emplNumber) {  
            this.emplNumber = emplNumber;  
        }  
    }

因此,让我们为其创建验证规则:

  • “名称”不能为空。
  • “ emplNumber”不能为空。
  • “ emplNumber”不能小于1。

用于这些目的的验证类如下所示:

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.spr.model.Shop;

@Component
public class ShopValidator implements Validator {

	private final static String EMPLOYEES_NUMBER = "emplNumber";

	@Override
	public boolean supports(Class clazz) {
		return Shop.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
		Shop shop = (Shop) target;

		Integer emplNumber = shop.getEmplNumber();

		ValidationUtils.rejectIfEmpty(errors, "name", "shop.name.empty");
		ValidationUtils.rejectIfEmpty(errors, EMPLOYEES_NUMBER, "shop.emplNumber.empty");

		if (emplNumber != null && emplNumber < 1)
			errors.rejectValue(EMPLOYEES_NUMBER, "shop.emplNumber.lessThenOne");

	}

}

注意,我将@Component注释应用于该类,因为我计划稍后将其注入ShopController。 这是验证器方法的说明:

support(Class)–此验证程序可以验证提供的Class的实例吗? validate(Object,org.springframework.validation.Errors)–验证给定的对象,并在验证错误的情况下,使用给定的Errors对象注册那些对象。 有关更多信息,请参见ValidationUtils类的javadoc。 验证期间将显示的消息应放在“ messages.properties”文件中:

shop.name.empty = The "Shop name" field can't be empty.
shop.emplNumber.empty = The "Employees number" field can't be empty.
shop.emplNumber.lessThenOne = The number of employees can't be less then 1.

让我们转到控制器的代码:

...
	@Autowired
	private ShopValidator shopValidator;

	@InitBinder
	private void initBinder(WebDataBinder binder) {
		binder.setValidator(shopValidator);
	}
...
	@RequestMapping(value="/create", method=RequestMethod.POST)
	public ModelAndView createNewShop(@ModelAttribute @Valid Shop shop,
			BindingResult result,
			final RedirectAttributes redirectAttributes) {

		if (result.hasErrors())
			return new ModelAndView("shop-new");

		ModelAndView mav = new ModelAndView();
		String message = "New shop "+shop.getName()+" was successfully created.";

		shopService.create(shop);
		mav.setViewName("redirect:/index.html");

		redirectAttributes.addFlashAttribute("message", message);	
		return mav;		
	}
...

上面的代码片段演示了在控制器层中需要执行的主要操作,以实现验证:

  • 验证器的自动装配。
  • 将验证器添加到InitBinder
  • @Valid注释应用于具体控制器中的模型。

最后,让我们看一下JSP:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
...
<h1>New Shop page</h1>
<form:form method="POST" commandname="shop" action="${pageContext.request.contextPath}/shop/create.html">
<table>
<tbody>
<tr>
<td>Shop name:</td>
<td><form:input path="name"></form:input></td>
<td><form:errors path="name" cssstyle="color: red;"></form:errors></td>
</tr>
<tr>
<td>Employees number:</td>
<td><form:input path="emplNumber"></form:input></td>
<td><form:errors path="emplNumber" cssstyle="color: red;"></form:errors></td>
</tr>
<tr>
<td><input value="Create" type="submit"></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</form:form>
...

请注意form:errors标记,它们负责显示错误消息。

Spring-MVC-Validator

摘要

Validator接口允许为应用程序中的每个域模型对象创建灵活的验证层。 它是标准JSR-303验证批注(例如@ Min,@ Max,@ NotNull,@ Size等)的不错选择。您可以在GitHub找到示例的完整版本。

参考: Spring MVC:来自Fruzenshtein的便笺博客的JCG合作伙伴 Alexey Zvolinskiy的Validator和@InitBinder

翻译自: https://www.javacodegeeks.com/2013/06/spring-mvc-validator-and-initbinder.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值