`
zhangwei_david
  • 浏览: 475848 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring validate 使用(一)

阅读更多

     在Spring mvc 中使用alidate 首先需要实现alidate接口写道

@Component
public class ReservationValidator implements Validator {
private static final String COURT_NAME = "courtName";
private static final String DATE = "date";

public boolean supports(Class<?> clazz) {
return Reservation.class.isAssignableFrom(clazz);
}

public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, COURT_NAME,
"required.courtName", "Court name is required");
ValidationUtils.rejectIfEmpty(errors, DATE, "required.date",
"Court date is required");
ValidationUtils.rejectIfEmpty(errors, "hour", "required.hour",
"Court hour is required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "player.name",
"required.playername", "Player name is required");
ValidationUtils.rejectIfEmpty(errors, "sportType",
"required.sportType", "SportType is required");

}

 

 这是一个自定义的alidate实现类。 有了alidate 实现类那么在controller 中有该如何使用呢?这个就很简单了,只要controller 中注入这个validate 就可以直接使用了。

@Controller
@RequestMapping("reservationForm")
@SessionAttributes("reservation")
public class ReservationFormController {
@Autowired
private ReservationService reservationService;

@Autowired
private ReservationValidator reservationValidator;

@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(
dateFormat, true));
binder.registerCustomEditor(SportType.class,
new PropertyEditorSupport() {

@Override
public void setAsText(String text)
throws IllegalArgumentException {
int sportTypeId = Integer.parseInt(text);
SportType sportType = reservationService
.getSportType(sportTypeId);
setValue(sportType);
}

});
}

/*** @ModelAttribute 注解用于定义全局的模式属性,这种属性对处理方法中返回的任意视图可用 ***/
@ModelAttribute("sportTypes")
public List<SportType> populateSportTypes() {
return reservationService.getAllSportType();
}

@RequestMapping(method = RequestMethod.GET)
public String setupForm(Model model,
@RequestParam("username") String username) {
Reservation reservation = new Reservation();
reservation.setPlayer(new Player(username, null));
model.addAttribute("reservation", reservation);
return "reservationForm";
}

@RequestMapping(method = RequestMethod.POST)
public String submintForm(
@ModelAttribute("reservation") Reservation reservation,
BindingResult result, SessionStatus status, ModelMap model) {
// validate 方法返回后 BindingResult 中就包含了校验过程的结果。
reservationValidator.validate(reservation, result);
// 如果结果中包含错误
if (result.hasErrors()) {
model.addAttribute("reservation", reservation);
return "reservationForm";
}
reservationService.make(reservation);
// 删除session 中的对象
status.setComplete();
return "reservationSuccess";
}
 

 那么如果实在分页控制的controller 中有该如何使用呢?这个就需要将 校验的具体实现分为多个 方法。如:

 

@Component
public class PeriodicReservationValidator implements Validator {

private static final Logger logger = Logger
.getLogger(PeriodicReservationValidator.class);
private static final String COURT_NAME = "courtName";

public boolean supports(Class<?> clazz) {
return Reservation.class.isAssignableFrom(clazz);
}

public void validate(Object target, Errors errors) {
logger.info("validate,All");
validateCourt(target, errors);
validateTime(target, errors);
validatePlayer(target, errors);

}

public void validateCourt(Object target, Errors errors) {
logger.info("validateCourt");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, COURT_NAME,
"required.courtName", "Court name is required");

}

public void validatePlayer(Object target, Errors errors) {
logger.info("validatePlayer");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "player.name",
"required.playerName", "Player name is required");
}

public void validateTime(Object target, Errors errors) {
logger.info("validateTime");
ValidationUtils.rejectIfEmpty(errors, "fromDate", "required.fromDate",
"Court fromDate is required");
ValidationUtils.rejectIfEmpty(errors, "toDate", "required.toDate",
"Court toDate is required");
ValidationUtils.rejectIfEmpty(errors, "period", "required.period",
"Court period is required");
ValidationUtils.rejectIfEmpty(errors, "hour", "required.hour",
"Court hour is required");

}

 

package study.spring.mvc.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
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.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.util.WebUtils;

import study.spring.mvc.domain.PeriodiceReservation;
import study.spring.mvc.domain.Player;
import study.spring.mvc.service.ReservationService;
import study.spring.mvc.validator.PeriodicReservationValidator;

/**
* 使用@SessionAttributes 注解 为了支持表单的多次提交,并且在提交之间不会失去用户提供的数据。 使用@SessionAttributes
* 注解所赋值可以使用SessionStatus对象删除。
*
* @author Lenovo
*
*/
@Controller
@RequestMapping("periodicReservationForm")
@SessionAttributes("reservation")
public class PeriodReservationFormController {

private static final Logger logger = Logger
.getLogger(PeriodReservationFormController.class);
@Autowired
private ReservationService reservationService;

@Autowired
private PeriodicReservationValidator periodicReservationValidator;

@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(
dateFormat, true));
}

/*** @ModelAttribute 注解用于定义全局的模式属性,这种属性对处理方法中返回的任意视图可用 ***/

@ModelAttribute("periods")
public Map<Integer, String> periods() {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "Daliy");
map.put(7, "Weekly");
logger.info(map);
return map;
}

@RequestMapping(method = RequestMethod.GET)
public String setupForm(Model model) {
PeriodiceReservation reservation = new PeriodiceReservation();
reservation.setPlayer(new Player());
model.addAttribute("reservation", reservation);
return "reservationCourtForm";
}

@RequestMapping(method = RequestMethod.POST)
public String submintForm(
@ModelAttribute("reservation") PeriodiceReservation reservation,
HttpServletRequest request, HttpServletResponse response,
@RequestParam("_page") int currentPage, BindingResult result,
SessionStatus status, ModelMap model) {
Map<Integer, String> pageForms = new HashMap<Integer, String>();

logger.info("currentPage:" + currentPage);

pageForms.put(0, "reservationCourtForm");
pageForms.put(1, "reservationTimeForm");
pageForms.put(2, "reservationPlayerForm");
if (request.getParameter("_cancel") != null) {
return pageForms.get(currentPage);
} else if (request.getParameter("_finish") != null) {
logger.info("validate");
periodicReservationValidator.validate(reservation, result);
if (!result.hasErrors()) {
reservationService.makePeriodic(reservation);
status.setComplete();
return "reservationSuccess";
} else {
logger.info("validate fail:" + currentPage);
return pageForms.get(currentPage);
}
} else {
int targetPage = WebUtils.getTargetPage(request, "_target",
currentPage);
if (targetPage < currentPage) {
return pageForms.get(targetPage);
}
switch (currentPage) {
case 0:
periodicReservationValidator.validateCourt(reservation, result);
break;
case 1:
periodicReservationValidator.validateTime(reservation, result);
break;
case 2:
periodicReservationValidator
.validatePlayer(reservation, result);
break;
}
if (!result.hasErrors()) {
return pageForms.get(targetPage);
} else {
return pageForms.get(currentPage);
}
}
}

}
 

 

这样就可以在不同的页面使用不同的校验。

 

通过注解的方式校验示例代码如下:

/**
 *银行查询文件中条目模型
 *
 * @author zhangwei
 * @version $Id: RemitInquiryOrder.java, v 0.1 2015年4月23日 下午1:53:08 zhangwei Exp $
 */
public class RemitInquiryOrder extends BasicModel {

    /**UUID  */
    private static final long   serialVersionUID = 4502527293700078171L;

    /******************银行查询数据******************/
    /**银行业务编号**/
    @NotNull
    @MinLength(value = 2)
    @MaxLength(value = 32)
    private String              outBizNo;

    /**查询流水号**/
    @NotNull
    @MinLength(value = 2)
    @MaxLength(value = 32)
    private String              outInquiryId;

    /**清算流水号**/
    @NotNull
    @RegExp(value = "^\\d{19}")
    private String              settleSerialNo;

    /**币种**/
    @NotNull
    @RegExp(value = "^[A-Z]{3}$")
    private String              currency;

    /**汇款金额**/
    @NotNull
    @RegExp(value = "^([1-9]\\d*[.]?)(\\d{0,2})|(0.)(([0-9]?)[1-9])?$")
    private String              remitAmount;

    /**查询查复类型**/
    @NotNull
    @RegExp(value = "^Q[1,2]\\d{4}$")
    private String              inquiryType;

    /**报文内容**/
    @MaxLength(value = 200)
    private String              detail;

    /**过期时间**/
    @MaxLength(value = 19)
    @RegExp(value = "(\\s{0}|\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})")
    private String              expiryDate;

    /**备注**/
    @MaxLength(value = 50)
    private String              remark;

 

 

 //校验对象
        validator.validate(remitInquiryOrder, errors);
        if (errors.hasErrors()) {
            LoggerUtil
                .error(logger, "查询明细校验不合法,item={0},errors={1}", item, errors.getFieldErrors());
            remitInquiryOrder.setResult(RemitConstants.DATA_FAIL);
            remitInquiryOrder.setResultCode(RemitInquiryResultCode.ILLEGAL_ARGUMENT.getCode());
        }

 

<bean id="validator" class="org.springmodules.validation.bean.BeanValidator"
		p:configurationLoader-ref="configurationLoader" />
	<bean id="configurationLoader"
		class="org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoader" />

 

分享到:
评论

相关推荐

    spring validate 笔记

    Spring MVC的validate功能是用于处理数据验证的一种机制,它允许我们在服务器端对用户提交的数据进行校验,确保数据的有效性和准确性。以下是对Spring validate框架的详细说明: 1. **页面准备**: 在HTML页面中,...

    spring3.x对应的validate全包

    在IT领域,尤其是在Java开发中,Spring框架是一个广泛使用的开源框架,它提供了全面的企业级应用程序开发解决方案。在Spring 3.x版本中,`validate`标签指的是Spring的验证机制,这是一个非常重要的功能,用于确保...

    Maven+Spring MVC +Hibernate Validate

    本项目" Maven+Spring MVC +Hibernate Validate" 提供了一种强大的技术栈,用于实现这一目标。它将Maven作为项目构建工具,Spring MVC作为后端控制器框架,而Hibernate Validate则负责服务端的数据验证。下面我们将...

    Struts1.3.8使用validate 校验日期格式的问题

    Struts1.3.8使用validate 校验yyyyMM日期格式报错 博文链接:https://pharaohsprince.iteye.com/blog/234369

    springboot-validate

    `SpringBoot validate`指的是Spring Boot集成Hibernate Validator进行参数验证的功能。Hibernate Validator是JSR-303/JSR-349标准的参考实现,提供了一种在Java应用中进行数据校验的优雅方式。 ** Hibernate ...

    validate方法

    描述中的链接指向了iteye博客的一篇文章,虽然具体内容未提供,但我们可以推测文章可能详细解释了一个特定工具或库中的validate方法的使用,或者探讨了验证数据的一般策略和最佳实践。 标签"源码"意味着内容可能...

    Maven+Spring MVC +Hibernate Validate(服务端验证)

    标题 "Maven+Spring MVC +Hibernate Validate(服务端验证)" 描述的是一个使用现代Java Web开发技术栈构建的应用示例,其中包括三个核心组件:Maven、Spring MVC和Hibernate Validate。这个项目展示了如何整合这些...

    validate验证

    在实际应用中,`jQuery Validate`与后台框架(如Spring MVC或PHP Laravel)配合使用,可以实现前后端数据验证的一致性,确保提交到服务器的数据是经过验证的,减少无效请求,提升系统效率。此外,这个插件也与其他库...

    jqueryvalidate(猫冬)+spring3.0+struts2.18+hibernate3整合资源包

    该资源包是一个集成开发环境下的项目模板,主要涵盖了jQuery Validate、Spring 3.0、Struts 2.18和Hibernate 3这四个关键组件,它们是Java Web开发中的常用框架和技术。以下将分别对这些技术进行详细阐述。 **...

    java使用jquery_validate插件实现文本校验

    在Java后端,你可以使用诸如Spring Validation、Hibernate Validator等工具进行服务器端验证。这些验证框架提供注解方式定义验证规则,例如`@NotBlank`、`@Size`等。当前端提交数据到服务器时,服务器端会再次进行...

    Spring验证/list配置

    首先,`Spring Validate`是Spring框架的一个组成部分,它提供了JSR 303(Java Bean Validation)和Hibernate Validator的集成。JSR 303是一个标准,定义了如何在Java应用程序中进行对象级别的验证。Hibernate ...

    Spring Boot技术知识点:如何使用@Validated注解来对邮箱字段进行数据校验

    Spring Boot技术知识点:如何使用@Validated注解来对邮箱字段进行数据校验

    JQuery的validate验证框架.rar

    JQuery的validate验证框架是一个广泛使用的前端验证工具,它与jQuery库紧密结合,为HTML表单提供了强大的验证功能。这个框架简化了对用户输入数据的检查,确保在提交表单前数据的有效性和完整性,从而提高用户体验并...

    spring 学习 validator例子

    在本教程中,我们将深入探讨如何使用Spring的Validator机制来实现一个具体的验证示例。 首先,我们需要理解Validator接口的用途。在Java Web开发中,我们经常需要确保用户输入的数据符合特定的格式或规则。例如,...

    Hibernate、Spring和Struts工作原理及使用理由

    【标题】:“Hibernate、Spring和Struts工作原理及使用理由” 【内容】: Hibernate是一个流行的Java持久化框架,它的核心工作原理主要包括以下步骤: 1. **读取并解析配置文件**:Hibernate通过读取hibernate....

    Spring Validation方法实现原理分析

    Spring Validation是Spring框架中的一种校验机制,用于验证JavaBean的属性是否符合JSR-303规范。该机制可以在应用程序中自动验证JavaBean的属性,从而确保数据的正确性和完整性。 在Spring Validation中,Validator...

    Struts2 Spring Hibernate的配置及登录实例(附源码)

    Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责不同的职责:Struts2作为MVC架构的一部分,负责处理用户请求和展现视图;Spring作为一个全面的框架,提供依赖注入(DI)和面向切面编程(AOP)...

    spring_validator验证

    Spring Validator验证是Spring MVC框架中的一个关键特性,用于在服务器端对用户输入数据进行校验。在Spring MVC 3.0版本中,引入了注解驱动的验证方式,极大地简化了验证逻辑,使得开发者能够更加方便地处理表单数据...

    spring 验证总结

    从Spring 3.0开始,Spring引入了对JSR303(Bean Validation 1.0)的支持,这是一种标准的Java Bean验证框架。通过在字段上添加注解,如`@NotNull`, `@Size`, `@Min`, `@Max`等,开发者可以轻松地为对象属性定义验证...

    Spring自带的校验框架Validation的使用实例

    本文的描述是 "今天小编就为大家分享一篇关于 Spring 自带的校验框架 Validation 的使用实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧",这说明了本文的内容是...

Global site tag (gtag.js) - Google Analytics