2009年4月11日星期六

Google AppEngine for java 的JDO测试

研究了一下dataStore文档,并作了一个简单的留言板,没有用DEMO里的那个,自己做的更方便修改,省时间。

有几个心得:

  • 使用eclipse的google插件可以节省很多必要的麻烦,我在前文中已有说明。
  • google的dataStore分为标准api和low api(底层api),标准api分为jdo和jpa两种。底层API看上去比较复杂,文档也少(实际上只有javadoc),而比较jdo和jpa,虽然后者比较新,但显示google对jdo的支持更全面,从文档和DEMO可以看出。
  • 按google的建议,先创建一个PMF工厂,然后使用Query对象构造查询,删除和新增经测试问题都不大,关键是查询和index。
感觉最麻烦的就是索引(index)处理了,与SQL相比,这一部分比较不太一样。eclipse在build项目时会自动处理Query产生的index,并在WEB-INF/appengine-generated/下生成datastore-indexes-auto.xml配置文件,如果有数据更新,还会生成local_db.bin,这实际上就是数据保存的文件了,删除这个文件数据就消失了,这个文件不会上传到googleApp,所以本地调试时生成的数据是不会在上传时与googleApp上的数据同步的。

如果在Query中加入了条件where或order by 语句,都有可能会自动生成index,这时datastore-indexes-auto.xml配置文件生成类似下面的代码:

<datastore-indexes>

<!-- Used 7 times in query history -->
<datastore-index kind="Msg" ancestor="false" source="auto">
<property name="author" direction="asc">
<property name="__key__" direction="desc">
</property>

</property>

这个__key__可能就是主键。
后来发现在改了几下条件后就出现500错误了,再次看了文档,原来eclipse的自动生成index的配置文件是有局限性的,另一些需要手动在datastore-indexes.xml中进行配置,条件如下:

可自动生成的:
  • queries using only equality and ancestor filters 使用的where条件必须是等于条件(=)或是原始的(?这个我理解不到位)。
  • queries using only inequality filters (which can only be of a single property) 如果使用不等的条件(<, <=, >=, >),则只能针对一个字段,也就是非等于条件的where语句,涉及的条件对象只能是一个,比如 age> 10 and age <20>10 and level >0 ;
  • queries with only one sort order on a property, either ascending or descending 在order by 排序语句中只能有一个字段,不是asc的就是desc的。比如 order by age asc是可以的,order by age asc ,id desc 是不行的。
不可自动生成,需要datastore-indexes.xml中进行配置的:
  • queries with multiple sort orders 多重的order by 条件
  • queries with a sort order on keys in descending order 在主键上按倒序排,即order by id desc
  • queries with one or more inequality filters on a property and one or more equality filters over other properties 在一个字段上存在一个或多个不等的where条件(<, <=, >=, >),而且有一个或多个相等条件在其他的字段上
  • queries with inequality filters and ancestor filters 同时存在一个不等条件和ancestor filter条件(这个ancestor filter到底是什么?)
而在Query的写法中,也有很多地方与sql不同,前者有更多的限制:
详情请见:http://code.google.com/intl/en/appengine/docs/java/datastore/queriesandindexes.html#Restrictions_on_Queries

我就不再详细翻译了,有空再进一步说明。

相关主题:

2009年4月9日星期四

两个不错的多文件上传组件(jquery,flash)

这是一个使用jQuery和flash的多文件上传组件:
http://www.uploadify.com/demo/

这是一个FLASH的多文件上传组件:
http://www.apueee.com/2008/07/05/flash-multiple-file-uploader/

这里所说的多文件上传,是指点击浏览打开的本机文件浏览窗口可以选择多个文件!
而并非一次选一个,然后一次上传的概念,那还应该算是单文件上传,只不过批量而已。

Google App Engine for Java的eclipse插件下载及体验

Google App Engine for Java的eclipse插件非常好!
很多烦琐的操作和步骤都代劳了。
比如:
  • 创建project项目的结构
  • 加入jdo,jpa的相关lib
  • build时使用的jdo优化
  • 直接集成jetty服务器测试
  • 最重要的,直接deploy,也就是上传你的APP

AppEngine for Java的eclipse插件下载


一切都很好,但是第一次下载时简单慢得夸张(eclipse3.4- ganymede),其根本原来原来是ganymede的update目录下载不了(这个是从eclipse的官网下的,google不会这么慢)。

