GAE关于Java的资料这是不多, 而且多数都要翻墙, 昨晚做个分页, 差点累死啊!
闲言碎语不多说, 上代码:
DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService(); Query query = new Query("User"); query.addFilter("name", FilterOperator.NOT_EQUAL, ""); // 设置Filter query.addSort("name", SortDirection.ASCENDING); // 要设置Sort, 则Filter的Attribute必须Sort, 且要放在其他Sort之前(Attribute要Index) query.addSort("ip", SortDirection.DESCENDING); // 设置Sort, 要在Filter对应Attribute的Sort之后 PreparedQuery pq = datastoreService.prepare(query); List listUsers = pq.asList(FetchOptions.Builder.withLimit(2)); // 设置Limit
If a query has both a filter with an inequality comparison and one or more sort orders, the query must include a sort order for the property used in the inequality, and the sort order must appear before sort orders on other properties.
This query is not valid, because it uses an inequality filter and does not order by the filtered property;
文档: http://code.google.com/appengine/docs/java/datastore/queries.html#Restrictions_on_Queries
翻不了墙的同学可以看这个 – 主要是分页:
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.appengine.api.datastore.Cursor; import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.DatastoreServiceFactory; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.FetchOptions; import com.google.appengine.api.datastore.PreparedQuery; import com.google.appengine.api.datastore.Query; import com.google.appengine.api.datastore.QueryResultList; public class ListPeopleServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); Query q = new Query("Person"); PreparedQuery pq = datastore.prepare(q); int pageSize = 15; resp.setContentType("text/html"); resp.getWriter().println("
关于分页的另一篇:
GAE的 Cron Job是通过配置文件实现的 – “Cron jobs are defined in cron.yaml
(Python) or cron.xml
(Java)”
Java版的cron.xml配置文件位于WEB-INFO目录下(位置同web.xml), 典型的一个:
<?xml version=”1.0″ encoding=”UTF-8″?>
<cronentries>
<cron>
<url>/GetIPLocation</url>
<description>get the ip location by api every 2 minutes</description>
<schedule>every 2 minutes</schedule>
</cron>
</cronentries>
该任务每两分钟执行一次, GepIPLocation是一个Servlet.
时间格式举例:
every 12 hours
every 5 minutes from 10:00 to 14:00
2nd,third mon,wed,thu of march 17:00
every monday 09:00
1st monday of sep,oct,nov 17:00
every day 00:00
API地址: http://code.google.com/appengine/docs/java/config/cron.html (可能需要翻墙)
jQuery.ajax() API:
“POST data will always be transmitted to the server using UTF-8 charset, per the W3C XMLHTTPRequest standard.” http://api.jquery.com/jQuery.ajax/
使用IE时, 出现乱码… 后台是java, tomcat的server.xml也已配置编码(见:RiaShanghai)….
突然发现用Firefox就木有问题.
“因为jquery ajax是使用utf-8来编码发送数据的,ie在发送时却没加上charset=utf-8,从而导致乱码(IE默认使用iso-8859-1编码)”http://fatkun.com/2010/12/jquery-ajax.html
呃, 应该就是这么个问题了.
解决方法:
$.ajaxSetup({ contentType: "application/x-www-form-urlencoded; charset=utf-8" });
当然首先要承认, 我不善穿梭旅行, 有限的大脑总试图回忆或记住某些片段, 以致旅行不久便面临崩溃, 所以很累.
其次必须要承认, 过去还是有一点快乐时光的. 当快乐时光封闭, 惨淡现实控制一切以致精神之后, 目的地似乎只有一个就是回到过去. 当然我不是盏省油的灯, 总是回到”未来的过去”, 时过境迁,人物皆非, 但心里的感觉确是过去而非未来.
还有一点就是我是个吃货.
1. 手里拿着筷子走路不是个正经事
maybe是未来的某个春天, 我下了灰机, 机场的广播说**女星跟**女星在**博客上搞了个XX活动, 人气极高. 过去以及现在的我对AV界之外的女星基本没有兴趣, 我打算走着去51路车站, 花1块钱回学校. 但我似乎只是尾随人流, 根本忘记了回去的路.
两边是被春风催情过的矮树, 像吃了原子弹一样急速的生长. 左手边有个操场, 大概是03年学校的土操场, 好大一帮女人们在跳舞, 我用旁光扫视了一遍, 大概有成千上万个姑娘. 我想停下来看看她们在搞什么, 但我低头一看, 我去, 我手里怎么会捏着一把筷子! md出来的时候不知道找个袋子装一下啊, 我开始对自己的不修边幅有点愤怒. 显然这把筷子让我无所适从, 于是我换了几个拿筷子的姿势, 但始终没有找到拉风而帅气的筷子, 只好低头赶路, 沿着矮树大大步的继续赶路.
迷迷糊糊的上了51路, 小A发短信说: 老李啊 莫要欺世盗名乱装B啊, 我推荐给你个连续剧, 你好好反思一下. 像很多小青年一样, 幻想通过一部电影就能改良一个残缺的人. 答曰: 一起吃个拌面吧.
2. “做梦都想回来”
这句话的意思不是说我很想回去, 只是说我只有在做梦的时候才能回去, 于是我真的没有回去过, 顶多是在梦里YY过.
回到多年前的宿舍里, 小X说, 老李, 你敢不敢打下这个电话? 他给了我一个8位的数字, 无知无畏的我就打了过去.
“**代理公司注册…验车…枪支弹药”
原来这是这几年流行的吸费电话. 过去很少有彩屏手机, 也没有吸费电话, 而且即使现在, 鸟市的号都是7位的, 我清醒的意识到, 这是依旧未来的某天.
宿舍的若干张床铺都被占满了, 显然没有我的落脚之处, 我随便躺在一张床上, 被罩显然至少有一个学期没有洗过, 他不需要PS也不需Fireworks, 轻松的把被子从浅蓝色一直渐变到灰黑色. 被窝有点微微的臭, 但对我来说这统统意味着温馨.
我对趴在电脑上打网游的俩SB说, 我做梦都想回来, 跟你们一起去吃个拉条子啊! 那俩SB对此毫无兴趣. 一个SB的网游可以创造无数的SB.
濒临咆哮的我发现我躺的根本就是上海的这张床! 不脏, 不臭, 也不够温馨! Fuck, 原来我只是精神穿越了, 难怪剧组的人连张床都没给主角安排!
3. 我们去吃拌面吧.
03年初到新疆, 在学校对面的”阿凡提”餐厅吃的第一顿饭就是拌面, 面条粗, 有红绿相间的各类辣椒, 油腻, 不习惯. 若干年后”阿凡提”不在了, 我竟然习惯了拌面, 并私下认为油腻的拌面虽然不健康, 但健康的拌面绝对不好吃!
话说在这场梦中, 我跟A, Y, S三人并坐在物理系后面路边, 对着眼前的草坪跟几颗开着大串白花的树发呆. 大学里最幸福与郁闷的事情就是TMD的无事可做, 完全空闲, 没有学生运动, 似乎连抵制日货的人都没有了, 没有太多的情爱可谈, 认真念书似乎是圆滑世故的表现. 于是就这么坐着, 既不赏草也不观花, 就TMD这么坐着, 脑子里跑过一只鸡, 紧跟着是一头大象, 总之就这么无趣的坐着, 除了耗费时间之外无事可做.
为了迎合观众的需要, 导演还TM的放了一个花瓶进来, 小A的女友W就这么被导演插入了进来. 这是完全是出于对我们的没信心以及对观众的不放心.
如果这是一部电影, 那必然有美丽的风景与乏味的情节. 我对着眼前一群蚂蚁用木头及石块建造起来的立交桥问道” 这是哪年建好的? 是苏联人帮我搞的吗?” — 这么乏味而SB的情节. 这什么导演, 什么剧情, 这什么演员, 什么智商啊!
小A说话了: 中午我们去吃拌面吧, 去木卡姆那吃, 好吃, 没那么多拉子跟油, 我想吃个大盘鸡拌面.
小Y: 你吃个大盘’鸡吧’!
我不喜欢小S, 估计他也有点讨厌我, 于是我们没插嘴, 也懒的一笑, “大盘鸡”巴的笑话实在听的是太多了, 不知道这个庸俗的导演为什么让小Y插上这么一嘴, 还不如让他脸上长个鸡巴好玩.
小A的花瓶女友坐在旁边, 安静端庄的说: 我们还是先吃飞机上剩下的干粮吧.
“干粮”, 你们是步行还是骑驴来的? 还要带干粮? 我对这种说法很感兴趣, 要知道从济南到乌鲁木齐的铁路里程是3747公里. 但她说”飞机上”, 她虽然是个花瓶, 也完全有条件可以做空姐, 但空姐不会这么节省, 也不会从飞机上带很多”干粮”回来吧?
总之我再次陷入困惑, 意外之外的是这个花瓶这么懂得过日子, 勤俭节约的人不多, 我甚至幻想她把她们的干粮拿出来晒在太阳底下.
小A委屈的说: 从周三到现在没跟兄弟们出去吃一顿饭, 都是吃干粮! 花瓶低头无语.
我想他们一定是出于物质上的匮乏或是精神上的信仰, 所以他们跟我不同, 他们不是吃货, 可我是. 但我仅限于一个吃货而已, 我不想别人因我而冷战, 于是我懊悔为什么从一开是就提议: 去吃个拌面吧.
三人无语, 花瓶低头. 我顶着飞来飞去的苍蝇还有蝴蝶, 飞呀飞. 阳光太灿烂, 晒得我浑身有些痒 — 多年前一个缺碘的人告诉我: 那是因为我太久没有洗澡了.
在这么灿烂的春天, 大家应该去施展魅力追求异性, 可偏偏要坐在这春天的中间, 幻想一盘油腻可口的拌面.
这么操蛋的剧情我实在没兴趣演下去, 在吃到拌面以前我就退了, MD老子被饿醒了!
Amazon越来越给力, 年初推出免费小主机后, 基于S3的Cloud Drive竟然也有免费版可用.
The Amazon Cloud drive offers 5 GB of free online storage that you can access from any computer. If you need more storage space, paid plans are available for storage up to 1,000 GB.
我基本一直用box.net的免费版, 有权限控制, 版本控制, 协同工作等, 甚是强大, 最近被墙.
相比Box.net, Cloud Drive完全没有这么多分享合作的功能, 自己上传 自己下载, 自己用Cloud player在线听歌…
闲言碎语不多说, 上图:
Amazon Cloud Player:
Player在打开时会进行检查, 只允许米国用户使用. 打开后就可用其他网络进行播放, 速度很给力!
还可通过Amazon MP3 Uploader上传MP3, 该工具基于Adobe Air
免费版是面向所有用户开放的, 但收费服务仅对部分国家开放(见:FAQ), 价格方面: xGB就是$x每年, 如最高1000GB, $1000/年.
// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.