`
flashcloud
  • 浏览: 188805 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

MVP For GWT 系列资料转载十一:彻底了解 GWT Part 1:JSNI

阅读更多

源文出自:https://txt.appspot.com/pt2club.blogspot.com/2010/02/gwt-part-1jsni.html

 

彻底了解 GWT Part 1:JSNI

 

原文:http://googlewebtoolkit.blogspot.com/2008/07/getting-to-really-know-gwt-part-1-jsni.html

技术校正、审阅:tkcn

[前面略过一段很口语、很难翻译、但是不太重要的一段 XD]

彻底了解 GWT,第一步:JSNI
如果你是 GWT 新手,你可能觉得奇怪:到底有什么好激动的?GWT 跟其他 framework 有什么不同?GWT 是一个基础技术、串起许多工具,而不只是特定 application 的 framework。因此,虽然 GWT「有」很多 library,觉得有用的话,要用多用少都可以。不喜欢 GWT 的 UI?你可以用 DOM 建立自己的 UI。不想用 RPC 而想要用 JSON?那也没问题。事实上,要用 GWT 重头开始打造自己的  framework 是绝对没问题的,也能保留所有 GWT debug 跟 compile 方面的优点。

所以,用一个宏观的角度来思考:为什么你要考虑使用 GWT 来开发下一个大的 web application 呢?

相较于传统 server-centric 的方式,如果 AJAX 设计得好,因为本身的特性,在许多种类的 application 上会提供更好的使用经验。你都已经在读这个 blog 了,可能早就知道啦。

GWT compiler 产生的 JavaScript 码通常会比你自己撰写的程式码还要小、还要快。

用 GWT 开发可以让你更有产能、而且产生的 JavaScript 也更加可靠。

You get the opportunity to say "Gwit" a lot.

 

我们担心你是那种容易被一些主张或是行销说词给影响了,所以我们在接下来几篇 blog 文章中,会看到 GWT 如何实现性能的提升、以及如何让 JavaScript 使用起来更容易。

 

在深入技术细节之前,还有一件事。我们有时会问两个跟 GWT 本质有关的问题:

为什么 GWT 以 Java 语言和工具为核心?

跟手写的 JavaScript 比起来,GWT 是不是比较多限制、也比较 heavyweight?

 

先回答第一个问题,请了解我们的目标跟满腔热血,是为了彻底改善网页使用者的使用者经验,这表示 GWT 产生的 JavaScript 必须有最好的效能跟可靠度。为了做到这一点,我们自然想加入一堆程式码的最佳化,并且尽可能的提早抓出 bug。这两个目标都容易在 Java 的 static type、以及既有的 Java IDE 来达成。这是为什么我们冷静地选择了 Java 技术作为 GWT 的核心。就是这样—没啥语言圣战的梗。

 

再来回答第二个问题,有些开发人员在第一次听到 GWT 时,会假设它是一个 abstraction 的「Walled Garden」,让你永远只能用 Java 写程式而不让你使用或是整合手写的 JavaScript。这实在错的很离谱......

 

GWT 中的 JavaScript Native Interface(JSNI)

你可以轻松地把手写的 JavaScript 直接嵌入 GWT 程式码当中。反正最后都会变成 JavaScript,那为什么不提供 GWT 的开发人员一个有用的方法,让他们能够混合这两个东西?这方法就叫做 JSNI 啦。它的名字跟 JNI(Java Native Interface)很像,因为他们的基本想法也一样:把一个 Java method 宣告成「native」然后用另一个语言来实做内容。在 JSNI 当中,就是用 JavaScript 来实做内容。

 

用 JavaScript 写 Java Method

JSNI 在创造功能最底层的 abstraction 是非常有用的,它很自然地使用 JavaScript、而不是 Java 语法。例如 Regular Expression 在 JavaScript 是相当简洁的,所以你可以透过 JSNI 在 GWT 程式码当中直接使用它们。假设你想把某人的名字(Ps Monkey)转过来,让姓在后面、名字在前面(Monkey, Ps)(当然,这在 I18N 当中会是一场恶梦)。你可以建立一个很简短的 JSNI method 来做到:

// Java method declaration...

native String flipName(String name) /*-{

  // ...implemented with JavaScript

  var re = /(\w+)\s(\w+)/;

  return name.replace(re, '$2, $1');

}-*/;

请注意,method 的内容整个被特殊标记「/*-」、「-*/」给包围起来,变成一段 Java 的注解。

 

在 JSNI 中呼叫 Java method

你也可以反过来,在 JavaScript 呼叫一个 Java 的 method。假设我们修改上面的例子,改成这样:

package org.example.foo;

public class Flipper {

  public native void flipName(String name) /*-{

    var re = /(\w+)\s(\w+)/;

    var s = name.replace(re, '$2, $1');

    this.@org.example.foo.Flipper::onFlip(Ljava/lang/String;)(s);

  }-*/;

 

  private void onFlip(String flippedName) {

    // do something useful with the flipped name

  }

}

 

用 JSNI 存取外部的 JavaScript 程式码

当然,你可以在 GWT module 存取任何外部的 JavaScript 程式码。举例来说,如果你的 HTML 页面看起来像这样:

<html>

  <head>

    <SCRIPT>

    function sayHello(name) {

        alert("Hello from JavaScript, " + name);

    }

    </script>    

    <-- Include the GWT module called "Spiffy" -->

    <script src="/pt2club.blogspot.com/2010/02/org.example.yourcode.Spiffy.nocache.js"></script>

  </head>

...

在 Java 程式码,您可以用 JSNI 去呼叫 JavaScript 的 sayHello() function:

// A Java method using JSNI

native void sayHelloInJava(String name) /*-{

  $wnd.sayHello(name); // $wnd is a JSNI synonym for 'window'

}-*/;

GWT compiler 把外部的 method 呼叫给内嵌进来,所以在 Java 当中呼叫 sayHelloInJava() 的效率并不会比直接在 JavaScript 当中呼叫来的差。

 

用 GWT 建立 JavaScript library

你甚至可以用 GWT 创造一个 JavaScript 可以呼叫的 library。这是一个非常棒的技巧:

package org.example.yourcode.format.client;

public class DateFormatterLib implements EntryPoint {

 

  // Expose the following method into JavaScript.

  private static String formatAsCurrency(double x) {

    return NumberFormat.getCurrencyFormat().format(x);

  }

  // Set up the JS-callable signature as a global JS function.

  private native void publish() /*-{

  $ wnd.formatAsCurrency =

    @org.example.yourcode.format.client.DateFormatterLib::formatAsCurrency(D);

}-*/;

 

  // Auto-publish the method into JS when the GWT module loads.

  public void onModuleLoad() {

    publish();

  }

}

 

接著,你可以在任何 HTML 或是 JavaScript library 当中存取这个 GWT 做出来的功能:

<html>

  <head>

  

    <-- Include the GWT module that publishes the JS API -->

    <script src="/pt2club.blogspot.com/2010/02/org.example.yourcode.FormatLib.nocache.js"></script>

 

    <-- Write some JS that uses that GWT code -->

    <SCRIPT>

    function doStuff() {

      alert(formatAsCurrency(1530281));

    }

    </script>

  </head>

...

 

Ray Cromwell(最有名的是 GWT Extreme!)在他的 GWT Exporter 淋漓尽致地采用了上述的 JavaScript 发布技术。它用 GWT compile 期的 code 产生器来自动创造所有发布出的程式码。(「compile 阶段的程式码产生器」听起来很酷吧?如果你也这样觉得,那请期待这个系列的后续文章。)

 

掺在一起作撒尿牛丸

用 JSNI,你可以用你想要的方式,自由地混和手工撰写的 JavaScript、外部的 JavaScript library、以及 Java 程式码。这就是我们说 GWT 并不是一个 abstraction 的「walled garden」,因为你可以逐步地将 GWT 融入到既有的 web application 当中。更棒的是,你可以用你喜欢的 Java debugger 来 debug 所有 Java 程式码。

 

想要了解更多的话,请看 GWT Developer Guide 的 JavaScript Native Interface。或著,让 GWT compiler 的设计师 Scott Blum 解释给你听也不错喔。

分享到:
评论

相关推荐

    GWT简介.docx

    1. **Java编程模型**:GWT使用Java作为开发语言,使得开发者可以利用强大的Java生态系统和成熟的开发工具,如IDEA、Eclipse等,进行Web应用开发。Java代码经过编译器转换为JavaScript,提供了一种高效、便捷的开发...

    GWT-JSNI.pdf

    ### GWT-JSNI 关键知识点解析 #### 一、GWT与JSNI概述 - **GWT(Google Web Toolkit)**: 是一个开源框架,用于创建高性能的客户端应用程序。GWT 支持开发者使用 Java 编写前端代码,并将其编译成浏览器可以执行的...

    GWT打包学习资料

    1. **GWT入门教程**:对于初学者,资料可能涵盖GWT的基本概念、开发环境搭建(如Eclipse插件配置)、Hello World示例、MVP(Model-View-Presenter)设计模式的介绍,以及如何创建和运行第一个GWT项目。 2. **GWT...

    gwt-maven-plugin:开始使用Maven构建GWT项目

    gwt-maven-plugin 该插件旨在通过提供两种特定的打包方式: gwt-lib和gwt-app ,使使用Maven构建GWT项目更加容易。 基本用法 将插件添加到您的POM并启用扩展: &lt; groupId&gt;net.ltgt.gwt.maven&lt;/ groupId&gt; ...

    gwt-maven-plugin:旧版GWT Maven插件

    现在,该插件被认为是legacy GWT maven plugin (又名mojo GWT maven插件),而新插件被认为是new generation GWT maven plugin (又名tbroyer GWT maven插件)。 仍然支持旧版maven插件,但强烈建议将新插件用于新...

    gwt for eclipse 3.7/3.6

    1. **Java to JavaScript编译器**:GWT的亮点在于它能够将Java代码转换为高性能的JavaScript,使得开发者可以利用Java的强大功能和丰富的库来构建Web应用,同时避免直接与JavaScript的复杂性打交道。 2. **UI构建...

    gwt-jsni:用于 GWT 项目的 JSNI 实用程序

    gwt-jsni 用于 GWT 项目的 JSNI 实用程序。 用法 将依赖项添加到您的 Maven POM: &lt; groupId&gt;com.bytebybyte.gwt&lt;/ groupId&gt; &lt; artifactId&gt;jsni &lt; version&gt;1.0.0 &lt; scope&gt;provided 和你的 .gwt.xml 文件: ...

    GWT进阶教程

    2. **GWT MVP模式**:Model-View-Presenter模式是一种常见的GWT应用架构,有助于分离视图、模型和逻辑,提升代码可维护性。 3. **GWT RAPID-UI**:GWT的Rapid-UI技术,如Cell Widgets,使开发者能快速构建动态表格...

    gwt技术介绍

    5. 可扩展性,GWT提供了JSNI(JavaScript Native Interface)允许开发者在Java代码中嵌入JavaScript代码,提供了强大的自定义和扩展能力。 GWT的四大组成部分包括: 1. Java-to-JavaScript编译器,负责将Java代码...

    GWT中文教程(入门进阶)

    1. **模块化**:了解GWT模块系统,如何创建和管理多个模块,以及如何在模块间共享代码。 2. **本地化**:学习GWT的本地化支持,包括多语言资源文件的创建和使用,以适应不同地区的用户需求。 3. **History和...

    使用 Cypal Studio for GWT 简化 Ajax 开发

    **Cypal Studio for GWT** 是一个专为 **Eclipse IDE** 设计的插件,旨在简化基于 **Google Web Toolkit (GWT)** 的 **Ajax** 应用程序的开发流程。通过使用 GWT,Java 开发人员可以利用纯 Java 语言编写富互联网...

    gwt 练习 gwt学习

    1. **GWT SDK安装与设置**:首先,你需要下载并安装GWT SDK,配置IDE(如Eclipse或IntelliJ IDEA)以支持GWT项目开发。 2. **模块化(GWT Module)**:每个GWT项目都始于一个`.gwt.xml`模块文件,它定义了项目的...

    Gwt开发文档

    4. **GWT MVP模式**: Model-View-Presenter (MVP) 是GWT推荐的架构模式,它有助于分离视图逻辑、业务逻辑和数据模型,使得代码更易于维护和测试。 5. **异步通信(GWT RPC)**: GWT提供了Remote Procedure Call (RPC)...

    《GWT揭秘》试读:运行调试项目

    总结,通过阅读《GWT揭秘》试读章节,我们可以了解到GWT项目的运行和调试方法,以及Java调试的重要性。对于GWT开发者来说,理解并掌握这些技术将极大地提升开发效率和产品质量。同时,文档“java_debug调试.doc”将...

    gwt学习资料和实例项目

    总之,这些学习资料和实例项目为初学者提供了全面了解和掌握GWT的途径。通过阅读Java和GWT应用开发的文档,可以构建理论基础;而通过实践Contact、StockWatcher和HelloMVP等示例项目,可以深入理解GWT的实战应用,...

    GWT RPC详细例子:代码加文档说明

    GWT(Google Web Toolkit)是Google推出的一款开源的JavaScript开发框架,它允许开发者使用Java语言编写Web应用程序,并自动生成优化的JavaScript代码。RPC(Remote Procedure Call)是GWT中的一个核心特性,用于...

    gwt入门-gwt从这里开始

    1. **GWT 编译器**: GWT 的核心部分是其编译器,它能够将 Java 代码转换为浏览器可执行的 JavaScript。这使得开发者可以利用 Java 的强大功能和成熟的开发工具,同时享受 JavaScript 在 web 开发中的灵活性。 2. ...

    Spring4GWT技术资料

    Spring4GWT是将Spring框架与Google Web Toolkit (GWT) 结合的一种技术,它旨在帮助开发者在GWT应用中更好地实现服务层管理和依赖注入,从而提升开发效率和代码的可维护性。以下是对Spring4GWT技术的详细说明: 1. *...

    GWT快速开发(GWT) 是一个Java软件开发框架用于开发类似于Google Maps和Gmail的AJAX应用程序。GWT的设计参考Java AWT包设计,类命名规则、接口设计、事件监听等。你可以用Java编程语言开发你的界面,然后用GWT编译器将Java类转换成适合浏览器执行的...

    - **案例1: Hello GWT程序**: - 创建一个新的GWT项目。 - 编写一个简单的界面,显示“Hello, GWT!”的消息。 - 通过GWT编译器部署并运行。 - **案例2: GWT Shop**: - 开发一个简单的在线购物网站。 - 包括商品...

    GWT

    通过阅读博文(链接已给出,但在这里无法直接访问),你可能会了解到如何解析和理解GWT的内部工作原理,以及如何利用GWT的相关工具提升开发效率。例如,可能是关于性能优化、调试工具的使用,或者是GWT与其他工具...

Global site tag (gtag.js) - Google Analytics