play框架使用起来

Posted zyhlal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了play框架使用起来相关的知识,希望对你有一定的参考价值。

1 高级HTTP绑定#

简单类型

      Play可以实现所有Java原生的简单数据类型的自动转换,主要包括:int,long,boolean,char,byte,float,double,Integer,Long,Boolean,Char,String,Float,Double。


日期类型

      如果HTTP参数字符串符合以下几种数据格式,框架能够自动将其转换为日期类型:

  • yyyy-MM-dd'T'hh:mm:ss’Z' // ISO8601 + timezone
  • yyyy-MM-dd'T'hh:mm:ss" // ISO8601
  • yyyy-MM-dd
  • yyyyMMdd'T'hhmmss
  • yyyyMMddhhmmss
  • dd'/'MM'/'yyyy
  • dd-MM-yyyy
  • ddMMyyyy
  • MMddyy
  • MM-dd-yy
  • MM'/'dd'/'yy

      而且还能通过@As注解,指定特定格式的日期,例如:

archives?from=21/12/1980
public static void articlesSince(@As("dd/MM/yyyy") Date from) 
   
List<Article> articles = Article.findBy("date >= ?", from);
    render
(articles);

      也可以根据不同地区的语言习惯对日期的格式做进一步的优化,具体如下:

public static void articlesSince(@As(lang="fr,de","*", 
        value
="dd-MM-yyyy","MM-dd-yyyy") Date from)
   
List<Article> articles = Article.findBy("date >= ?", from);
    render
(articles);

      在这个例子中,对于法语和德语的日期格式是dd-MM-yyyy,其他语言的日期格式是MM-dd-yyyy。语言值可以通过逗号隔开,且需要与参数的个数相匹配。

      如果没有使用@As注解来指定,Play会采用框架默认的日期格式。为了使默认的日期格式能够正常工作,按照以下方式编辑application.conf文件:

date.format=yyyy-MM-dd

      在application.conf文件中设置默认的日期格式之后,就可以通过$date.format()方法对模板中的日期进行格式化操作了。


日历类型

      日历类型和日期类型非常相像,当然Play会根据本地化选择默认的日历类型。读者也可以通过@Bind注解来使用自定义的日历类型。


文件类型

      在Play中处理文件上传是件非常容易的事情,首先通过multipart/form-data编码的请求将文件发送到服务器,然后使用java.io.File类型提取文件对象:

public static void create(String comment, File attachment) 
   
String s3Key = S3.post(attachment);
   
Document doc = new Document(comment, s3Key);
    doc
.save();
    show
(doc.id);

      新创建文件的名称与原始文件一致,保存在应用的临时文件下(Application_name/tmp)。在实际开发中,需要将其拷贝到安全的目录,否则在请求结束后会丢失。



数组和集合类型

      所有Java支持的数据类型都可以通过数组或者集合的形式来获取。数组形式:

public static void show(Long[] id)
       
...
      List形式:
public staic void show(List<Long> id)
       
...
      集合形式:
public static void show(Set<Long> id)
       
...
      Play还可以处理Map<String, String>映射形式:
public static void show(Map<String, String> client) 
   
...
      例如下面的查询字符串会转化为带有两个元素的map类型,第一个元素key值为name,value为John;第二个元素key值为phone,value为111-1111, 222-2222。:
?user.name=John&user.phone=111-1111&user.phone=222-2222


POJO对象绑定

      Play使用同名约束规则(即HTTP参数名必须与模型类中的属性名一致),自动绑定模型类:

public static void create(Client client)
    client
.save();
    show
(client);

      以下的查询字符串可以通过上例的Action创建client:

?client.name=Zenexity&client.email=contact@zenexity.fr
      框架通过Action创建Client的实例,并将HTTP参数解析为该实例的属性。如果出现参数无法解析或者类型不匹配的情况,会自动忽略。

      参数绑定是递归执行的,这意味着可以深入到关联对象:

?client.name=Zenexity
&client.address.street=64+rue+taitbout
&client.address.zip=75009
&client.address.country=France

      Play的参数绑定提供数组的支持,可以将对象id作为映射规则,更新一组模型对象。假设Client模型有一组声明为List<Customer>的customers属性,那么更新该属性需要使用如下查询字符串:

?client.customers[0].id=123
&client.customers[1].id=456
&client.customers[2].id=789

2 JPA对象绑定#

      通过HTTP参数还可以实现JPA对象的自动绑定。Play会识别HTTP请求中提供的参数user.id,自动与数据库中User实例的id进行匹配。一旦匹配成功,HTTP请求中的其他User属性参数可以直接更新到数据库相应的User记录中:

public static void save(User user)
    user
.save();

      和POJO映射类似,可以使用JPA绑定来更改对象,但需要注意的是必须为每个需要更改的对象提供id:

user.id = 1
&user.name=morten
&user.address.id=34
&user.address.street=MyStreet

3 自定义绑定#

      绑定机制支持自定义功能,可以按照读者的需求,自定义参数绑定的规则。


@play.data.binding.As

      @play.data.binding.As注解可以依据配置提供绑定的支持。下例使用DateBinder指定日期的数据格式:

public static void update(@As("dd/MM/yyyy") Date updatedAt) 
   
...

      @As注解还具有国际化支持,可以为每个本地化提供专门的注解:

public static void update(
       
@Asplay框架使用起来(17)

play框架使用起来(17)

play框架使用起来(11)

play框架使用起来

play框架使用起来(15)

play框架使用起来(15)