Total Pageviews

Wednesday, 7 December 2011

开发基于Google App Engine for Java的Web应用程序/Google App Engine 的简易教程

在IT业步入“云”时代的时候,Google App Engine无疑是引领“云”技术潮流的一支生力军。但在App Engine诞生后的很长一段时间里,它都只支持Python语言,让广大Java程序员只能望洋兴叹。幸运的是,在2009年4月,Google App Engine推出了Java版本,让Java程序员终于能感受“云”时代开发的便利。本文将简单介绍如何开发基于Google App Engine for Java的Web应用程序,希望能有助于读者快速了解这一技术。

关于Google App Engine

简单来说,Google App Engine是Google公司提供的一个可供用户运行网络应用程序的基础架构,使用App Engine,开发者不再需要购买服务器或虚拟空间,只需上传程序,即可开始为用户提供服务。目前,Google App Engine支持Python和Java两种语言。

安装Eclipse插件

创建基于Google App Engine for Java的应用程序,最好的途径是使用Google提供的Eclipse插件,插件安装方法具体见http://code.google.com/eclipse/docs/download.html;对于我使用的MyEclipse6.0,插件安装地址为http://dl.google.com/eclipse/plugin/3.3。

安装后,重启MyEclipse,如工具栏出现如下图标,安装即完成。

按钮的功能:
  • 蓝色小球让您能够访问 App Engine for Java 项目创建向导。
  • 红色工具箱让您编译一个 GWT 项目。
  • 迷你喷气式飞机图标让您能够部署一个 App Engine 项目。

下面,我们在MyEclipse中创建一个简单的“Welcome2GAE”应用程序,来简单说明基于Google App Engine的开发过程。

创建“Welcome2GAE”应用

  • 新建项目
    点击蓝色小球图标,出现新建Web App项目界面,填入项目名称,包名等必填项,选择使用Google App Engine,点击Finish,即可创建一个完整的Web App项目,项目结构如下图:
    事实上,在创建项目的过程中,App Engine插件已经为我们生成了一个可以运行的工程,包含Welcome2GAEServlet.java、web.xml等文件,运行此工程后,即可通过访问服务器查看到“Hello World!”页面。

    但是,我们想做的稍微复杂一点,主要是加入Jsp页面及表单提交的功能,具体为,访问http://localhost:8888/ ,可查看到如下图所示的页面。
    用户填入名字提交后,即显示欢迎页面,如下所示。
  • 创建welcome.jsp文件
    我们在war目录下,创建welcome.jsp文件,以显示名字输入页面。Jsp文件内容如下:
    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>Welcome2GAE</title>
    </head>
    <body>
    <form action="/welcome">
    Please enter your name:
    <input type="text" name="name">
    <br>
    <input type="submit" />
    <br>
    </form>
    </body>
    </html>

  • 修改Welcome2GAEServlet.java文件
    内容如下:
    package com.appengine;
    import java.io.IOException;
    import javax.servlet.http.*;
    @SuppressWarnings("serial")
    public class Welcome2GAEServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws IOException {
    resp.setContentType("text/plain");
    resp.getWriter().println(
    "Welcome to GAE ! " + req.getParameter("name") + " !");
    }
    }

  • 修改web.xml文件
    内容如下:
    <?xml version="1.0" encoding="utf-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <servlet>
    <servlet-name>welcome</servlet-name>
    <servlet-class>com.appengine.Welcome2GAEServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>welcome</servlet-name>
    <url-pattern>/welcome</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
    <welcome-file>welcome.jsp</welcome-file>
    </welcome-file-list>
    </web-app>

  • 本地运行
    完成以上文件新建及修改后,即可按下图所示,运行Web Application,然后访问http://localhost:8888可查看效果。

部署“Welcome2GAE”到Google App Engine

对熟悉JavaEE开发的读者来说,上面的例子实在是太过简单了,对,你想得没错,Google App Engine开发实际上就是这样简单,和我们平常的Web开发区别不大。下面,我们来看它与平常Web开发的主要区别,即将应用部署到App Engine。
正如Google的其他服务一样,App Engine在开始的时候也提供免费的服务,当你的应用访问量达到一个比较高的水平的时候,才会收取适当的费用。当然了,免费的服务也需要你拥有一个Google账号,并申请App Engine服务。读者可登录Google网站,申请账户及相应服务,这里就不一一赘述。

在上传应用之前,我们需要先在Google App Engine个人账户管理页面上为应用申请一个Application ID,并在工程中配置此ID,类似于域名,事实上,Google也提供了类似http://ID.appspot.com 的免费二级域名,给大家使用,配置ID如下图所示。

