最近Android很火呀,我也打算抛弃现在的moto手机,入手一个基于Android的手机了,看来看去就锁定即将上市的魅族M9了.
话说距离m9上市还有一段时间,闲得无聊便打算先熟悉一下android(安卓)系统,因为android是基于linux内核,由java语言实现的开源手机平台.故而也让我有了动手的理由,于是就按照 developer.android.com (这里要bs一下GFW, *.android.com 居然被墙了……) 上的文档先写一个"Hello,Android"出来.聊以自慰了一下.
下载安装了android sdk 和 Android Development Tools (ADT) Plugin for Eclipse (地址:https://dl-ssl.google.com/android/eclipse/),重启了下eclipse,就可以创建Android项目了。
跑了一下项目,发现sdk 自带的模拟器真不错,感觉和真机差不多了,也算先尝尝鲜了 呵呵
不过,在运行项目的时候,发现一个问题。就是一旦android 项目被清理(Clean)了源码,再次编译会出错,而且永远通不过 囧rz...
如图:
注:我用的是中文版的eclipse(在此感谢babel国际组织),所以不清楚英文版下报错信息是什么,所以我也搜不到任何有用的信息。不过最下面错误我以前是遇到过的,英文是“The project cannot be built until build path errors are resolved”.
这个gen下面的文件都是自动生成的,不可以人工操作.
在网上搜索了一下,有人说可以通过项目右键菜单里面的 "Android Tools" -> "Fix Project Properties" 解决,貌似不行.
这个郁闷呀,后来我找啊找,终于找到了解决办法。
那就是,如图:
是构建器(位于 项目->属性->构建器)次序的问题,请确保项目中的 java 构建器 始终位于最后.
调整好后,清理一下,再次编译即可通过.
该错误虽然很小,可是却很恶心。希望对某些正在挠头的人有所帮助. :)
其实这篇文章很久就打算写了,本来的想法是计划等到我的wp4gae项目有了博客雏形的时候,顺便写出来的。
可是事与愿违,我打算用groovy实现绘制验证码遇到了技术瓶颈,项目就一下子死在那了…详见邮件列表存档 囧rz
这一死就死了近两个月……好了,言归正传,话说用gaelyk 开发谷歌云计算(简称GAE)还是蛮棒的,而且它也是难得的几个面向GAE平台的groovy框架.
我就是在groovy官网看到它的链接的,主页是:http://gaelyk.appspot.com/,可以说gaelyk是一个又轻量级又强大易用的框架.
首先,确保本地eclipse(原谅我,我用的是eclipse) 安装了Google App Engine Plugin for Eclipse,Groovy-Eclipse 插件.
根据消息,后者最新版本为 Groovy-Eclipse 2.0.2,安装地址为:
http://dist.springsource.org/release/GRECLIPSE/e3.5/
http://dist.springsource.org/release/GRECLIPSE/e3.6/ (for Helios)
顺便说一句,eclipse 最新版本3.6 在widnows下有内存溢出现象,经常导致假死,这已经是公认bug了.
在groovy 和 gae 插件安装了后,现在可以创建基于gaelyk的项目。
有两种选择:
1,只下载 gaelyk-0.4.2.jar 文件,在项目中导入.缺点是必须对项目目录结构很清楚。
2,就是下载官方提供好的项目模板,解压后,可以直接导入到eclipse中。而且里面还自带了一些GAE的jar包.
本人选择的是后者方法,里面还有一些例子,可以参考学习.
一切完成后,目录结构如图:
前期工作好了后,就可以开始开发项目了.
习惯了一般的b/s开发,忽然转变到云计算平台,一般人都不会太舒服。不过gaelyk 是遵循经典的MVC模式的,它把视图和后台的逻辑处理很明显的分开了.
视图前台显示部分交给了视图模板 *.gtpl(相当于jsp),而把处理程序通通放在了Groovlet 里(类似servlet)。这样的话,思路就变的清晰了.
和jsp一样,gaelyk提供如 request、response、appliaction、session 等隐式对象,随用随拿.
当然,gaelyk 还提供了一些特殊的内置对象,比如 params(据说是学ruby on rails),就是一个封装了请求体里面参数的键值对集合, 或者像 headers,就是请求头里面的信息,以供用户调用.
厌烦了log4j ?不妨尝试下 gaelyk的 GroovyLogger,一样很棒。
除了这些个一开始就实例化好待用的对象,官方叫它“积极变量”,gaelyk 还提供了一些“消极变量”(即第一次请求时才实例化),
有点类似于 饿汉模式 和 懒汉模式阿.
如 out、html.
当然还有一些 gae 的对象,如 datastore,用于操作数据库.厌烦了gae 自带的jdo、jpa 方式。尝试一下gaelyk的条件式查询,很是方便。最重要的一点是其中不会产生一句sql语句,呵呵,sql不好的同学们有福了 :)
在gtpl 视图模板里面,默认支持el表达式,原生态支持 小脚本、代码块以及表达式.(因为groovy也是java 囧rz)
还有更有趣的,gaelyk 导入类时支持通过 as xxx 起别名,很方便.而跳转和重定向的时候也有简洁的办法,直接 forward "url"、redirecr "url" 即可,再也不用Request.xxx.dispatch.xxxx.findforward 了.
gaelyk 还有一个亮点就是,支持地址重写.只要稍稍编辑 web.xml (交由 RoutesFilter 处理),再指定规则文件.
就可以实现伪静态了.
如 get "/topic/@title" forward:"/showtopic.groovy?title=@title" 即可.而且还可以通过 validate 进行验证,过滤掉非法参数. 让被注入成为往事. 呵呵
并且,从gaelyk 0.4.1 开始,支持缓存 cache 了.如 cache: 3.hours 即缓存3小时.
还有更让人叫绝的,gaelyk 里面根本不需要实体类,呵呵
因为Entity对象是可以直接构造的,而且groovy 里面没有对象类型的区分(灰常像php、javascript),也就给了方便.
比如我创建一个用户,包含用户名、密码.
Entity entity = new Entity("user"); 注意导包 import com.google.appengine.api.datastore.Entity
然后只需要用户从表单提交对应的值过来。填充入user实体中.
还在用request.getxxxbyxxx???忘了上面提到的 params ?
gaelyk 提供你想不到的方法访问实体,
entity['name'] = params['name']
或者
entity.password = params['password']
亦可 entity << params 全部填充.
这时候,只需调用 entity的 save() 方法,就可以将数据持久化了.
删除只需同样调用 entity 的 detele() 方法即可,若需起事务,只需把语句放入datastore.withTransaction{}的闭包中即可.
怎么样?增删就是如此的简单.
至于查询,更是简单.指定要查询的实体,扔给几个条件、标准就出来了(有点类似hibernate的Criteria查询).
创建query.
def query = new Query("user")
给出条件(相当于sql where)
query.addFilter("name", Query.FilterOperator.EQUAL, "xxx")
指定排序(相当于sql order by)
query.addSort("name", Query.SortDirection.DESCENDING)
预编译
PreparedQuery preparedQuery = datastore.prepare(query)
设定单次结果集大小,和漂移位置.实现分页
def list = preparedQuery.asList(withLimit(10).offset(20)) //查询20到30列.
这样增删查均完成了.gaelyk 真的是很省事呀.
当然,gaelyk 提供远不止这些,还有像 email 功能、memcache 功能、 BlobStore 、queue 等功能.这些我都没有用过,将来可能会更多.
不过作为一个开发者来说,这样的框架只会让我们的工作越来越方便,效率越来越高.
关于gaelyk 的更多例子,见:http://gaelyk.appspot.com/tutorial
如果对我的wp4gae源码有兴趣,请看:http://code.google.com/p/wp4gae/source/browse/
wp4gae现运行于 http://xia-zhengxin.appspot.com/,欢迎围观.
注:相当alpha的版本.
标签:
开源,
OpenSource,
Google,
Google App Engine,
谷歌,
JAVA,
GAE,
谷歌云计算,
Groovy,
Gaelyk,
wp4gae
发表于:2010年7月17日
归类于:
其他,
个人 且
11 个留言
就在前天吧,谷歌应用程序引擎(简称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的两个版本,大家可以自行下载,
因为我的版本是 基于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