作者PsMonkey (痞子军团团长)
看板java
标题区分 GWT 程式码的执行环境
时间Tue Apr 3 22:56:44 2012
上色、连结可点的网志版:
http://blog.dontcareabout.us/2012/03/gwt.html
=============================================
这是在劲过吕布的噗浪上遇到的问题。
起因是传给 String.split() 的 RegExp,
Java 与 JavaScript 的写法相似、但不是完全相同(参见 GWT 文件),
也就会遇到「development mode 下正确、但 compile 之後得不到预期结果」的窘况。
再者,如果 client/server 端都用 Java 写,也会扩大这个问题的麻烦度。
这时候我们需要 GWT。
(谜之声:你不就在写 GWT 了 [指])
这里是指 com.google.gwt.core.client.GWT。
这个 class 提供 isClient()、isScript()
(isProdMode() 理论上与 isScript() 等意)这两个 static method。
isScript() 是辨别程式码是以 JavaScript 的方式执行、还是以 Java 的方式执行。
在 development mode 下会回传 false,
在 compile 时才由 GWT compiler 改成回传 true。
isClient()(逻辑上)不会区分是不是 development mode,
纯粹辨别程式码是在浏览器上头执行,还是在 JVM 上头执行。
理解这种文字游戏有点麻烦,还是来写个程式比较实在。首先是 client 端的程式:
public class Foo extends Composite
public static final RpcServiceAsync rpc = GWT.create(RpcService.class);
private VerticalPanel panel = new VerticalPanel();
public Foo(){
String result = "[client] GWT.isClient() = " + GWT.isClient()
+ ", GWT.isScript() = " + GWT.isScript();
panel.add(new Label(result));
rpc.gwtMethod(new AsyncCallback<String>() {
@Override
public void onSuccess(String result) {
panel.add(new Label("[server] "+result));
}
@Override
public void onFailure(Throwable caught) {}
});
this.initWidget(panel);
}
}
而 Server 端 RpcServiceImpl 的 method 长这样:
public String gwtMethod() {
return "GWT.isClient() = "+GWT.isClient()
+ ", GWT.isScript() = "+GWT.isScript();
}
在 development mode 下,会得到:
[client] GWT.isClient() = true, GWT.isScript() = false
[server] GWT.isClient() = false, GWT.isScript() = false
实际 deploy 到 web server 上,会得到:
[client] GWT.isClient() = true, GWT.isScript() = true
[server] GWT.isClient() = false, GWT.isScript() = false
如此一来,虽然遇到了抽象渗漏的现象,
但我们还是可以藉由 GWT.sClient()、GWT.isScript()
判断是 development mode 还是 production mode、
是 client 端还是 server 端、给予对应 RegExp,来解决这个问题。
--
钱锺书:
说出来的话
http://www.psmonkey.org
比不上不说出来的话
Java 版 cookcomic 版
只影射着说不出来的话
and more......
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.25.13.121
1F:推 superlubu:忘了回来推一下,感谢版主帮忙扶助新手 :D 04/10 20:18