栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring MVC:如何执行验证?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring MVC:如何执行验证?

使用Spring
MVC,可以通过3种不同的方式执行验证:使用批注,手动或两者结合使用。没有唯一的“最干净,最好的方式”进行验证,但是可能有一种更适合您的项目/问题/上下文的方式。

让我们有一个用户:

public class User {    private String name;    ...}

方法1: 如果您具有Spring 3.x
+和简单的验证功能,请使用

javax.validation.constraints
注释(也称为JSR-303注释)。

public class User {    @NotNull    private String name;    ...}

您将需要在库中使用JSR-303提供程序,例如作为参考实现的Hibernate
Validator
(此库与数据库和关系映射无关,它只进行验证:-)。

然后在您的控制器中,您将看到类似以下内容的内容:

@RequestMapping(value="/user", method=RequestMethod.POST)public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){    if (result.hasErrors()){      // do something    }    else {      // do something else    }}

请注意@Valid:如果用户碰巧具有空名称,则result.hasErrors()将为true。

方法2:
如果您具有复杂的验证(如大型企业验证逻辑,跨多个字段的条件验证等),或者由于某种原因您无法使用方法1,请使用手动验证。将控制器的代码与验证逻辑分开是一个好习惯。不要从头开始创建验证类,Spring提供了一个方便的

org.springframework.validation.Validator
界面(自Spring
2起)。

所以说你有

public class User {    private String name;    private Integer birthYear;    private User responsibleUser;    ...}

并且您想执行一些“复杂”的验证,例如:如果用户的年龄未满18岁,则负责用户不能为null,负责用户的年龄必须超过21岁。

你会做这样的事情

public class UserValidator implements Validator {    @Override    public boolean supports(Class clazz) {      return User.class.equals(clazz);    }    @Override    public void validate(Object target, Errors errors) {      User user = (User) target;      if(user.getName() == null) {          errors.rejectValue("name", "your_error_pre");      }      // do "complex" validation here    }}

然后在您的控制器中,您将:

@RequestMapping(value="/user", method=RequestMethod.POST)    public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){        UserValidator userValidator = new UserValidator();        userValidator.validate(user, result);        if (result.hasErrors()){          // do something        }        else {          // do something else        }}

如果存在验证错误,则result.hasErrors()将为true。

注意:您还可以使用“
binder.setValidator(…)”在控制器的@InitBinder方法中设置验证器(在这种情况下,无法混合使用方法1和2,因为您替换了默认值验证器)。或者,您可以在控制器的默认构造函数中实例化它。或者在控制器中插入一个@
Component / @ Service
UserValidator(@Autowired):非常有用,因为大多数验证器都是单例+单元测试模拟变得更加容易+您的验证器可以调用其他Spring组件。

方法3: 为什么不同时使用两种方法?验证带有注解的简单内容(如“
name”属性)(该操作快速,简洁且可读性强)。保留对验证器的繁重验证(当编写自定义复杂验证注释需要花费数小时,或者仅在无法使用注释时)。我在一个以前的项目中做到了这一点,它就像一个魅力,快速又轻松。

警告: 您不得将 验证处理 误认为是 异常处理



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369172.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号