这里提供一个Google App Engine for Java的 eclipse3.4-(ganymede) 插件下载:点击下载
此外还需要从google sdk下载其java sdk 下载地址:http://code.google.com/intl/en/appengine/downloads.html#Google_App_Engine_SDK_for_Java

下载后直接把plugins和feathers目录中的文件复制到eclipse相同目录中,启动后可以看到google的三个图标。点击第一个蓝色图标创建一个google web application,在对话框中可以看到Google SDKS里面有两个部分:
Google Web Toolkit --这个把它的勾去掉,如果需要可以去google下载后配置
Google App Engine --这个就是关键了,把它勾上(默认已勾),点击后面的蓝色链接configure SDKs... 然后在弹出的App Engine中add 一个从前面下载好后解压后的java sdk位置,如:D:\java\appengine-java-sdk\
填入相关的project名和包名,就可以开始体验Google App Engine for Java了!

Google App Engine for Java的JSP中文问题

现象:直接使用java-sdk上传或使用eclipse上传后发现JSP中的中文是乱码的,Servlet在设置好request和respone的encoding后处理中文没有问题。

在使用命令行方式上传中文的JSP时,我发现有一个JSP报错如下:
--------------------------------------
8% Compiling jsp files.
2009-4-10 8:43:16 org.apache.jasper.JspC processFile
信息: Built File: \a.jsp
11% Compiling java files.
C:\DOCUME~1\keel\LOCALS~1\Temp\appcfg53496.tmp\WEB-INF\classes\org\apache\jsp\a_
jsp.java:43: 警告:编码 GB18030 的不可映射字符
out.write("...head>\r\n meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\r\ntitle>鎴戞潵浜??/title>\r\nhead>\r\nbody>\r\n");
1 警告
--------------------------------------
(因为blog发表的要求,部分html代码作了改动)

这说明在使用org.apache.jasper.JspC processFile进行Compiling jsp files使用了GB18030而不是UTF-8,而且在生成的临时文件夹中可以看到jsp编译后的.java文件直接就是乱码的,所以,并不是googleApp的server不支持,而是appengine-java-sdk的JSP编译器的编码有问题。对于这个问题,我在googleApp for java的groups上提问了,参考:How to change the JspCompiler's encoding

sdk的上传参数很简单,再看了文档,好像在builder.xml中可以通过ant进行一些设定,但涉及到update操作时还是没有办法。

再经过对appengine-java-sdk一番研究,发现居然没有地方可以设置JSP编码选项(在appengine-local-runtime.jar(lib/impl)中com\google\appengine\tools\development\webdeafault.xml 中可以加上javaEncoding,但没有用),而且这个java的sdk似乎没有源文件下载,也就无法从根本上解决这个问题(反编译?没必要吧),不过相信过不了多久,SDK的源码发布后就可以解决这个问题,或者GOOGLE自己会加上这个参数设置就更好了。

后来发现jxva回了我的帖子,并给出了JSP中文的解决办法,对JSP中的中文进行转码,就像我们以前在处理WAP的中文问题一样,他给出了一个方法:
-----------------------------------
public static String encode(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < c =" str.charAt(i);" a =" (char)"> 255) {
sb.append("&#").append(a).append(';');
} else {
sb.append(c);
}
}
return sb.toString();
}
-----------------------------------
效果可以看他的app:http://jxva-framework.appspot.com/

这种方法可以暂时解决JSP的中文问题,甚至可以写一个ant脚本对JSP进行预处理,目前也只有如此了。此外,把windows的默认编码设置为utf-8应该也能起作用,如果有办法改的话。

相关主题:

Google App for java 中文

Google App 终于而且提前发布了JAVA版,这是一个令全世界JAVA开发者兴奋的事情,我想以后的GoogleApp肯定会大放光彩,JAVA开发者加入后的世界更精彩!

如今,APP开发似乎成了新潮流,最有影响的就是Apple的APP Store,然后还有SONY的游戏Store,很多高端的终端都有计划开出自己的store来吸引开发者丰富自己的终端应用,甚至包括国内的魅族M8都开发了store!

因为GoogleApp的java版才出来,目前还存在这样那样一些问题,特别是中文问题等,特将相关的一些解决办法记录下来。