14

我正在尝试在我的 Google App Engine 应用程序中实现 AJAX,因此我正在寻找一个可以帮助我的优秀 AJAX 框架。有人有什么想法吗?

我正在考虑 Google Web Toolkit,它在为 Google App Engine 创建 AJAX 方面有多好?

4

11 回答 11

12

由于 Google Web Toolkit 是 Java 的一个子集,因此在后端使用 Java 时效果最好。由于 Google App Engine 目前只有 Python,我认为您必须做很多事情才能让您的服务器和客户端能够很好地相互通信。

jQuery 似乎是DjangoSnippets.com 的 AJAX 标记中最流行的 JavaScript 库选项。

编辑:以上仅适用于用 Python 编写的 Google App Engine 应用程序。由于 Google App Engine 现在支持 Java,GWT 现在可能是编写 AJAX 前端的不错选择。 谷歌甚至有一个教程向你展示如何做到这一点。

于 2008-09-10T13:14:54.653 回答
7

使用 AJAX 库的一个好方法是利用Google 的 AJAX 库 API 服务。这比下载 JS 并将其放在您的/static/文件夹中并且不会占用您的磁盘配额更快和更清洁。

在您的 javascript 中,您只需输入,例如:

google.load("jquery", "1.3.2");

和/或

google.load(google.load("dojo", "1.3.0");

在你的标题中的某个地方,你会放一些类似的东西:

<script src="http://www.google.com/jsapi?key=your-key-here"></script>

这就是使用 Google 的 API 库所需的全部内容。

于 2009-04-28T22:08:08.883 回答
4

没有理由不将 GAE 和 Google Web Toolkit (GWT) 一起使用。你用 Python 编写后端代码,用 Java(可能还有一些 JavaScript)编写前端代码,然后将其编译为 JavaScript。当使用另一个 AJAX 框架时,服务器端和客户端语言之间也会存在这种差异。

GWT 具有使远程调用服务器上的 java 代码更容易的特性,但这些特性完全是可选的。您可以只使用 JSON 或 XML 接口,就像使用其他 AJAX 框架一样。

GWT 1.5 还带有 JavaScript 覆盖类型,基本上允许您在开发客户端代码时将一段 JSON 数据视为 Java 对象。您可以在此处阅读有关此内容的更多信息。

更新:

现在 Google 已经为 Google App Engine 添加了 Java 支持,如果您愿意,您可以在完整的 Google 堆栈上使用 Java 开发后端和前端代码。Google 提供了一个不错的Eclipse 插件,可以非常轻松地开发和部署使用 GAE、GWT 或两者兼有的应用程序。

于 2008-09-10T19:00:38.550 回答
4

以下是我们在 Google App Engine 上实现 Ajax 的方式,但这个想法可以推广到其他平台。

我们有一个用于 Ajax 请求的处理程序脚本,该脚本主要使用 JSON 响应进行响应。结构看起来像这样(这是标准 GAE 处理程序脚本的摘录):

def Get(self, user):
    self.handleRequest()

def Post(self, user):
    self.handleRequest()


def handleRequest(self):        
    '''
    A dictionary that maps an operation name to a command.
    aka: a dispatcher map.
    '''
    operationMap = {'getfriends':               [GetFriendsCommand],
                    'requestfriend':            [RequestFriendCommand, [self.request.get('id')]],
                    'confirmfriend':            [ConfirmFriendCommand, [self.request.get('id')]],
                    'ignorefriendrequest':      [IgnoreFriendRequestCommand, [self.request.get('id')]],
                    'deletefriend':             [DeleteFriendCommand, [self.request.get('id')]]}

    # Delegate the request to the matching command class here.

这些命令是命令模式的简单实现:

class Command():
    """ A simple command pattern.
    """
    _valid = False
    def validate(self):
        """ Validates input. Sanitize user input here.
        """
        self._valid = True

    def _do_execute(self):
        """ Executes the command. 
            Override this in subclasses.
        """
        pass

    @property
    def valid(self):
        return self._valid

    def execute(self):
        """ Override _do_execute rather than this.
        """ 
        try:
            self.validate()
        except:
            raise
        return self._do_execute()

    # Make it easy to invoke commands:
    # So command() is equivalent to command.execute()
    __call__ = execute

在客户端,我们创建了一个 Ajax 委托。Prototype.js 使这很容易编写和理解。这是一段摘录:

/** 
 * Ajax API
 *
 * You should create a new instance for every call.
 */
var AjaxAPI = Class.create({
    /* Service URL */
    url: HOME_PATH+"ajax/",

    /* Function to call on results */
    resultCallback: null,

    /* Function to call on faults. Implementation not shown */
    faultCallback: null,

    /* Constructor/Initializer */
    initialize: function(resultCallback, faultCallback){
        this.resultCallback = resultCallback;
        this.faultCallback = faultCallback;
    },

    requestFriend: function(friendId){
        return new Ajax.Request(this.url + '?op=requestFriend', 
        {method: 'post',
         parameters: {'id': friendId},
         onComplete: this.resultCallback
        });     
    },

    getFriends: function(){
        return new Ajax.Request(this.url + '?op=getfriends', 
        {method: 'get',
         onComplete: this.resultCallback
        });    
    }

});

要调用代表,您可以执行以下操作:

new AjaxApi(resultHandlerFunction, faultHandlerFunction).getFriends()

我希望这有帮助!

于 2009-03-03T04:56:35.883 回答
3

我建议为您的客户端代码研究一个纯 javascript 框架(可能是 Jquery),并在 python 中编写 JSON 服务——这似乎是最简单/最好的方法。

Google Web Toolkit 允许您用 Java 编写 UI 并将其编译为 javascript。正如 Dave 所说,后端使用 Java 可能是一个更好的选择,因为它有很好的 RPC 挂钩。

于 2008-09-10T13:19:51.037 回答
2

您可能想看看睡衣 ( http://pyjs.org/ ),它是“GWT for Python”。

于 2008-12-09T08:33:51.493 回答
2

也尝试GQuery 的 GWT。这是Java代码:

public void onModuleLoad() { 
    $("div").css("color", "red").click(new Function() { 
        public void f(Element e) { 
            Window.alert("Hello"); 
            $(e).as(Effects).fadeOut(); 
        } 
    }); 
} 

作为 Java 代码导致编译时(Java->JavaScript)优化和重构更容易。

不错,不是吗?

于 2009-06-15T08:12:29.473 回答
1

jQuery 是一个很好的库,还可以查看Prototype JavaScript 框架。它确实将 JavaScript 从一种偶尔尴尬的语言变成了一种美丽而优雅的语言。

于 2008-09-10T13:29:54.383 回答
0

如果您希望能够调用从 JavaScript 到 Python 的方法调用,JSON-RPC可以很好地与 Google App Engine 配合使用。有关详细信息,请参阅 Google 的文章“使用 AJAX 启用客户端 RPC 请求”。

于 2008-09-15T13:43:08.913 回答
0

我目前正在为我的 GAE 应用程序使用 JQuery,它对我来说效果很好。我有一个动态图表(谷歌图表),它使用 Ajax 调用来获取 JSON 字符串。它对我来说似乎真的很好用。

于 2008-10-23T16:41:43.040 回答
0

Google 最近发布了 Google App Engine 的 Java 版本。此版本还提供了一个 Eclipse 插件,可以更轻松地使用 GWT 开发 GAE 应用程序。

在此处查看详细信息:http ://code.google.com/appengine/docs/java/overview.html

当然,这需要你用 Java 而不是 python 重写你的应用程序,但是作为一个使用过 GWT 的人,让我告诉你,在你的 AJAX 代码库上使用现代 IDE 的优势是完全值得的。

于 2009-04-28T22:17:55.163 回答