配置完ID后,点击前文所述的部署App Engine按钮,按下图部署,即可完成应用的部署操作。

读者可访问http://dianausdu.appspot.com/,查看示例效果。

结语

至此,我们即完成了一个非常简单的Google App Engine应用程序,并部署到Google App Engine.
--------------------------------------------------------------------------------------
Google App Engine for Java


第 1 部分:运转起来!(http://www.ibm.com/developerworks/cn/java/j-gaej1/index.html)
Google App Engine 曾经一度是 Python 开发人员的专利。那是一段黑暗的岁月。Google Inc. 在 2009 年 4 月向 Java 开发人员开放了其云计算平台。在这个共分三部分的系列文章中,Java 技术作家兼培训师 Rick Hightower 将带领您了解这个可靠、健壮、有趣的平台,并将它用于基于 Java 的开发。在本文中,您将了解到为什么 Google App Engine for Java 将成为您构建高度可伸缩的杀手级应用程序的开发平台,然后开始使用 Google Plugin for Eclipse 构建两个示例应用程序:一个基于 Google Web Toolkit (GWT),另一个基于 Java Servlet API。您将了解到 Google App Engine for Java 带来的巨大改变,包括从头构建应用程序以及将它部署到高达 5 百万个视图。(这仅仅是免费版提供的功能)。
 

Google App Engine for Java: 第 2 部分:构建杀手级应用程序
诸如 Google App Engine for Java 这样的云平台的关键在于能够设计、构建和部署专业级的应用程序 —— 可以非常容易地进行伸缩。在这个包含三部分的 Google App Engine for Java 系列文章第二篇中,Rick Hightower 将通过一个分步指南,使用 Google App Engine for Java 来编写和部署一个简单的联系人管理应用程序,从而超越第一部分中提供的现成示例。 


Google App Engine for Java,第 3 部分: 持久性和关系
在企业环境中,数据持久性是交付可伸缩应用程序的基础。Rick Hightower 在他撰写的有关 Google App Engine for Java 的系列文章的最后一篇中,介绍了 App Engine 当前基于 Java 的持久性框架。让我们学习一些基础知识,了解为什么当前预览版中的 Java 持久性还未到发布的最佳时间,同时获得一个良好的演示,看看您如何在 App Engine for Java 应用程序中保存数据。注意,您将需要启动并运行来自第 2 部分的联系人管理应用程序,在此过程中学习如何使用 JDO API 保存、查询、更新和删除 Contact 对象。


Java 开发 2.0: 使用 Google App Engine
开源解决方案和外来基础设施改变了 Java 开发的特征,使您能够以更低的成本、更快的速度交付更好的软件。Andrew Glover 发明了 Java 开发 2.0 这一术语,使用它概括了所有这些现象体现出来的强大力量。他推出了一个全新的系列,主要介绍有关 Java 开发 2.0 的工具和技术。本系列的第一期文章将宣布 Java 开发 2.0 的到来,并解释了如何使用 GoogleApp Engine for Java 迅速实现这些概念。
-------------------------------------------------------------------------------

Google App Engine 的简易教程



本文将通过一个简单的例子,来介绍大家如何创建一个简单App Engine程序,首先,给大家介绍一下Google App Engine。

Google App Engine的介绍

Google App Engine 提供一整套开发组件来让用户轻松地在本地构建和调试网络应用,之后能让用户在Google强大的基础设施上部署和运行网络应用程序,并自动根据应用所承受的负载来对应用进行扩展,并免去用户对应用和服务器等的维护工作。同时提供大量的免费额度和灵活的资费标准。在开发语言方面,现支持Java和Python这两种语言,并为这两种语言提供基本相同的功能和API。


例子

这个例子非常简单,就是提交一个关于blog的表格,并将这个表格存储到App Engine的Datastore中。如果大家对源代码感兴趣,可以通过这个地址下载。本文将主要关注Python版App Engine,Java版App Engine不在本文的讨论之列。

搭建环境

主要有下面三个步骤,其中第三步为可选:
  1. 安装Python的最新稳定版的运行时(Runtime),下载地址。有三个注意点:其一,Linux系统应该自带Python;其二,在Windows上安装好Python之后,需要在系统Path上加入Python的目录;其三,App Engine上应用服务器版本为2.6.5,所以请不要在项目在加入Python 2.6.5版之后引入的特性。
  2. 安装App Engine的SDK,下载地址。有两点需要注意:其一在Windows上安装好App Engine的SDK之后,也需要在系统Path上加入SDK的目录;其二是在Linux上,无需安装App Engine的SDK,只需将其解压缩,并放置在合适的目录即可。
  3. 安装Eclipse和Pydev插件,这步对那些只是想尝试一下App Engine的读者而言,是可选的,但是由于Eclipse成熟的开发环境,在加上Pydev自带的代码加色、自动提示和强大的调试,并且Pydev更是在其1.4.6版上加入了完整地对Google App Engine的支持,所以对那些准备开发App Engine程序的读者而言,则是必须的,如果想了解进一步信息,请点击
虽然如果不熟悉Python,并不会影响大家对本文的理解,但是如果大家想深入学习Python的话,可以点击来阅读《Dive Into Python》的中文版。还有,我个人推荐大家使用Linux作为App Engine的开发平台,因为自带很多工具和完善的命令行。


初始化项目

App Engine SDK自带一个名为“new_project_template”的项目模板,在项目样板里面共有三个文件:
  1. app.yaml:这个文件是整个项目的配置文件,比较类似Java Web项目中的web.xml文件。
  2. main.py:这个Python脚本是App Engine的“Hello World”文件,主要是演示如何处理最基本的Web请求。
  3. index.yaml:这个文件里面设定项目所创建的数据模型的索引,要注意的是,这个文件一般由App Engine系统自动维护,当App Engine调试或者部署应用的时候,其会分析应用所包含数据模型,来确定需不需给数据添加新的索引。

我们可以通过复制这个项目模板来初始化项目,接下来,将逐步编辑和创建各个文件,其中第一个被编辑的是app.yaml。

编辑app.yaml

就像上面提到的那样,app.yaml是整个项目的核心配置文件,其后缀“yaml”表示这个文件是基于yaml语言,而yaml是可读性非常强的数据序列化语言,和XML相比,其可读性更好,而且支持丰富的数据类型。下面是例子中已经编辑好的app.yaml。
application: sample

version: 1

runtime: python
api_version: 1
handlers:

- url: /.*
  script: main.py
代码1. app,yaml

在app.yaml中主要可以配置下面这些参数:
  1. 应用名:对应的位置是“application”,其是用来设置整个项目的名字,在本地调试时,项目名可以是任意的字符串,但当部署这个项目到云端App Engine平台时,需求确保应用名和之前在App Engine管理界面上新建的应用名一致,所以这时应用名需要是全App Engine唯一的,不能与其他人创建的项目的名字有冲突。
  2. 项目版本号:对应的位置是“version”,用来配置应用的版本号,可以通过它来对应用进行版本管理。由于本例是新创建的,所以其版本号是1。
  3. 运行时:对应的位置是“runtime”,用来设定项目的开发语言,现有的项目有Python和Java两种开发语言可供选择,由于本例是使用python的,所以在此填入“python” 。
  4. API版本号:对应的位置是“api_version”,指的是使用的App Engine API的版本号,目前为1。
  5. 处理Web请求的类:对应的位置是“handlers”,这部分配置了URL和Python脚本之间对应的关系,意味着,当App Engine收到一个Web请求时,它会根据其URL来调用相应的脚本,在上面这个例子中,当URL为“/.*“的情况下,会调用main.py来处理。

创建HTML文件


下面是index.html的代码:
<html>

<head>
       <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
       <title>App Engine Demo</title>

</head>
<body>
      <form method="POST" action="/">
              文章名: <input type="text" name="title" size=30 /><br>

              关键字: <input type="text" name="tags" size=30 /><br>
              内容:  &nbsp;&nbsp;<textarea name="content" cols="30" rows="5"></textarea><br>

              <br>
              <input type="submit" name="submit" value="提交">
      </form>
</body>

</html>
代码2. index.html
这是例子对应的HTML页面,其主要由两个文本框和一个Textarea组成,来让用户输入Blog的文章名、关键字和内容,当用户输入完这三个数据之后,通过点击”提交“按钮,来将刚输入的数据Post给后台的服务器端,并由与URL”/“对应的Python脚本来进行处理,也就是上面的”main.py“

编写数据库代码

在讲解例子的数据库代码之前,先给大家介绍一下App Engine的实体模型和数据类型。

实体模型
App Engine主要数据模型被称为”实体模型“,一个实体由一个主键和一组属性组成,实体的模型是通过继承Model类来实现,而且每个属性可在多个数据类型中进行选择。
数据类型
主要的基本数据类型有字符串(String)、基于字节的字符串(ByteString)、布尔(Boolean)、整数(Integer)、浮点(Float)、日期时间(DateTime)、列表(List)、字符串列表(StringList)、文本(Text)、二进制块(Blob)和用于表示实体之间关系的参考类型(Reference)。
除了基本的数据类型之外,用户还可以通过继承Expando类来自定义一个新的数据类型。



Blog表的结构
下面这个表是关于例子中所用的Blog表的结构:
属性名 类型
title String(字符串)
tags StringList(字符串列表)
content Text(文本)
表1. Blog表的结构
Blog表共有三个字段,分别是字符串类型的title属性、字符串列表类型的tags属性和文本类型的content属性,下面是创建Blog表的blogdb.py脚本的代码。
from google.appengine.ext import db

class Blog(db.Model):

    title = db.StringProperty()
    tags = db.StringListProperty()
    content = db.TextProperty()
   def save(self, _title, _tags, _content):

        blog = Blog()

        blog.title = _title
        blog.content = _content
        if _tags:
           blog.tags = _tags.split(" ")
        else:

           blog.tags = []
        blog.put()
代码3. blogdb.py
这个脚本主要有两部分构成;其一是通过继承db.Model这个类来创建Blog这个实体模型,并声明title、tags和content这三个属性;其二是定义一个名为“save”的方法,在这个方法内,首先是创建一个新的Blog实体,之后将输入的_title、_tags和_content这三个参数插入到这个新创建的Blog实体中,并使用这个实体的put方法来在数据库中保存这个实体,其它类可以通过调用Blog类中的这个save方法来存储和Blog相关的数据。




添加Web处理方法

在这个例子中,需要添加用于处理两个Web请求的代码:其一是用于显示index.html的代码,也就是用于处理访问URL“/”的GET请求;其二是保存用户在index.html上输入的Blog数据,也就是用于处理访问URL“/”的POST请求,下面是添加上面两个逻辑之后main.py的代码:


from google.appengine.ext import webapp

from google.appengine.ext.webapp.util import run_wsgi_app

from google.appengine.ext.webapp import template
import os
import cgi
from blogdb import Blog
from google.appengine.ext import db
class Main(webapp.RequestHandler):

    def get(self):

        path = os.path.join(os.path.dirname(__file__), ‘index.html’)
        self.response.out.write(template.render(path, []))
    def post(self):
        _title = cgi.escape(self.request.get(‘title’))
        _tags = cgi.escape(self.request.get(‘tags’))

        _content = cgi.escape(self.request.get(‘content’))
        blog = Blog()
        blog.save(_title, _tags, _content)
        self.response.out.write(‘Save Successfully’)
application = webapp.WSGIApplication([('/', Main)], debug=True)

def main():

    run_wsgi_app(application)
if __name__ == "__main__":

    main()
代码4. main.py
从上到下,main.py的代码可分为三个部分:

  1. Get方法:这个方法主要通过python os模块的方法来读取index.html,并将读取好的index.html这个文件的数据通过HTTP Response流来发送给浏览器端,这样会在客户的浏览器上显示index.html。
  2. Post方法:这个方法会从输入的HTTP Request流中获取title、tags和content的输入数据,并调用Blog这个实体模型的save方面来保存,之后,将返回“Save Successfully“的消息给客户端。
  3. 注册Main类:在代码中通过初始化webapp.WSGIApplication这个类,来将Main这个类和URL”/“对应,比如,客户端发送Get请求给URL”/“,系统会调用Main类的Get的方法来处理这个请求,需要注意的是,在这里设定URL和类的对应关系是在app,yaml中的设定之后的进一步设置。
代码部分已结束,下面将介绍如何测试和部署这个项目。

测试和部署


主要有下面三步:
本地测试
通过调用SDK中dev_appserver.py脚本来启动本地的开发环境,具体命令格式为”dev_appserver.py sample“,在这里“sample”指代的是项目的名字,如果有Pydev这个插件,可以在Eclipse上启动本地开发环境的调试模式。在环境启动成功之后,可通过http://localhost:8080这个URL来测试这个项目的基本功能。
创建应用
app engine app1
图1.  My Applications


在App Engine的管理界面(https://appengine.google.com/)里面的“My Applications”上点击“Create An Application“这个按钮来进入”Create an Application“的界面。
app engine app2
图2. Create an Application
之后在”Create an Application“这个界面中,在”Applcation Identifier“这个文本框中输入应用的名字或者ID(必须是全App Engine唯一的),在”Application Title“的文本框中输入应用的全称,之后点击”Create Applcation“这个按钮在App Engine上创建这个应用。
发布应用

使用SDK中appcfg.py这个脚本将应用部署到App Engine这个平台上,具体命令格式为”appcfg.py update sample/“,在这里“sample/”代表项目所在的目录,部署之后,可以通过App Engine的管理界面来访问和管理应用。

参考资料:
  1. YAML 简介

No comments:

Post a Comment