使用GWT已经半年了,查了很多资料,但发现国内关注它的人很少,而且骂声也不少(当然GWT也有让我恶心的地方),所以就把平时实验的结果和感想,在这里和大家分享一下。



GWT困扰我的一个最恶心的缺点,就是凡事要编译。系统一大,模块之间依赖很强,修改一个客户端(界面)的小功能,就要重编译整个项目,费时费劲,我们项目现在重编一次已经需要800多秒了——好在有Development mode(感叹这个东东的强大)。


之前看到过GWT提供JSNI的功能,能够使gwt 的java code与纯JavaScript互通信,因此打算尝试使用JSNI作为中介,看看能不能减轻模块间的依赖——或者实现多模块之间实现分模块编译。



想法是这样的,大部分模块基本是不变的,希望不要经常编译,假设其为Dll1;有些为客户开发的模块Dll2,它依赖于Dll1,而且经常发生变化(需求总是变化的)。希望修改了Dll2后,不重新编译Dll1。

Dll1和Dll2只是一个命名,并不是真正的dll啊!




如果按照GWT的依赖实现,Dll2中的gwt.xml中,声明inherit name="demo1.Dll1"后,重编Dll2其实就包含重编Dll1


使用JSNI,见http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html


将Dll1的接口,使用$entry方法,发布成为标准的javascript;Dll2不直接依赖Dll1,使用JSNI,调用Dll1发布成为javascript的接口。


Dll1中,用GWT的java实现了3个方法

package demo1.client;
import java.util.Date;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.extjs.gxt.ui.client.js.JsonConverter;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.TabPanel;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.google.gwt.dom.client.Element;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.RootPanel;
public class DllImpl {
    
public static void method1(String value) {
        Window.alert(value);
    }
    
public static String methodJson() {
        BaseModel result 
= new BaseModel();
        result.set(
"int"1);
        result.set(
"double"new Double(1.2));
        result.set(
"string""str");
        result.set(
"date"new Date());
        result.set(
"boolean"true);
        JSONObject obj 
= JsonConverter.encode(result.getProperties());
        String str 
= obj.toString();
        
return str;
    }
    
public static Element methodJS() {
        TabPanel p 
= new TabPanel();
        TabItem item 
= new TabItem();
        item.setClosable(
true);
        item.setText(
"dll 1");
        item.setLayout(
new FitLayout());
        p.add(item);
        RootPanel.get(
"cross").add(p);
        
return item.getElement();
    }
    
public static native void exportStaticMethod() /*-{
        $wnd.method1 =
        $entry(@demo1.client.DllImpl::method1(Ljava/lang/String;));
        $wnd.methodJson =
        $entry(@demo1.client.DllImpl::methodJson());
        $wnd.methodJS =
        $entry(@demo1.client.DllImpl::methodJS());
    }-
*/;
}

相关文章:

  • 2022-12-23
  • 2021-04-29
  • 2021-07-30
  • 2021-08-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-21
猜你喜欢
  • 2021-09-27
  • 2022-12-23
  • 2022-12-23
  • 2021-11-11
  • 2022-12-23
  • 2021-11-25
  • 2022-12-23
相关资源
相似解决方案