📜  GWT JSNI(1)

📅  最后修改于: 2023-12-03 15:31:05.372000             🧑  作者: Mango

GWT JSNI介绍

GWT JSNI是一种在Google Web Toolkit (GWT)中使用JavaScript代码的机制。它是GWT框架中的一部分,允许开发者使用JavaScript作为Java代码的补充来实现更高级的功能。

为什么需要GWT JSNI?

GWT是一个将Java代码编译成JavaScript代码的框架,但是在一些情况下,Java代码无法满足特定的需求,例如与原生JavaScript交互或访问浏览器DOM元素等。这时,GWT JSNI就能发挥作用,提供了一种机制,让Java代码可以调用原生JavaScript代码。

使用GWT JSNI

JSNI代码需要使用@com.google.gwt.core.client.JavaScriptObject注释,并且必须位于GWT类的内部。

下面是例子,演示了如何使用JSNI方法获取浏览器的user-agent信息:

public native String getUserAgent() /*-{
    return navigator.userAgent;
}-*/;

在这个例子中,getUserAgent()方法是一个native方法。在JavaScript代码中,我们使用navigator.userAgent来获取user-agent信息,然后返回这个信息。

由于JSNI方法是原生JavaScript代码,在Java代码中使用需要小心。在使用过程中,应该严格按照GWT的规范进行操作。

JSNI语法

在GWT中,JSNI代码通常写在native方法中。JSNI提供了一些关键字和语法,使Java代码能够调用JavaScript代码。

原生JavaScript

在JSNI中,我们可以直接使用JavaScript原生代码。例如下面演示了如何获取当前页的URL:

public native String getCurrentUrl() /*-{
    return $wnd.location.href;
}-*/;

其中,$wnd就指向了浏览器的window对象。

访问Java对象

在JSNI中,Java对象也能被访问。以下是一个例子:

public class Person {
    public String name;
}

public native Person createPerson() /*-{
    return { name: "John Doe" };
}-*/;

在这个例子中,我们定义了一个Java类Person。然后在JSNI代码中,我们使用JavaScript对象字面量来创建Person对象,并设置name属性为"John Doe"。

通过JavaScript对象访问Java对象

同样的,我们也可以通过JavaScript对象来访问Java对象。以下是一个例子:

public class Person {
    public String name;
}

public void printName() {
    final Person person = new Person();
    person.name = "John Doe";
    display(person);
}

public native void display(Person person) /*-{
    alert(person.@com.example.Person::name);
}-*/;

在这个例子中,我们定义了一个Java类Person,并在printName()方法中创建了一个Person对象。接着,我们调用了display()方法,将这个对象作为参数传递给了JavaScript代码。在JavaScript代码中,我们使用Java对象的全限定名和属性名来获取属性值。

总结

GWT JSNI是一种使用原生JavaScript代码的机制,可以与Java代码结合使用,实现更强大的功能。但它仅在必要的情况下使用,因为JSNI代码是原生JavaScript代码,在使用时需要小心维护。如果使用不当,JSNI代码可能会导致安全问题、性能问题和可维护性问题。