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)