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提供了三种方式自定义验证消息:

  1. 在项目的conf/messages文件中自定义消息,覆盖默认的message消息。
  2. 直接将自定义的验证消息作为参数传递给验证器,覆盖默认的message消息。
  3. 定义带参数的验证消息,参数通常为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)

play框架使用起来(15)

play框架使用起来(13)

play框架使用起来(13)

在 Play 框架中配置最大线程的指南

play框架使用起来