论坛首页 Web前端技术论坛

GWT Object Exporter ,GWT模块间传递对象

浏览 12082 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-28  
是这样的,你在两个模块(两module,即有两个EntryPoint)都导入了GWTSession模块是吧。

如果都导入了GWTSession模块,那么在各自模块内都会创建两个GWTSession,所以里面的东西是空的。

所以只能导入一个GWTSession模块,独立于其他模块。


基于gwt object exporter,我们有个Hostpage模块,用于管理gwt object,以及页面组件,模块间事件处理,等有空了将一起发布出去。
0 请登录后投票
   发表时间:2007-11-28  
yongyuan.jiang 写道
是这样的,你在两个模块(两module,即有两个EntryPoint)都导入了GWTSession模块是吧。

如果都导入了GWTSession模块,那么在各自模块内都会创建两个GWTSession,所以里面的东西是空的。

所以只能导入一个GWTSession模块,独立于其他模块。


基于gwt object exporter,我们有个Hostpage模块,用于管理gwt object,以及页面组件,模块间事件处理,等有空了将一起发布出去。


先謝過你的回覆!

我的應用裡, 只有一個模块會创建GWTSession, 然後把GWTSession export 成jso 放在 html 中的javascript variable 中
	private static native void setGWTSession(JavaScriptObject gwtSession) /*-{
		$wnd.parent.gwtSession = gwtSession;
	}-*/;


另一個模块可以順利從html 的javascript 裡拿回GWTSession 的jso
	public static native JavaScriptObject getGwtSession() /*-{
		if ($wnd.parent.gwtSession == undefined) {
			return null;
		} else {
			return $wnd.parent.gwtSession
		}
	}-*/;


並import 成GWTSession
GWTSession gwtSession = helper.doImport(jso);


問題在於,在第一個模块put 入GWTSession 的key/value pair, 在第二個模块中拿不出黎, 全部是null

故嘗試把GWTSession 改成:
package commons.gwt.data.client;

import java.util.HashMap;

import com.macaufly.gwt.exporter.client.IExportable;

public class GWTSession extends HashMap implements IExportable {
	private Object object

	public Object getObject() {
		return object;
	}

	public void setObject(Object object) {
		this.object = object;
	}
}


第一個模块 setObject(new String("test")), 在第二個模块可以拿到"test", 是否exporter 對object 有一定要限制? 如必須為pojo, 因為我試過一個只有private constructor 的class 不能import/export.
0 请登录后投票
   发表时间:2007-11-28  
haha,原来是这样,按照你的方式,我试了一下,果然也不行,调试后,发现原因了,拿不到的原因是暂时不支持继承。

起初设计是考虑模块间接口调用,所以GWTSession继承HashMap没有做这方面处理。

不过,你可以这样实现:
public class GWTSession implements IExportable{

	HashMap map = new HashMap();
	
	public Object get(Object key) {
		return map.get(key);
	}

	public Object put(Object key, Object value) {
		return map.put(key, value);
	}

	public int size() {
		return map.size();
	}
}

之前不ok的原因是传递后的GWTSession实际上创建了新的HashMap.

ok,简单对象也是可以传递的,如下:

public class TestExportable implements EntryPoint{

	public void onModuleLoad() {
		
		exporter e = (exporter) GWT.create(exporter.class);
		
		GWTSession session = new GWTSession();
		session.put("auth", new A("auth"));
		session.put("2", new String("adf"));
		
		JavaScriptObject jso = e.export(session);
		
		GWTSession session2 = e.impor(jso);
		System.out.println(((A)session2.get("auth")).getN());

	}
	
	class A implements IExportable{
		String n;
		public A(String n2) {
			n = n2;// TODO Auto-generated constructor stub
		}
		public String getN(){
			return n;
		}
	}
	
	interface exporter extends IExporter{
		JavaScriptObject export(GWTSession session);
		GWTSession impor(JavaScriptObject jso);
	}

}

测试通过,A也要实现IExpotable.
0 请登录后投票
   发表时间:2007-11-28  
对了,我上传了新的
http://code.google.com/p/gwt-object-exporter/downloads/list

