10分钟用Play!在GAE上实现一个Blog

开发 后端
做这个,是因为在JavaEye上看到看到一篇文章《Play!跑在GAE上,小试GAE》,里面讨论了一个新的Java On Rails式框架,来自法国的Play!

做这个,是因为在JavaEye上看到看到一篇文章《Play!跑在GAE上,小试GAE》,里面讨论了一个新的Java On Rails式框架,来自法国的Play!(http://www.playframework.org/ )。大概看了下这个框架的介绍,的确很优秀,举点比较cool的特点:

  • Bind an HTTP parameter to a Java method parameter: 就是说,可以在URL上直接调用Controller里面的方法;
  • Redirect to an action by simply calling the corresponding Java method:这个不用解析了;
  • Don't Repeat Yourself when passing Java objects to templates: 也就是说,从controller往View传数据,不需要把object放在map里面,可以类似:render(titile, article, user);这样做,就是Java5里面的动态参数的使用啦;
  • Straightforward file upload management;
  • Distribute an application to several JVMs without configuring anything;
  • Fix the bug and hit Reload: 这个无敌,大概就是说,修改程序后,直接reload程序就好,框架自动编译程序,因为这个框架内部带了个Container,所以可以做到这个。这个有点像把Java给动态化了,调试起来省不少事;
  • 另外就是多个plugin可以使用等等。

大概看了下这个框架,感觉蛮好的,但那篇文章里面讨论的主要是,Play!集成在GAE里面的一些问题,这个框架带了个非常非常简单的Blog程序,就没法部署到GAE上面成功。很容易理解,GAE阉割过JDK和对JPA的支持是不完善的。我申请GAE账号很长时间了,但没有玩过,刚好两个一起研究一下。

其实GAE的局限主要是:

  1. 底层是基于Big Table的,完全不是关系型的结构,让他完全支持JPA的复杂关联关系,太吃力了,所以GAE是不能支持Owned relationship和Many to many owned relationship的,也就是一对多,多对多关系不能支持,官方建议自己建立key,程序里面维护关联关系。Blog这个sample程序,因为存在这Post和Comment两个实体,两者之间是一对多的关系,所以GAE是不能支持的,解决方法很简单,把原来的JPA定义方法去掉,Comment 里面加个postId的属性,添加comment时,把这个填上就okay了。
  2. GAE限制了java.net.Inet.*这些class,所以Play!自带的ehcache1.5版本是用不了的;ehcache1.6声称支持GAE了,那就下个ehcache-1.6.0.jar替代掉原来Play!自带的那个。
  3. GAE里面规定,选取出来的entity不能修改,所以Blog的那个sample里面那种:
  1. posts.remove(post);  
  2. Collections.reverse(posts); 

是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。这个限制其实也不麻烦,只是这种设计不适合xxx on rails思想而已,如果是比较早期接触J2EE的话,这个不会陌生。Model定义那几个东西,是直接操作数据库的,也就是我们说的PO,传统的J2EE上面,PO是不可以在Contrioller层操作的,在下面上来的数据需要转为VO才能操作,才能扔给View~这就是DTO模式。Apache的beanutil可以做这个事情,但是这只是个例子,直接setter,getter就可以了。。。 这里给出一个解决方法:在Play!里面建个vo的包,建一个PostVo,然后用以下代码替代上面那两句,

  1. List<Post> posts = Post.findAll();  
  2. Iterator<Post> postIt = posts.iterator();  
  3. List<PostVo> otherPosts = new ArrayList<PostVo>();  
  4. while (postIt.hasNext()) {  
  5.       Post postItem = postIt.next();  
  6.       if (postItem.id.longValue() != id.longValue()) {  
  7.           PostVo postVo = new PostVo();  
  8.           postVo.setId(postItem.id);  
  9.           postVo.setTitle(postItem.title);  
  10.           postVo.setContent(postItem.content);  
  11.           postVo.setDate(postItem.date);  
  12.           otherPosts.add(postVo);  
  13.      }  
  14. }  
  15.       Collections.reverse(otherPosts); 

当然在view里面要用otherPosts来替代posts,迭代otherPosts就可以了~

经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com

 

总  结:

 

Play!这个框架我是蛮喜欢的,难得看到Java有类似的快捷框架出现,如果场合合适的话,值得考虑使用。另外,GAE,在持久化那部份限制蛮多的,但是可以理解,毕竟Google底层的持久化结构并不是关系模型。能够把JPA实现到这个程度,已经很好了~

 

既然客观原因不能改变,我们就自己改变去适应它,毕竟withod RMDB已经喊了很长时间,其实只要观念稍变下,就好了~

 

由于,我看GAE和Play!两个东西的时间,就是今天(周五)下班到八佰伴吃完个饭回家到现在,不足1个小时,也没研究Play!的源代码,所说之处,难免有错,请大家互相交流~

原文链接:http://blog.csdn.net/laynepeng/article/details/4338873

【编辑推荐】

  1. Play Framework 2.0 RC1发布 Java Web框架
  2. Java容器类分析之List ArrayList Vector
  3. 有可能挑战Java优势的四种技术
  4. Think in Java之斐波那契数列
  5. Java的poi技术读取和导入Excel
责任编辑:林师授 来源: laynepeng的博客
相关推荐

2011-01-21 10:30:46

2022-06-28 12:35:21

DockerPython

2023-05-27 21:13:34

FlaskURL装饰器

2022-01-06 18:20:20

Scarlet AndroidWebSocket

2020-10-30 15:04:16

开发技能代码

2021-07-15 06:43:11

Bash调试脚本

2021-08-09 10:36:49

Python搜索引擎命令

2021-07-29 23:29:55

web服务器开发

2013-09-13 14:08:01

2020-07-25 19:40:33

Java开发代码

2015-09-18 19:38:01

BlackHatSQLChop

2023-10-12 11:48:18

SkyWalking工具

2020-10-13 18:22:58

DevOps工具开发

2014-08-08 09:30:04

android scrollview

2021-09-12 22:22:45

Mock数据服务

2020-08-07 15:43:03

Python表格代码

2011-03-24 10:08:41

UbuntuNagios监控

2022-01-17 09:01:23

NodeJS数据服务器Mock

2021-04-21 09:00:00

机器人语言工具

2021-04-23 09:50:41

topLinux命令
点赞
收藏

51CTO技术栈公众号