- 浏览: 354326 次
最新评论
-
springdata_springmvc:
bootstrap demo实例教程源代码下载:http:// ...
牛标联盟开发日记之前端 -
xiangxm:
谢谢分享
android中获取文字的宽度 -
showwei2004:
短短的一段文字,给人很多帮助。
android中获取文字的宽度 -
xiangguiwang:
谢谢
CentOS上通过源码安装ruby(1.8.6) -
G_o_o:
顶,写的好
CentOS上通过源码安装ruby(1.8.6)
昨天晚上就想发这个帖子,可惜javaeye老上不去,BS胡作非为的人。
很长一段时间就想试试GAE,用其它java框架麻烦了,感觉不够轻,在不久前发现了
http://www.playframework.org/
这个框架,相当于java on rails。以前的新闻已提到过。请参考:
http://www.iteye.com/news/8322
http://www.iteye.com/news/4196-play-another-java-web-application-framework
http://www.iteye.com/news/4395-play-1-0-stable4-version-of-the-release-and-to-provide-a-complete-program-of-the-forum-demo
这个是shinewang的blog,有很多play!的中文翻译,写的相当不错。
http://shinewang.iteye.com/blog/310439
我现在的GAE应用演示URL:http://javaweb2009.appspot.com/ 此演示是Play!自带的测试例子。
接下来的任务就是用Play!写一个单用户blog,这样就可以方便的利用Google的免费资源了,那是相当的酷。
另外Play!作者告诉我Play! 1.0正式版将在今年夏天完成,已就是这一二个月内的事,后面1.1将支持Scala。再就是完成Play!的文档工作。虽说当前Play!版本是1.0但是功能已经非常完善。
下面是作者的原话:
Play!版本发布历史:
1.0-stable6, 1.0-stable5, 1.0-stable4, 1.0-stable3, 1.0-stable2, 1.0-stable1
写的很不错,解决了我的相关疑问,前两个限制还算合理,但第三个限制就太不方便了,感觉完全失去了JPA的优势。期望google能有更好的解决办法吧,回头我也试一试,谢谢。
今天由在外面跑了一天,才看到帖子。第三个限制,其实也不麻烦,只是这种设计不适合xxx on rails思想而已,如果是比较早期接触J2EE的话,这个不会陌生。Model定义那几个东西,是直接操作数据库的,也就是我们说的PO,传统的J2EE上面,PO是不可以在Contrioller层操作的,在下面上来的数据需要转为VO才能操作,才能扔给View~这就是DTO模式。Apache的beanutil可以做这个事情,但是这只是个例子,直接setter,getter就可以了。。。
很简单,在Play!里面建个vo的包,建一个PostVo,然后:
当然在view里面要用otherPosts来替代posts,迭代otherPosts~~
我刚上传了个新版本,已经和原来的一样了~~
还有一个大文本的问题,GAE只能使用Text字段来存放大文本,这样play!会有问题。
GAE的TEXT类型根本无法使用,不管是直接使用JAVA,还是使用PLAY!框架。
呵呵~恕我直说吧,你这个解决方法,其实不如使用传统的DTO模式,很明显GAE的存储层没法“到处调用”,那就应该把它隔离出来,原来J2EE的分层就是这个原因~
另外500字符问题已经解决(有点累,找了不少资料),Text不是Play!不能识别,原因如我前面所说~~
可以把GAE的appengine-api-1.0-sdk-1.2.1.jar拷过来,里面有com.google.appengine.api.datastore.Text这个类,在Post里面把content的类型设为他就好。。。
你会发现GAE这个字段没被存起来,这时候要坚定信念,因为前面已经分析过原因。去找GAE的问题,Google不到,只有JDO的,那就去Google Group去找,里面全是GAE的高手,包括开发者,搜一下就会发现有人遇到你的问题了。。。
在这个字段前面加上@Enumerated就可以解决。。。
后面的事情如同我前面说的,大不了复制为VO的时候转一下就好(这时候,你的解决方法就不行了,分层还是有好处的:)):
一切成功~
结论:方法和思路才是最重要的~~
非常感谢,我也google了,也如你所说这个字段并没有存起来,学习了解决问题的方法和思路。
看来增加VO是必要的了?不管怎么再次表示感谢。
呵呵~恕我直说吧,你这个解决方法,其实不如使用传统的DTO模式,很明显GAE的存储层没法“到处调用”,那就应该把它隔离出来,原来J2EE的分层就是这个原因~
另外500字符问题已经解决(有点累,找了不少资料),Text不是Play!不能识别,原因如我前面所说~~
可以把GAE的appengine-api-1.0-sdk-1.2.1.jar拷过来,里面有com.google.appengine.api.datastore.Text这个类,在Post里面把content的类型设为他就好。。。
你会发现GAE这个字段没被存起来,这时候要坚定信念,因为前面已经分析过原因。去找GAE的问题,Google不到,只有JDO的,那就去Google Group去找,里面全是GAE的高手,包括开发者,搜一下就会发现有人遇到你的问题了。。。
在这个字段前面加上@Enumerated就可以解决。。。
后面的事情如同我前面说的,大不了复制为VO的时候转一下就好(这时候,你的解决方法就不行了,分层还是有好处的:)):
一切成功~
结论:方法和思路才是最重要的~~
写的很不错,解决了我的相关疑问,前两个限制还算合理,但第三个限制就太不方便了,感觉完全失去了JPA的优势。期望google能有更好的解决办法吧,回头我也试一试,谢谢。
今天由在外面跑了一天,才看到帖子。第三个限制,其实也不麻烦,只是这种设计不适合xxx on rails思想而已,如果是比较早期接触J2EE的话,这个不会陌生。Model定义那几个东西,是直接操作数据库的,也就是我们说的PO,传统的J2EE上面,PO是不可以在Contrioller层操作的,在下面上来的数据需要转为VO才能操作,才能扔给View~这就是DTO模式。Apache的beanutil可以做这个事情,但是这只是个例子,直接setter,getter就可以了。。。
很简单,在Play!里面建个vo的包,建一个PostVo,然后:
当然在view里面要用otherPosts来替代posts,迭代otherPosts~~
我刚上传了个新版本,已经和原来的一样了~~
还有一个大文本的问题,GAE只能使用Text字段来存放大文本,这样play!会有问题。
写的很不错,解决了我的相关疑问,前两个限制还算合理,但第三个限制就太不方便了,感觉完全失去了JPA的优势。期望google能有更好的解决办法吧,回头我也试一试,谢谢。
今天由在外面跑了一天,才看到帖子。第三个限制,其实也不麻烦,只是这种设计不适合xxx on rails思想而已,如果是比较早期接触J2EE的话,这个不会陌生。Model定义那几个东西,是直接操作数据库的,也就是我们说的PO,传统的J2EE上面,PO是不可以在Contrioller层操作的,在下面上来的数据需要转为VO才能操作,才能扔给View~这就是DTO模式。Apache的beanutil可以做这个事情,但是这只是个例子,直接setter,getter就可以了。。。
很简单,在Play!里面建个vo的包,建一个PostVo,然后:
当然在view里面要用otherPosts来替代posts,迭代otherPosts~~
我刚上传了个新版本,已经和原来的一样了~~
写的很不错,解决了我的相关疑问,前两个限制还算合理,但第三个限制就太不方便了,感觉完全失去了JPA的优势。期望google能有更好的解决办法吧,回头我也试一试,谢谢。
http://www.playframework.org/manual/contents/gae
现在已经有个可以用用了。。。
这个早就有了,正因为有这个才试着把Play!跑在GAE上的。
。。。
Play!确实是好东西,花了十分钟把它的manual看完,试了一下,大概用了20分钟调试就可以了。。。
Blog那个sample,
http://laynezone.appspot.com
回头写个blog,介绍一下做法。。。
http://www.playframework.org/manual/contents/gae
现在已经有个可以用用了。。。
这个早就有了,正因为有这个才试着把Play!跑在GAE上的。
http://www.playframework.org/manual/contents/gae
现在已经有个可以用用了。。。
是Play! 最后有个"!" 法国人做的。
嗯,说的很对,现在Play!有些忙不过来了。我也看过Play!的源码,的确写的很通俗易懂,代码可读性很好,希望有更多的人了解使用Play!。另外就是GAE的发展现在也不明朗,也不清楚它对数据库这个如何加强支持。
现在担心的是不知道google要怎么搞GAE,限制太多了,不方便。
GFW限制比这个还大
很长一段时间就想试试GAE,用其它java框架麻烦了,感觉不够轻,在不久前发现了
http://www.playframework.org/
这个框架,相当于java on rails。以前的新闻已提到过。请参考:
http://www.iteye.com/news/8322
http://www.iteye.com/news/4196-play-another-java-web-application-framework
http://www.iteye.com/news/4395-play-1-0-stable4-version-of-the-release-and-to-provide-a-complete-program-of-the-forum-demo
这个是shinewang的blog,有很多play!的中文翻译,写的相当不错。
http://shinewang.iteye.com/blog/310439
我现在的GAE应用演示URL:http://javaweb2009.appspot.com/ 此演示是Play!自带的测试例子。
接下来的任务就是用Play!写一个单用户blog,这样就可以方便的利用Google的免费资源了,那是相当的酷。
另外Play!作者告诉我Play! 1.0正式版将在今年夏天完成,已就是这一二个月内的事,后面1.1将支持Scala。再就是完成Play!的文档工作。虽说当前Play!版本是1.0但是功能已经非常完善。
下面是作者的原话:
引用
I hope to release a 1.0 version during this summer.
At the same time we will launch a 1.1 branch including Scala support.
There is still a lot of work especially to complete the documentation.
At the same time we will launch a 1.1 branch including Scala support.
There is still a lot of work especially to complete the documentation.
Play!版本发布历史:
1.0-stable6, 1.0-stable5, 1.0-stable4, 1.0-stable3, 1.0-stable2, 1.0-stable1
评论
34 楼
george.SPACE
2009-07-14
pure 写道
Laynepeng 写道
pure 写道
Laynepeng 写道
文章全文在:http://blog.csdn.net/laynepeng/archive/2009/07/10/4338873.aspx
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
写的很不错,解决了我的相关疑问,前两个限制还算合理,但第三个限制就太不方便了,感觉完全失去了JPA的优势。期望google能有更好的解决办法吧,回头我也试一试,谢谢。
今天由在外面跑了一天,才看到帖子。第三个限制,其实也不麻烦,只是这种设计不适合xxx on rails思想而已,如果是比较早期接触J2EE的话,这个不会陌生。Model定义那几个东西,是直接操作数据库的,也就是我们说的PO,传统的J2EE上面,PO是不可以在Contrioller层操作的,在下面上来的数据需要转为VO才能操作,才能扔给View~这就是DTO模式。Apache的beanutil可以做这个事情,但是这只是个例子,直接setter,getter就可以了。。。
很简单,在Play!里面建个vo的包,建一个PostVo,然后:
List<Post> posts = Post.findAll(); Iterator<Post> postIt = posts.iterator(); List<PostVo> otherPosts = new ArrayList<PostVo>(); while (postIt.hasNext()) { Post postItem = postIt.next(); if (postItem.id.longValue() != id.longValue()) { PostVo postVo = new PostVo(); postVo.setId(postItem.id); postVo.setTitle(postItem.title); postVo.setContent(postItem.content); postVo.setDate(postItem.date); otherPosts.add(postVo); } } Collections.reverse(otherPosts);
当然在view里面要用otherPosts来替代posts,迭代otherPosts~~
我刚上传了个新版本,已经和原来的一样了~~
还有一个大文本的问题,GAE只能使用Text字段来存放大文本,这样play!会有问题。
GAE的TEXT类型根本无法使用,不管是直接使用JAVA,还是使用PLAY!框架。
33 楼
Laynepeng
2009-07-12
今天下午没啥事做,自己把这两天的经历整合了一下,在GAE上用Play!做了个blog:
http://layneblog.appspot.com/
呵呵~~可以去指教下~
还很不完善,慢慢做吧反正~~
http://layneblog.appspot.com/
呵呵~~可以去指教下~
还很不完善,慢慢做吧反正~~
32 楼
pure
2009-07-11
Laynepeng 写道
pure 写道
在show方法我改成这样了:
public static void show(Long id) {
Post post = Post.findById(id);
notFoundIfNull(post);
List<Post> sourcPosts = Post.findAll();
List<Comment> comments = Comment.findBy("postId", post.id);
post.comments = comments;
List<Post> posts = new ArrayList<Post>();
posts.addAll(sourcPosts);
posts.remove(post);
Collections.reverse(posts);
render(post, posts);
}
newComment方法改成这样:
public static void newComment(Long id, String author, String comment) {
Post post = Post.findById(id);
notFoundIfNull(post);
Comment co = new Comment(author, comment, id);
co.save();
show(id);
}
Post.java
@Transient
public List<Comment> comments;
但是
public String content;
这个要大文本,GAE要用
public Text content;
但是play!处理不了这个。
Text的getValue()还没试好。
Post post = Post.findById(id);
这样出来的post,post的content为null,还待研究,看来以后真要不修改随处运行是个神话。
public static void show(Long id) {
Post post = Post.findById(id);
notFoundIfNull(post);
List<Post> sourcPosts = Post.findAll();
List<Comment> comments = Comment.findBy("postId", post.id);
post.comments = comments;
List<Post> posts = new ArrayList<Post>();
posts.addAll(sourcPosts);
posts.remove(post);
Collections.reverse(posts);
render(post, posts);
}
newComment方法改成这样:
public static void newComment(Long id, String author, String comment) {
Post post = Post.findById(id);
notFoundIfNull(post);
Comment co = new Comment(author, comment, id);
co.save();
show(id);
}
Post.java
@Transient
public List<Comment> comments;
但是
public String content;
这个要大文本,GAE要用
public Text content;
但是play!处理不了这个。
Text的getValue()还没试好。
Post post = Post.findById(id);
这样出来的post,post的content为null,还待研究,看来以后真要不修改随处运行是个神话。
呵呵~恕我直说吧,你这个解决方法,其实不如使用传统的DTO模式,很明显GAE的存储层没法“到处调用”,那就应该把它隔离出来,原来J2EE的分层就是这个原因~
另外500字符问题已经解决(有点累,找了不少资料),Text不是Play!不能识别,原因如我前面所说~~
可以把GAE的appengine-api-1.0-sdk-1.2.1.jar拷过来,里面有com.google.appengine.api.datastore.Text这个类,在Post里面把content的类型设为他就好。。。
你会发现GAE这个字段没被存起来,这时候要坚定信念,因为前面已经分析过原因。去找GAE的问题,Google不到,只有JDO的,那就去Google Group去找,里面全是GAE的高手,包括开发者,搜一下就会发现有人遇到你的问题了。。。
在这个字段前面加上@Enumerated就可以解决。。。
后面的事情如同我前面说的,大不了复制为VO的时候转一下就好(这时候,你的解决方法就不行了,分层还是有好处的:)):
postVo.setContent(postItem.content.getValue());这样就解决了,记得把View里面所有的调用改为调用postVo的,否则可能出现转型问题,检查清楚~~~
一切成功~
结论:方法和思路才是最重要的~~
非常感谢,我也google了,也如你所说这个字段并没有存起来,学习了解决问题的方法和思路。
看来增加VO是必要的了?不管怎么再次表示感谢。
31 楼
Laynepeng
2009-07-11
pure 写道
在show方法我改成这样了:
public static void show(Long id) {
Post post = Post.findById(id);
notFoundIfNull(post);
List<Post> sourcPosts = Post.findAll();
List<Comment> comments = Comment.findBy("postId", post.id);
post.comments = comments;
List<Post> posts = new ArrayList<Post>();
posts.addAll(sourcPosts);
posts.remove(post);
Collections.reverse(posts);
render(post, posts);
}
newComment方法改成这样:
public static void newComment(Long id, String author, String comment) {
Post post = Post.findById(id);
notFoundIfNull(post);
Comment co = new Comment(author, comment, id);
co.save();
show(id);
}
Post.java
@Transient
public List<Comment> comments;
但是
public String content;
这个要大文本,GAE要用
public Text content;
但是play!处理不了这个。
Text的getValue()还没试好。
Post post = Post.findById(id);
这样出来的post,post的content为null,还待研究,看来以后真要不修改随处运行是个神话。
public static void show(Long id) {
Post post = Post.findById(id);
notFoundIfNull(post);
List<Post> sourcPosts = Post.findAll();
List<Comment> comments = Comment.findBy("postId", post.id);
post.comments = comments;
List<Post> posts = new ArrayList<Post>();
posts.addAll(sourcPosts);
posts.remove(post);
Collections.reverse(posts);
render(post, posts);
}
newComment方法改成这样:
public static void newComment(Long id, String author, String comment) {
Post post = Post.findById(id);
notFoundIfNull(post);
Comment co = new Comment(author, comment, id);
co.save();
show(id);
}
Post.java
@Transient
public List<Comment> comments;
但是
public String content;
这个要大文本,GAE要用
public Text content;
但是play!处理不了这个。
Text的getValue()还没试好。
Post post = Post.findById(id);
这样出来的post,post的content为null,还待研究,看来以后真要不修改随处运行是个神话。
呵呵~恕我直说吧,你这个解决方法,其实不如使用传统的DTO模式,很明显GAE的存储层没法“到处调用”,那就应该把它隔离出来,原来J2EE的分层就是这个原因~
另外500字符问题已经解决(有点累,找了不少资料),Text不是Play!不能识别,原因如我前面所说~~
可以把GAE的appengine-api-1.0-sdk-1.2.1.jar拷过来,里面有com.google.appengine.api.datastore.Text这个类,在Post里面把content的类型设为他就好。。。
你会发现GAE这个字段没被存起来,这时候要坚定信念,因为前面已经分析过原因。去找GAE的问题,Google不到,只有JDO的,那就去Google Group去找,里面全是GAE的高手,包括开发者,搜一下就会发现有人遇到你的问题了。。。
在这个字段前面加上@Enumerated就可以解决。。。
后面的事情如同我前面说的,大不了复制为VO的时候转一下就好(这时候,你的解决方法就不行了,分层还是有好处的:)):
postVo.setContent(postItem.content.getValue());这样就解决了,记得把View里面所有的调用改为调用postVo的,否则可能出现转型问题,检查清楚~~~
一切成功~
结论:方法和思路才是最重要的~~
30 楼
pure
2009-07-11
在show方法我改成这样了:
public static void show(Long id) {
Post post = Post.findById(id);
notFoundIfNull(post);
List<Post> sourcPosts = Post.findAll();
List<Comment> comments = Comment.findBy("postId", post.id);
post.comments = comments;
List<Post> posts = new ArrayList<Post>();
posts.addAll(sourcPosts);
posts.remove(post);
Collections.reverse(posts);
render(post, posts);
}
newComment方法改成这样:
public static void newComment(Long id, String author, String comment) {
Post post = Post.findById(id);
notFoundIfNull(post);
Comment co = new Comment(author, comment, id);
co.save();
show(id);
}
Post.java
@Transient
public List<Comment> comments;
但是
public String content;
这个要大文本,GAE要用
public Text content;
但是play!处理不了这个。
Text的getValue()还没试好。
Post post = Post.findById(id);
这样出来的post,post的content为null,还待研究,看来以后真要不修改随处运行是个神话。
public static void show(Long id) {
Post post = Post.findById(id);
notFoundIfNull(post);
List<Post> sourcPosts = Post.findAll();
List<Comment> comments = Comment.findBy("postId", post.id);
post.comments = comments;
List<Post> posts = new ArrayList<Post>();
posts.addAll(sourcPosts);
posts.remove(post);
Collections.reverse(posts);
render(post, posts);
}
newComment方法改成这样:
public static void newComment(Long id, String author, String comment) {
Post post = Post.findById(id);
notFoundIfNull(post);
Comment co = new Comment(author, comment, id);
co.save();
show(id);
}
Post.java
@Transient
public List<Comment> comments;
但是
public String content;
这个要大文本,GAE要用
public Text content;
但是play!处理不了这个。
Text的getValue()还没试好。
Post post = Post.findById(id);
这样出来的post,post的content为null,还待研究,看来以后真要不修改随处运行是个神话。
29 楼
Laynepeng
2009-07-11
哦?没有注意这个问题,呵呵~我也是刚接触这两个东西,那个Test应该是GAE提供的包吧?play可以引入别的数据类型的,理论上,如果View层没法迭代出来,最多在
postVo.setContent(postItem.content.toString());//假设有类似的方法
的时候转一下就好了,这些都不是问题,任何一个框架理论上都不会遇到适别数据类型的问题的,也就是说Play!不会说不能使用Test类型的,他大不了当是自定义的一个类处理。
postVo.setContent(postItem.content.toString());//假设有类似的方法
的时候转一下就好了,这些都不是问题,任何一个框架理论上都不会遇到适别数据类型的问题的,也就是说Play!不会说不能使用Test类型的,他大不了当是自定义的一个类处理。
28 楼
pure
2009-07-11
Laynepeng 写道
pure 写道
Laynepeng 写道
文章全文在:http://blog.csdn.net/laynepeng/archive/2009/07/10/4338873.aspx
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
写的很不错,解决了我的相关疑问,前两个限制还算合理,但第三个限制就太不方便了,感觉完全失去了JPA的优势。期望google能有更好的解决办法吧,回头我也试一试,谢谢。
今天由在外面跑了一天,才看到帖子。第三个限制,其实也不麻烦,只是这种设计不适合xxx on rails思想而已,如果是比较早期接触J2EE的话,这个不会陌生。Model定义那几个东西,是直接操作数据库的,也就是我们说的PO,传统的J2EE上面,PO是不可以在Contrioller层操作的,在下面上来的数据需要转为VO才能操作,才能扔给View~这就是DTO模式。Apache的beanutil可以做这个事情,但是这只是个例子,直接setter,getter就可以了。。。
很简单,在Play!里面建个vo的包,建一个PostVo,然后:
List<Post> posts = Post.findAll(); Iterator<Post> postIt = posts.iterator(); List<PostVo> otherPosts = new ArrayList<PostVo>(); while (postIt.hasNext()) { Post postItem = postIt.next(); if (postItem.id.longValue() != id.longValue()) { PostVo postVo = new PostVo(); postVo.setId(postItem.id); postVo.setTitle(postItem.title); postVo.setContent(postItem.content); postVo.setDate(postItem.date); otherPosts.add(postVo); } } Collections.reverse(otherPosts);
当然在view里面要用otherPosts来替代posts,迭代otherPosts~~
我刚上传了个新版本,已经和原来的一样了~~
还有一个大文本的问题,GAE只能使用Text字段来存放大文本,这样play!会有问题。
27 楼
Laynepeng
2009-07-11
pure 写道
Laynepeng 写道
文章全文在:http://blog.csdn.net/laynepeng/archive/2009/07/10/4338873.aspx
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
写的很不错,解决了我的相关疑问,前两个限制还算合理,但第三个限制就太不方便了,感觉完全失去了JPA的优势。期望google能有更好的解决办法吧,回头我也试一试,谢谢。
今天由在外面跑了一天,才看到帖子。第三个限制,其实也不麻烦,只是这种设计不适合xxx on rails思想而已,如果是比较早期接触J2EE的话,这个不会陌生。Model定义那几个东西,是直接操作数据库的,也就是我们说的PO,传统的J2EE上面,PO是不可以在Contrioller层操作的,在下面上来的数据需要转为VO才能操作,才能扔给View~这就是DTO模式。Apache的beanutil可以做这个事情,但是这只是个例子,直接setter,getter就可以了。。。
很简单,在Play!里面建个vo的包,建一个PostVo,然后:
List<Post> posts = Post.findAll(); Iterator<Post> postIt = posts.iterator(); List<PostVo> otherPosts = new ArrayList<PostVo>(); while (postIt.hasNext()) { Post postItem = postIt.next(); if (postItem.id.longValue() != id.longValue()) { PostVo postVo = new PostVo(); postVo.setId(postItem.id); postVo.setTitle(postItem.title); postVo.setContent(postItem.content); postVo.setDate(postItem.date); otherPosts.add(postVo); } } Collections.reverse(otherPosts);
当然在view里面要用otherPosts来替代posts,迭代otherPosts~~
我刚上传了个新版本,已经和原来的一样了~~
26 楼
pure
2009-07-11
Laynepeng 写道
文章全文在:http://blog.csdn.net/laynepeng/archive/2009/07/10/4338873.aspx
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
写的很不错,解决了我的相关疑问,前两个限制还算合理,但第三个限制就太不方便了,感觉完全失去了JPA的优势。期望google能有更好的解决办法吧,回头我也试一试,谢谢。
25 楼
Laynepeng
2009-07-10
文章全文在:http://blog.csdn.net/laynepeng/archive/2009/07/10/4338873.aspx
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
为了不被误会卖广告,把主要有用部份抽出来,如下,
其实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里面那种:
posts.remove(post);
Collections.reverse(posts);
是不能用的,需要拿出来自己用其他collection里面做,或者在Query的时候排序和过滤。
经过测试,Blog那个例程已经可以跑起来,可以通过这个网址测试:http://laynezone.appspot.com
24 楼
Laynepeng
2009-07-10
pure 写道
Laynepeng 写道
Jackphone 写道
你如果不想以后会大量修改代码的话,暂时不要用Play!开发GAE应用。因为GAE目前对Java的限制很多,Play!要实现JPASupport和JPAModel同时支持Hibernate和GAE,确实有困难,所以,作者准备添加一个GAESupport类,用户可以编写GAE支持的Model,现在GAE的Java支持本身也只是一个Preview版,所以,现在用Play!开发的GAE应用,将来可能会大规模重构。
BTW.关注Play!意义不仅在于开发GAE应用,它的代码本身就写的很好,有很多值得我们学习的地方。
BTW.关注Play!意义不仅在于开发GAE应用,它的代码本身就写的很好,有很多值得我们学习的地方。
http://www.playframework.org/manual/contents/gae
现在已经有个可以用用了。。。
这个早就有了,正因为有这个才试着把Play!跑在GAE上的。
。。。
Play!确实是好东西,花了十分钟把它的manual看完,试了一下,大概用了20分钟调试就可以了。。。
Blog那个sample,
http://laynezone.appspot.com
回头写个blog,介绍一下做法。。。
23 楼
sword721
2009-07-10
在中国gae当作玩具玩玩就行了。
22 楼
pure
2009-07-09
Laynepeng 写道
Jackphone 写道
你如果不想以后会大量修改代码的话,暂时不要用Play!开发GAE应用。因为GAE目前对Java的限制很多,Play!要实现JPASupport和JPAModel同时支持Hibernate和GAE,确实有困难,所以,作者准备添加一个GAESupport类,用户可以编写GAE支持的Model,现在GAE的Java支持本身也只是一个Preview版,所以,现在用Play!开发的GAE应用,将来可能会大规模重构。
BTW.关注Play!意义不仅在于开发GAE应用,它的代码本身就写的很好,有很多值得我们学习的地方。
BTW.关注Play!意义不仅在于开发GAE应用,它的代码本身就写的很好,有很多值得我们学习的地方。
http://www.playframework.org/manual/contents/gae
现在已经有个可以用用了。。。
这个早就有了,正因为有这个才试着把Play!跑在GAE上的。
21 楼
Laynepeng
2009-07-09
Jackphone 写道
你如果不想以后会大量修改代码的话,暂时不要用Play!开发GAE应用。因为GAE目前对Java的限制很多,Play!要实现JPASupport和JPAModel同时支持Hibernate和GAE,确实有困难,所以,作者准备添加一个GAESupport类,用户可以编写GAE支持的Model,现在GAE的Java支持本身也只是一个Preview版,所以,现在用Play!开发的GAE应用,将来可能会大规模重构。
BTW.关注Play!意义不仅在于开发GAE应用,它的代码本身就写的很好,有很多值得我们学习的地方。
BTW.关注Play!意义不仅在于开发GAE应用,它的代码本身就写的很好,有很多值得我们学习的地方。
http://www.playframework.org/manual/contents/gae
现在已经有个可以用用了。。。
20 楼
pure
2009-07-08
whaosoft 写道
play??中国人做的??
是Play! 最后有个"!" 法国人做的。
19 楼
whaosoft
2009-07-08
play??中国人做的??
18 楼
pure
2009-07-08
Jackphone 写道
你如果不想以后会大量修改代码的话,暂时不要用Play!开发GAE应用。因为GAE目前对Java的限制很多,Play!要实现JPASupport和JPAModel同时支持Hibernate和GAE,确实有困难,所以,作者准备添加一个GAESupport类,用户可以编写GAE支持的Model,现在GAE的Java支持本身也只是一个Preview版,所以,现在用Play!开发的GAE应用,将来可能会大规模重构。
BTW.关注Play!意义不仅在于开发GAE应用,它的代码本身就写的很好,有很多值得我们学习的地方。
BTW.关注Play!意义不仅在于开发GAE应用,它的代码本身就写的很好,有很多值得我们学习的地方。
嗯,说的很对,现在Play!有些忙不过来了。我也看过Play!的源码,的确写的很通俗易懂,代码可读性很好,希望有更多的人了解使用Play!。另外就是GAE的发展现在也不明朗,也不清楚它对数据库这个如何加强支持。
17 楼
atealxt
2009-07-08
做着玩还可以,要是pojo关系复杂可就惨了...
等下一个版本吧,估计会有很大的变动,希望能对DB操作有好的改善...
PS:俺的..
http://atealxt.appspot.com/
等下一个版本吧,估计会有很大的变动,希望能对DB操作有好的改善...
PS:俺的..
http://atealxt.appspot.com/
16 楼
one23
2009-07-08
pure 写道
swantt 写道
要不要搞个GAE开发群哦.
现在担心的是不知道google要怎么搞GAE,限制太多了,不方便。
GFW限制比这个还大
15 楼
one23
2009-07-08
我对JPA不太熟,反正一般情况,应该是model.save();(或者其他方法),应该会有返回数据库数据,我想model应该是“受控态”吧,能得到KEY的吧,但我取老是null,有熟悉JPA给我说下
相关推荐
用户可以下载这个压缩包,然后根据项目文档进行安装和运行,以复现GAE在图数据上的实验。 图自编码器在多个领域有广泛的应用,如社交网络分析、化学分子结构学习、推荐系统等。在社交网络中,GAE可以帮助理解用户...
【基于GAE的Demo】是一个使用Eclipse集成开发环境构建的项目,主要展示了如何在Google App Engine(GAE)平台上整合Struts2、Spring和Tiles框架。GAE是Google提供的一个云计算平台,允许开发者在Google的基础设施上...
VGAE是在GAE基础上引入了变分推断的概念,用于处理图的生成问题。在VGAE中,通过引入潜在变量来对图的生成过程建模,进而学习到更具有解释性的节点嵌入。 **三、PyTorch实现** 在PyTorch框架下实现GAE,首先需要...
可以在GAE上直接使用,支持图片上传等。 源代码是修改其他网友的普通blog程序而来,只做了必要的修改,原结构保留 最新版本请去主页下载 http://redpower1998.appspot.com 主页包括原始的普通版本
Spring是一个广泛使用的开源Java框架,提供了依赖注入、面向切面编程和MVC(模型-视图-控制器)等功能,而GAE是Google提供的一个平台即服务(PaaS)解决方案,它允许开发者在Google的基础设施上部署和运行Web应用。...
标题“GAE上groovy初尝试”提示我们,这篇内容主要关于在Google App Engine (GAE) 上使用Groovy编程语言的初次体验。Google App Engine是一个托管服务,允许开发者部署和运行web应用,而Groovy则是一种动态、敏捷的...
GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则
在Google App Engine(GAE)平台上,虽然原生支持的语言是Java和Python,但通过一些技术手段,我们确实可以实现对PHP的支持。标题"让gae支持php的方法"所指的就是如何在GAE环境中运行PHP应用程序。描述中提到的"基于...
【标题】:“利用DJANGO在GAE上实现小型网络爬虫” 在当今互联网时代,数据挖掘和信息获取变得越来越重要,而网络爬虫是实现这一目标的重要工具。Django,一个强大的Python Web框架,通常用于构建网站应用,但也...
【标题】"可以放到GAE上的blog -- micolog"指的是Micolog博客系统,这是一款能够部署在Google App Engine (GAE) 上的开源博客平台。GAE是Google提供的一个云计算平台,允许开发者运行Web应用程序而无需管理服务器...
标题“GAE blog安装”指的是在Google App Engine (GAE)上部署一个博客应用的过程。GAE是一个由Google提供的平台即服务(PaaS)云环境,允许开发者构建、运行和维护Web应用程序,无需管理和维护底层基础设施。在这个...
GAE是Google提供的一项平台即服务(PaaS),允许开发者在Google的基础设施上运行自己的Web应用程序。这个包的特色在于“免配置”,意味着用户无需进行复杂的设置步骤,可以直接使用。 描述中提到,“GAE集成程序,...
在Google App Engine (GAE) 平台上进行Web应用开发时,选择合适的框架对于提高开发效率至关重要。其中,`webapp` 框架因其简洁高效而备受开发者青睐。本篇文章将详细介绍`webapp`框架的基本原理、组成部分及其实现...
架设在GAE上的GTalk翻译机器人 **目前已经存在的功能: 1. (0.1版开始支持) 可以直接识别中文和英文,并自动进行互译 1. (0.1版开始支持) 可以翻译一段文章,而不单单只是一个单词** **以后可能会有的功能: 1. (0.2...
jiql - (允许你的应用在GAE上使用SQL语句) jiql是在JAVA GAE上访问Google Datastore的JDBC wrapper jiql支持标准的sql语言进行访问原版的官方主页 www.jiql.org 由于原版源代码存在一些问题,所以对改版本做了...
pass之GAE入门教程, 学习GAE
标题中的“如何在GAE中轻松使用Django框架”表明我们即将探讨的是如何在Google App Engine (GAE) 平台上有效地部署和运行Django Web应用程序。Django是一个流行的Python Web框架,它提供了诸如数据库管理、用户认证...
标题 "在GAE中使用django模板" 涉及到的知识点主要是在Google App Engine (GAE)上部署和使用Django模板系统。GAE是一个由Google提供的平台,允许开发者构建和运行web应用,而Django则是一个流行的Python web框架,它...