play框架使用起来(14)-高级指南
Posted zyhlal
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了play框架使用起来(14)-高级指南相关的知识,希望对你有一定的参考价值。
高级指南 1、HTTP数据验证数据验证是应用程序健壮性的体现,在实际项目中也是必不可少的环节。Play内置了验证器(Validation)的支持,并提供了非常灵活的使用方法。在Play项目中可以很简单地对数据,模型对象(可能需要持久化)以及HTTP表单进行验证。
1.1 使用Play验证器#
出于数据验证的考虑,框架为每个请求绑定了验证器。应用代码中可以通过以下三种方式对数据进行验证:
1.在控制器的Action方法中,直接使用验证器对数据进行相应的验证:
public static void hello(String name)
validation.required(name); //验证name参数是否被赋值
...
2.在控制器的Action方法的参数中,使用注解进行数据验证:
public static void hello(@Required String name)
...
3.定义域模型时直接为属性添加验证注解,Action中就可以通过@Valid注解对该POJO参数进行验证了:
public class User extends Model
@Required
public String name; //为User的name属性添加@Required验证
...
//直接使用@Valid注解对POJO参数进行验证
public static void save(@Valid User user)
...
框架为每个请求绑定了一个验证器,同个验证器可以校验多个数据。
当验证不通过时,验证器会将错误以play.data.validation.Error的形式保存,因此每个验证器以集合的形式维护了一系列的error对象。每个error对象有key和message两个属性:
- key:该属性帮助我们标识引起错误的元素。key的值可以任意设定,默认与验证的数据同名。
- message:验证消息,用于描述验证不通过的错误信息。message可以是纯文本或指向消息包(message bundle)的key(通常为了支持国际化)。
文字的描述可能有些空洞,接下来让我们看看如何使用验证器校验简单的HTTP参数:
public static void hello(String name)
validation.required(name);
...
以上这段程序代码检查了name参数是否被赋值。如果没有,相应的错误就会被添加到当前的error集合中。如果有多个数据需要验证,可以重复该操作:
public static void hello(String name, Integer age)
validation.required(name); //验证name是否被赋值
validation.required(age); //验证age是否被赋值
validation.min(age, 0); //验证age不小于0
...
1.2 验证消息(error对象中的message属性)#
在验证结束后我们可以检查是否有error产生,并将验证消息打印出来:
public static void hello(String name, Integer age)
validation.required(name);
validation.required(age);
validation.min(age, 0);
if(validation.hasErrors())
for(Error error : validation.errors())
System.out.println(error.message());
假定name和age都没有赋值,控制台将会打印以下信息:
Required
Required
这是因为在$PLAY_HOME/resources/messages文件中定义了默认的消息:
validation.required=Required
Play提供了三种方式自定义验证消息:
- 在项目的conf/messages文件中自定义消息,覆盖默认的message消息。
- 直接将自定义的验证消息作为参数传递给验证器,覆盖默认的message消息。
- 定义带参数的验证消息,参数通常为error对象的key值。
本地化的验证消息
我们可以配置应用程序的conf/messages文件,采用统一的验证消息匹配error对象的message消息,这是最简单的覆盖消息的写法:
validation.required = Please enter a value经过以上配置后,任何不通过validation.required验证的消息都是Please enter a value。
带参数的验证消息
%s占位符将被替换成error对象的key:
validation.required=%s is required
结合以上例子,输出结果为:
name is required
age is required
框架默认将被验证的参数的名字作为error对象的key值进行传递,但也有其他方法修改error对象的key值。比如,针对上例中hello方法(Action)的name参数进行本地化处理:
name = Customer name
结果就会变成:
Customer name is required
age is required
也可以使用error.message(String key)方法直接覆盖error对象的key值:
Error error = validation.required(name).error;
if(error != null)
System.out.println(error.message("Customer name"));
Play内置了很多验证方法,也提供了不同的消息参数。比如match验证,在消息表达式中定义了字符串类型的参数,与前面介绍的%s的占位符不同,其规定的参数索引为2:
validation.match=Must match %2$s
类似的,range验证定义了两个整数型参数,以2和3作为索引:
validation.range=Not in the range %2$d through %3$d
读者可以在$PLAY_HOME/resources/messages文件中查看其他的验证以及所含的参数。
读者可能会有疑问,为什么这些参数的索引都是从2开始的。因为match,range,minSize等验证都是需要比较的,框架规定将索引为1的参数设置为比较源。
自定义本地化验证消息
Play内置验证器的message消息,是在$PLAY_HOME/resources/messages文件中定义的。我们也可以在项目中定义自己的验证消息:
validation.required.em = You must enter the %s!
在Action方法中,就可以采用自己定义的验证消息机制,手动进行验证:
validation.required(manualKey).message("validation.required.em");
我们也可以把自己定义的验证消息机制作为注解中message的参数使用:
public static void hello(@Required(message="validation.required.em") String name)
...
同理,JavaBean的属性中也可以使用这种验证技术(注解在JavaBean的属性前):
public class Person extends Model
@Required(message = "validation.required.em")
public String name;
...
public static void hello(@Valid Person person)
...
play框架使用起来(15)