Google App Engine(谷歌应用程序引擎) JAVA 试用手册
就在前天吧,谷歌应用程序引擎(简称GAE)继python后,开放了对Java的支持.让人兴奋不已
比较Java是当今最流行的高级语言,在TIOBE的编程语言榜单上,JAVA已经蝉联了十几个月的冠军,这一点是毋庸置疑的。
相关链接: 4月编程语言排行榜
由于这个功能是刚刚开放的,所以用句通俗的话来讲,现在还在内测阶段。所以 必须向 谷歌申请,才能开通。
这个在你用 谷歌帐号 登录 GAE 时候 会发现,在页面上方会有黄色的提示。 只要点击 "sign me " 按钮就可以了。注意这个是有名额限制的,前1万名申请者才有资格开通,所以要抓紧呀
下面是引用GAE官方博客的声明:
we're giving the first 10,000 interested developers an early look at Java language support
之后,在你的注册邮箱里收到一封开通的通知,如图
至此,你的 GAE 就开始可以跑 JAVA 程序了,哈哈
要想你开发出的程序能在GAE上运行,首先得安装App Engine Java software development kit (SDK)
下面提供两种方法:
1.到这个地址:http://code.google.com/appengine/downloads.html 下载×××.msi 的安装包,安装即可。然后可以利用它自带的相关工具开发。这个方法,对于我这个酷爱绿色软件的人 不太适用。
2.安装 Google Plugin for Eclipse,这个我比较推荐,毕竟我们开发Java 大多用的都是这款开源的IDE。
下载地址是针对eclipse的两个版本,大家可以自行下载,
- The Google Plugin for Eclipse, for Eclipse 3.3 (Europa):
http://dl.google.com/eclipse/plugin/3.3
- The Google Plugin for Eclipse, for Eclipse 3.4 (Ganymede):
http://dl.google.com/eclipse/plugin/3.4
因为我的版本是 基于3.4.2的Ganymede,所以选择后者,打开eclipse-->help--->software update--->add site 输入地址,
再刷新一下,就可以看到谷歌GAE的插件了,如图
点击 Update 即可。 默认安装完毕后重启eclipse.
再打开eclipse 时候,会发现面板上多了一些图标,这些就是GAE的按钮。如图
点击 蓝色 小"g" 图标 创建 Web 应用 项目,这个就是 能在GAE上运行的程序的雏形。呵呵
新建项目的结构大体是:
ProjectName/ src/ ...Java source code... META-INF/ ...other configuration... war/ ...JSPs, images, data files... WEB-INF/ ...app configuration... lib/ ...JARs for libraries... classes/ ...compiled classes...
其实如果你经常做JSP的项目会发现和它一样,只不过Webcontent 被改名为 War 了
如图:
现在我们要做的就是 像平时一样,写好自己的程序就可以了。
不过有一点要注意的是,在 war/WEB-INF下有个
appengine-web.xml,它是和将来程序在GAE上的具体设置有密切关系的,
主要是这两点:
<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <application>你的GEA ID名称</application> <version>程序的版本号</version> </appengine-web-app> 更多的设置,比如 静态文件 和 资源文件,以及 是否开启session,ssl安全浏览 等,可以到下面这个地址去查看 URL:http://code.google.com/intl/zh-CN/appengine/docs/java/config/appconfig.html 这是我 appengine-web.xml 的设置情况(仅供参考),如图 在编写java 类是要用到GAE提供的包,如 packagepackageName;importjava.io.IOException;importjavax.servlet.http.*;importcom.google.appengine.api.users.User;importcom.google.appengine.api.users.UserService;importcom.google.appengine.api.users.UserServiceFactory;这些,大家可以参考GAE的api文档,在此不再多说
关于JSP页面,也与一般的web project 没两样,不过如果eclipse默认用的是JRE的话,是会报错的,
所以请确保eclipse的JRE System library是 JDK.
还有就是数据库,GAE提供两种类型的数据库访问,1 是 Java Data Objects (JDO),2 是 Java Persistence API (JPA). 具体信息可以参见:SUN的 技术文档 或 GAE文档 地址:http://code.google.com/intl/zh-CN/appengine/docs/java/datastore/usingjdo.html 想要实现对数据库的访问,得设置---位于src/META-INF目录下的
jdoconfig.xml文件
. 具体内容如下: <?xml version="1.0" encoding="utf-8"?> <jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig"> <persistence-manager-factory name="transactions-optional"> <property name="javax.jdo.PersistenceManagerFactoryClass" value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/> <property name="javax.jdo.option.ConnectionURL" value="appengine"/> <property name="javax.jdo.option.NontransactionalRead" value="true"/> <property name="javax.jdo.option.NontransactionalWrite" value="true"/> <property name="javax.jdo.option.RetainValues" value="true"/> <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/> </persistence-manager-factory> </jdoconfig> 在类里实现对数据库的列名声明方法简称POJOs(Plain Old Java Objects) 代码编写如下: packagepackageName;importjava.util.Date;importjavax.jdo.annotations.IdGeneratorStrategy;importjavax.jdo.annotations.IdentityType;importjavax.jdo.annotations.PersistenceCapable;importjavax.jdo.annotations.Persistent;importjavax.jdo.annotations.PrimaryKey;importcom.google.appengine.api.users.User;@PersistenceCapable(identityType=IdentityType.APPLICATION)publicclassGreeting{ @PrimaryKey @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY) privateLongid; @Persistent privateUserauthor; @Persistent privateStringcontent; @Persistent privateDatedate; 更多数据库语法,参见 http://code.google.com/intl/zh-CN/appengine/docs/java/datastore/dataclasses.html 而后,是数据在数据库里的物理,永久写入: 见实例代码: packagepackageName;importjavax.jdo.JDOHelper;importjavax.jdo.PersistenceManagerFactory;publicfinalclassPMF{ privatestaticfinalPersistenceManagerFactorypmfInstance= JDOHelper.getPersistenceManagerFactory("transactions-optional"); privatePMF(){} publicstaticPersistenceManagerFactoryget(){ returnpmfInstance; }} 新建一个操作类,导入上面的相关类: 以日期为例,写入数据库 Datedate=newDate(); Greetinggreeting=newGreeting(user,content,date); // user,content 假设上面已定义 PersistenceManagerpm=PMF.get().getPersistenceManager(); try{ pm.makePersistent(greeting); //待jsp 页面传入 }finally{ pm.close(); } 在JSP页面的调用方法实现: 局部代码: <% PersistenceManagerpm=PMF.get().getPersistenceManager(); Stringquery="select from "+Greeting.class.getName(); List<Greeting>greetings=(List<Greeting>)pm.newQuery(query).execute(); if(greetings.isEmpty()){%><p>目前无消息</p><% }else{ for(Greetingg:greetings){ if(g.getAuthor()==null){%><p>匿名人士写道:</p><% }else{%><p><b><%=g.getAuthor().getNickname()%></b>写道:</p><% }%><blockquote><%=g.getContent()%></blockquote><% } } pm.close();%>这样,一个GAE 程序访问数据库 操作的过程就完成了。 JDO操作数据库语句 叫做 JDOQL (和T-SQl 等差不多). 具体介绍见:http://code.google.com/intl/zh-CN/appengine/docs/java/datastore/queriesandindexes.html 接下来就是 静态文件 的问题,这个应该不成问题,所谓 静态文件 就是一些 无需改变的,如 图片,CSS样式表 等 而关于 静态文件 等的 声明在 appengine-web.xml 里面有详细说明,本人不再多说. 至此,一个 GAE JAVA 项目就算是完成了,待写好代码,测试完毕后,就可以通过 eclipse 的插件 上传到 GAE 服务器运行了了。 点击那个 蓝色小引擎 的图标 即可,如图:
至此,我们对 GAE JAVA 的第一次接触 到此结束了。 这是我上传的一个留言板测试页面,大家可以去看看, http://xia-zhengxin.appspot.com PS:我发现了一个问题,貌似 GAE 对 中文的支持好像不太好,我在本地的中文字符,上传后都会变成了乱码。可能是还有什么没有设置好吧 但是 我的pageEncoding 和 charset 都改成了 gbk 或 utf-8,好像都不太有用。
现在问题得到了解决:
详见:http://www.jxva.com/blog/personal-diary/change-the-google-app-engine's-javac-compiler-encoding.html
原因是因为调用了系统默认的编码格式,而windows的默认字符编码不是 utf-8,所以导致中文变乱码了,呵呵
下载上面地址 人家提供的反编译好的application.class 文件,覆盖原来的,就OK了
不同的是:此人用的是SDK, 而我们用的是 plugin ,路径可能不一样。插件路径如下:
Eclipse路径\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0\lib\appengine-tools-api.jar