GAE支持Java对很多java开发者来说是一个非常令人兴奋的消息。做应用存储是少不了的,Google给的答案是Datastore。它和我们以往使用的关系型数据库有很大不同,你不需要创建表,可以直接进行添加、修改、删除等操作。Google说datastore是分布式的,可以提供很好的伸缩性,易于扩展。
Google的datastore对java的api有三种:JDO、JPA、LowApi,JDO和JPA是建立在LowApi之上的。这api功能比较有限,我们不能像使用关系型数据库一样用SQL操作datastore中的内容。
HGSQL是一个虚拟数据库引擎,它提供了强大的SQL处理能力。它针对Google Datastore发布了一个接口API,该API也是建立在LowApi之上。http://hgsql4gae.appspot.com/是该API的演示,你可以在上面输入SQL语句进行操作里面存储的数据。
1、插入测试数据
insert into 员工 (编号, 姓名, 职位, 上级, 出生日期, 工资, 奖金, 部门) values ('0001', '王东', '职员', '0013', '1980-02-05', '800', '0', '20');
2、执行一个简单查询
3、执行一个比较复杂查询
select *from (select *from (select 编号,姓名, 部门, 职位, 工资from 员工union allselect '', '', 部门, 职位, sum(工资)from 员工group by rollup(部门, 职位)))order by nvl(部门, char(65535)),nvl(职位, char(65535))
4、删除数据
HGSQL forGoogle Datastore的使用非常简单,首先从http://hgsql4gae.appspot.com/中下载接口程序包hggds.jar,然后加入到你的GAE项目中,调用类com.hg.gds.HgGds中的query和execute方法就可以了。语法参考:http://www.hgsql.com/down/SQL参考手册.pdf
这篇帖子很长
今天上班,同事给我发了一条飞鸽信息
--------------------------------------------------------------------------------分割线---------------------------------------------------
天涯名帖 97年
前一阵天涯论坛上有一贴寥寥十数字,内容“我要回到1997年了,真是舍不得你们”。谁料想回复引起了渲染大波,有人希望帮忙带话给10年的自己好好学习,有人要带话珍惜感情,有人要孝顺父母。。。等等,本来一句玩笑,到头来却让人五味杂陈。特此整理回复奉献给大家:
我要回到1997年了,真是舍不得你们
以下为回复:
作者:花落水留红 回复日期:2008-5-27 23:39:18
看在老乡的份上提醒你,2008年春节前后千万不要去南方;3月14日不要去拉萨;之后不要去安徽阜阳;4月22日不要坐火车走胶济线;最后,5月初不要去四川玩,512当天即便是在北京,还是在大街上晃悠着比较踏实,尤其是下午2点28分左右。。。。。。唉,要嘱咐的事太多,您老好自为之啊。。。。。。
作者:komaneko 回复日期:2008-5-28 5:36:54
有一個艱巨的任務要交給你,現在趕快上書國家有關機構,把孔子、豆漿、漢字、古箏、端午節……,唉,反正能就這些傳統玩意兒,趕快去聯合國申遺,不然到了10年以後你會發現這些東西都不是我們的了,當然1997年的你是不會理解的,但是,聼我們這些生活在2008年的人一句勸,真的,趕緊的吧,晚了就來不及了。
==============
作者:路人无名 回复日期:2008-5-28 0:22:54
97年?
楼主能不能去趟乌鲁木齐帮我找个人~
找到他告诉他我爱他
我在2008年等着他
-----------------------------------
作者:成都可乐 回复日期:2008-5-28 20:37:02
给你说个机秘,记得买20倍投资把彩票池淘空。还要记得来分给我一半
08009期 体育彩票中奖号码
29选7
04、11、13、14、17、18、19+08
22选5
01、07、17、20、21
超级大乐透
04、08、12、24、30+05、08
七星彩
0、5、0、2、5、0、4
排列三
0、8、1
排列五
0、8、1、5、2
作者:请输入新用户名 回复日期:2008-5-28 20:52:04
LZ01年9.11时候去纽约,不过不要坐当天的航班,记着拿个DV,对准世贸大厦……
你就赚了
作者:wuxubianfa 回复日期:2008-5-28 22:02:36
97年,他在上大学三年级。
虽然这么回有点傻,不过还是表达一下我的心情吧。楼主你能不能帮我带个话,告诉他,不要着急恋爱。到了05年末的时候,我就会去找他了。
97年,我只有11岁,是不可能去找他的了。唉,楼主你要真是97年来的人就好了
作者:錢_我要錢 回复日期:2008-5-29 0:05:56
要不这样吧,这位敬爱的穿越者。
我把前天福利彩票中奖号码都告诉你,
等你到了2008的的5月27号你就给我买它个100来注的!这样你就可以中大奖了,到时候我们三七分账怎么样?
你也不用急你就等个10年就可以发大财了,而我更不用急了,如果我现在告诉你,那么我昨天不就应该从中了100注大奖的你手里拿到好多好多钱了嘛~~~~哈哈哈哈哈哈~~~~~~哈哈哈哈哈~~~~
嘘!不要告诉别人!
我真是天才!
作者:可可星冰乐 回复日期:2008-5-30 0:54:53
麻烦楼主去辽宁找个女孩子
告诉她 将来要小心不要被欺负 住宿舍的时候要注意 走的近的室友
那个人会诬陷人
要注意不要认识一个天津人 遇到一定要走开
要注意不要认识一个卖啤酒的
要告诉她 无论遇到什么事情 她的将来很美好
------------------------------------
大家还有什么想嘱咐的就请留言吧
虽然非常舍不得但我也该回去了
可惜1997年还没有天涯
不过也很快就会有嘚
祝大家在下个十年里开开心心
2018再见喽~~
下面是在打包的时候将第三方jar包一起打入一个jar包的方法:
在工程目录下有个build.xml文件,修改这个文件添加如下代码:
<target name="run" depends="TestHello-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
<ZIPFILESET src="${libs.swing-layout.classpath}" />
<ZIPFILESET src="${libs.commons-codec.classpath}" />
<ZIPFILESET src="${libs.commons-httpclient.classpath}" />
<ZIPFILESET src="${libs.commons-logging.classpath}" />
</exec>
</target>
其中TestHello是你的工程的名字,下面的ZIPFILESET是你需要一起打包的jar文件
一个HTTP协议的请求或应答的头部(在http协议中,数据包分为两部分,一部分是头部,由一些名值对构成,一部分是主体(body),是真正传办理的数据(如HTML页面等)),必须以US-ASCII编码,这是因为头部不传数据而只描述被要传输的数据的一些信息,一个例外是cookie,它是数据但是通过头部进行传输的,所以它也要用US-ASCII编码。
HTTP数据包的主体部分,可以用任何一种方式进行编码,默认是ISO-8859-1,具体可以用头部字段Content-Type指定。可以利用 addRequestHeader方法,设定编码方式;用 getResponseCharSet取得编码方式。对HTML或XML等类型的文档,它们的本身的Content-Type也可以指定编码方式,主要区分两者的作用范围以得到正确实的解码。
URL的编码标准,由RFC1738指定为,只能是由可打印8位/字节的us-ascii字符组成,80-ff不是us-ascii字符,而00-1F是控制字符,这两个区域中用的字符都须加以编码(encoded)。
2、Cookies
HttpClient能自动管理cookie,包括允许服务器设置cookie并在需要的时候自动将cookie返回服务器,它也支持手工设置 cookie后发送到服务器端。不幸的是,对如何处理cookie,有几个规范互相冲突:Netscape Cookie 草案, RFC2109, RFC2965,而且还有很大数量的软件商的cookie实现不遵循任何规范. 为了处理这种状况,HttpClient提供了策略驱动的cookie管理方式。HttpClient支持的cookie规范有:
Netscape cookie草案,是最早的cookie规范,基于rfc2109。尽管这个规范与rc2109有较大的差别,这样做可以与一些服务器兼容。
rfc2109,是w3c发布的第一个官方cookie规范。理论上讲,所有的服务器在处理cookie(版本1)时,都要遵循此规范,正因如此,HttpClient将其设为默认的规范。遗憾的是,这个规范太严格了,以致很多服务器不正确的实施了该规范或仍在作用Netscape规范。在这种情况下,应使用兼容规范。
兼容性规范,设计用来兼容尽可能多的服务器,即使它们并没有遵循标准规范。当解析cookie出现问题时,应考虑采用兼容性规范。
RFC2965规范暂时没有被HttpClient支持(在以后的版本为会加上),它定义了cookie版本2,并说明了版本1cookie的不足,RFC2965有意有久取代rfc2109.
在HttpClient中,有两种方法来指定cookie规范的使用,
HttpClient client = new HttpClient();
client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
这种方法设置的规范只对当前的HttpState有效,参数可取值CookiePolicy.COMPATIBILITY,CookiePolicy.NETSCAPE_DRAFT或CookiePolicy.RFC2109。
System.setProperty("apache.commons.httpclient.cookiespec", "COMPATIBILITY");
此法指的规范,对以后每个新建立的HttpState对象都有效,参数可取值"COMPATIBILITY","NETSCAPE_DRAFT"或"RFC2109"。
常有不能解析cookie的问题,但更换到兼容规范大都能解决。
3、使用HttpClient遇到问题怎么办?
用一个浏览器访问服务器,以确认服务器应答正常
如果在使代理,关掉代理试试
另找一个服务器来试试(如果运行着不同的服务器软件更好)
检查代码是否按教程中讲的思路编写
设置log级别为debug,找出问题出现的原因
打开wiretrace,来追踪客户端与服务器的通信,以确实问题出现在什么地方
用telnet或netcat手工将信息发送到服务器,适合于猜测已经找到了原因而进行试验时
将netcat以监听方式运行,用作服务器以检查httpclient如何处理应答的。
利用最新的httpclient试试,bug可能在最新的版本中修复了
向邮件列表求帮助
向bugzilla报告bug.
实际上登录一个网站,访问某个特点的页面,发表一篇文章,上传一些文件,并不是一个简单的事情。
HttpClient的基本使用因为发布的代码中带有几个例子,应该算是不难掌握的事情。下面我说下我遇到的几个问题。
1,登陆验证图片问题
首先登录的时候网站如果不想你对它编程的化通常都会设计一个验证图片,这个技术现在已经如此的易于使用,以至于随便到哪里都能找到代码来直接使用。对于验证图片的,现在还苦于无计可施状态。
2,笨蛋Cookie问题:
如果你要发送多个cookie,其实可以这样发的:
new Cookie(" www.aaa.com","popped","yes","/",new Date(2006,12,8),false),
new Cookie(" www.aaa.com","rtime","2","/",new Date(2006,12,8),false),
new Cookie(" www.aaa.com","ltime","1149940477953","/",new Date(2006,12,8),false),
new Cookie(" www.aaa.com ","cnzz02","1","/",new Date(2006,12,8),false),
});
但是截包就会发现,httpclient会在header里构件多个cookie项,每一项只含有一个cookie,这同IE是不一样的。IE和Firefox会把所有的cookie打包成一个,然后在这个cookie里按照分号把每一项隔开,中间有个空格。
所以如果用httpclient,还想让cookie正常的话,请使用下面这种形式:
state.addCookie(new Cookie("blog.aaa.com","poped",cookies,"/",new Date(2006,12,8),false));
3,编码问题:
httpClient处理编码并不像IE或FireFox那么智能,httpclient记不住上次会话的编码,这样如果默认不是ISO-8859-1的话,那都要在Content-Type里边指定,其实指定的方法也很简单。
本来要提交的是form,默认按照application/x-www-form-urlencoded来发送,在IE里边发送的话截包可以看到,报文中也就指定了这样一个Content-Type,但是人家IE已经把报文的内容按照会话的编码转换好了。而httpclient不行,它并不知道怎么转化,那么你没有设定转换的charset的话,它就按照Charset=ISO-8859-1转换了。这一点上Httpclient应该再改进一下,因为记住server发过来的页面编码是件很简单的事情。只要将类似于"Content-Type: text/html; charset=utf-8"这样的头保存一下状态就可以了。
为了弥补httpclient这一点的傻瓜表现,我们只好每次都手工设置一下喽:
postMethod.addRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
4,上传文件问题:
httpClient并不能很好的模拟文件上传。
首先是对于文件类型的识别,IE可以做到按照文件类型分别选择不同的Content-type进行发送,而httpclient就需要我们自己设定,这样如果对一个目录进行自动化上传的话就必须知道该目录下所有文件的类型,以及对应的charset,然后再设置FilePart的时候逐一判断文件扩展名,以赋给不同的content-type和charset,对于一些网页编码是gb2312,而另外一些网页编码是utf-8则会更加麻烦。
其次是如果发送的multiPartPost报文中除了FilePart以外,还需要一些form中的其他input的信息,又是一件很麻烦的事情。刚开始的时候我以为像一般的PostMethod一样,使用PostMethod.addParameters()就可以了,后来才发现这个 MultiPartPost跟那个Post根本就是两个不同的Post。虽然从网页上看都是Form,且只是在input的类型上 MultiPartPost包含一个file类型的input,其他完全一样,但实际上在httpClient中是完全不同的两套方案。对于 MultiPartPost而言,不能用addParameters(),而要使用
new MultipartRequestEntity(
new Part[] { art1,part2,part3,part4},
someMultiPartPost.getParams())
);
这种形式。对于要上传的File,那么这些part就是FilePart对象,如果是跟随form的其他input,那么这些part就是 StringPart。这样发出去的报文才是:Content-Disposition: form-data; name="newFolderName"这种形式。
总结起来,其实也不能怪人家HttpClient,天下间哪有那么多容易做到的事情,尤其是面对Http这样一个说来不算简单的协议。
实际上像这种开源已久的东西,已经有了不少的文档,虽然有时候不太好找,但很多问题还是能够猜或者试出来,毕竟相对比较成熟,而且遵循这rfc来做的。就像我在水母上问问题,有人说的那样,世界上有什么能模拟的像IE一样呢,也不能拿IE的标准要求HttpClient。
我现在的感觉是要想用好HttpClient,或者类似的别的什么工具(其他我就不知道了,有知道类似工具的麻烦告诉我一声),其实还是要把协议吃透,这样一旦遇到什么问题,才知道问题出在哪里,否则就只有郁闷的份儿了。
昨天去Apache的网站,看到一个新的Project叫做HttpComponent从common里边脱离出来,包含了HttpCore, HttpClient,HttpAsync,HttpNIO,HttpCookie,HttpConn,看不出到底想做成什么样子,不过HttpCore 4.0 alpha2已经发布了,以后HttpClient用起来可能又有新的变化了。
一周的时间,用的不是很多,有说得不妥的地方,还请大家指正。