支持export内部类。

btw.
其实所以对象都能传递的,只是传递过去那个对象是否可以使用。
实现IExportable,就能将它拿来使用。

虽然能export对象出去,但是不建议复杂数据。如User能够export出去别的模块,但,假设user.getAddress是个list,list里面是个对象,暂时也没处理这个。
0 请登录后投票
   发表时间:2007-11-28  
yongyuan.jiang 写道
对了,我上传了新的
http://code.google.com/p/gwt-object-exporter/downloads/list

支持export内部类。

btw.
其实所以对象都能传递的,只是传递过去那个对象是否可以使用。
实现IExportable,就能将它拿来使用。

虽然能export对象出去,但是不建议复杂数据。如User能够export出去别的模块,但,假设user.getAddress是个list,list里面是个对象,暂时也没处理这个。


樓主的反應速度和熱心真今人感動...

剛下了最新的code

用了樓主提議的GWTSession 代碼

發現一個奇怪的問題, 我在第一個模块中, 创建GWTSession 並放入2 對 key/value, 分別是 "stringTest"/"String" 和 "objectTest"/Authentication, 在第二個模块中, 可以得知 map 的size = 2, 也可以順利取出 key為"stringTest" 的value, 但當嘗試取出"objectTest" 的value 時, GWT HostedMode 彈出異常
java.lang.ClassCastException: commons.gwt.security.client.Authentication cannot be cast to commons.gwt.security.client.Authentication


奇怪的是, 如果"stringTest"/"String" 和 "objectTest"/Authentication 2對 key/value 同樣是在第二個模块中寫入和讀出的話, 就可以順利讀取

請教一下
0 请登录后投票
   发表时间:2007-11-28  
commons.gwt.security.client.Authentication  也要继承IExportable

也是传递的对象嘛
0 请登录后投票
   发表时间:2007-11-28  
yongyuan.jiang 写道
commons.gwt.security.client.Authentication  也要继承IExportable

也是传递的对象嘛


唔, commons.gwt.security.client.Authentication 已經implements IExportable 了, 還是不行...

強調一下, ClassCastException 是當一個模块企圖去取出其他模块put 入GWTSession 的value 才會出現, 如果是自個模块put/get 是不會有問題的, 納悶...
0 请登录后投票
   发表时间:2007-11-29  
附上測試代碼, 請指教一下

內有2個widget, Outer 和Inner, Outer 內是一個frame, frame 內的Inner 的html, 測試的目的是想Outer 和Inner間可以通過GWTSession 而共用object.

但結果是, String 可以Share, 但自定的Object 就不行, 在get 出來會有 ClassCastException
[ERROR] Unable to load module entry point class myFrameTest.inner.client.Inner (see associated exception for details)
java.lang.ClassCastException: myFrameTest.commons.client.Authentication cannot be cast to myFrameTest.commons.client.Authentication
	at myFrameTest.inner.client.Inner.onModuleLoad(Inner.java:22)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:342)
	at com.google.gwt.dev.shell.BrowserWidget.attachModuleSpace(BrowserWidget.java:326)
	at com.google.gwt.dev.shell.ie.BrowserWidgetIE6.access$200(BrowserWidgetIE6.java:36)
	at com.google.gwt.dev.shell.ie.BrowserWidgetIE6$External.gwtOnLoad(BrowserWidgetIE6.java:70)
	at com.google.gwt.dev.shell.ie.BrowserWidgetIE6$External.invoke(BrowserWidgetIE6.java:125)
	at com.google.gwt.dev.shell.ie.IDispatchImpl.Invoke(IDispatchImpl.java:293)
0 请登录后投票
   发表时间:2007-11-29  
oh!

sorry.

我知道问题所在了。

你需要这样:

setSession("auth",exporter.doExport(new Authentication()));

in inner:

Authentication auth = exporter.doImport(getSession("auth"))


只能传递JavaScriptObject!
0 请登录后投票
   发表时间:2007-11-29  
呵呵,这个还是很基础的,等我把另外一个实际应用上传,包括对象间传输,事件的监听。

你先用这个了解了解也可以。呵呵
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics