精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-11-28
是这样的,你在两个模块(两module,即有两个EntryPoint)都导入了GWTSession模块是吧。
如果都导入了GWTSession模块,那么在各自模块内都会创建两个GWTSession,所以里面的东西是空的。 所以只能导入一个GWTSession模块,独立于其他模块。 基于gwt object exporter,我们有个Hostpage模块,用于管理gwt object,以及页面组件,模块间事件处理,等有空了将一起发布出去。 |
|
返回顶楼 | |
发表时间: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. |
|
返回顶楼 | |
发表时间: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. |
|
返回顶楼 | |
发表时间:2007-11-28
对了,我上传了新的
http://code.google.com/p/gwt-object-exporter/downloads/list 支持export内部类。 btw. 其实所以对象都能传递的,只是传递过去那个对象是否可以使用。 实现IExportable,就能将它拿来使用。 虽然能export对象出去,但是不建议复杂数据。如User能够export出去别的模块,但,假设user.getAddress是个list,list里面是个对象,暂时也没处理这个。 |
|
返回顶楼 | |
发表时间: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 同樣是在第二個模块中寫入和讀出的話, 就可以順利讀取 請教一下 |
|
返回顶楼 | |
发表时间:2007-11-28
commons.gwt.security.client.Authentication 也要继承IExportable
也是传递的对象嘛 |
|
返回顶楼 | |
发表时间:2007-11-28
yongyuan.jiang 写道 commons.gwt.security.client.Authentication 也要继承IExportable
也是传递的对象嘛 唔, commons.gwt.security.client.Authentication 已經implements IExportable 了, 還是不行... 強調一下, ClassCastException 是當一個模块企圖去取出其他模块put 入GWTSession 的value 才會出現, 如果是自個模块put/get 是不會有問題的, 納悶... |
|
返回顶楼 | |
发表时间: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) |
|
返回顶楼 | |
发表时间:2007-11-29
oh!
sorry. 我知道问题所在了。 你需要这样: setSession("auth",exporter.doExport(new Authentication())); in inner: Authentication auth = exporter.doImport(getSession("auth")) 只能传递JavaScriptObject! |
|
返回顶楼 | |
发表时间:2007-11-29
呵呵,这个还是很基础的,等我把另外一个实际应用上传,包括对象间传输,事件的监听。
你先用这个了解了解也可以。呵呵 |
|
返回顶楼 | |