2011-07-20 2 views
1

私のアプリケーションの多くは、GWT-RPCを使用してservetとクライアントの間で通信します。しかし、いくつかのクラスは、GWTのではなく素晴らしいGWT-RPCオブジェクトを便乗する方法があり、私が思っていた実際のRPCサーブレットを使用せずにGWTのRPCメカニズムを使用して文字列/オブジェクトを整列/整列解除する方法

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) { 
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH 
      + "?templateInstanceId=" + templateInstanceId 
      + "&fileName=" + pageImage.getImageId() 
      + "&isBackground=false" 
      + "&cropX=" + pageImage.getCropX() 
      + "&cropY=" + pageImage.getCropY() 
      + "&cropWidth=" + pageImage.getCropWidth() 
      + "&cropHeight=" + pageImage.getCropHeight(); 
} 

...このような様々なのparamsでURLを「壊し文字列」で手動でGETリクエストを構築する必要がありますマーシャルはこれをするには?

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) { 
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH 
      + "?templateInstanceId=" + templateInstanceId 
     + "&pageImage=" + SomeGWTClass.toRpcString(pageImage) 
     ; 
} 

そして、サーブレット側で

@Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     final String templateInstanceId = req.getParameter("templateInstanceId"); 
     final String strPageImage= req.getParameter("pageImage"); 
     **final PageImage pageImage = SomeGWTClass.unmarshallString(PageImage.class,strPageImage);**  
} 

答えて

0

私はGWTのRPCは、この方法を使用することをお勧めであるかどうかではないよ...これを行います。 com.google.gwt.user.client.rpccom.google.gwt.server.rpcパッケージにあるGWTシリアライゼーションクラスはGWTの内部クラスであり、アプリケーションコードから呼び出すことはできません(汎用フレームワークを作成していて、GWTの新しいバージョンが出荷されたときにそれを調整しても構いませんが、これらのクラスのAPIに変更が加えられた可能性があります)。

GWTでこの種の汎用機能が出にくい理由は、Javaのリフレクションサポートが欠けているからです。しかし、この柔軟性を取り戻すために、JavaScriptに落とすことができます。たとえば、PageImageクラスをGWTオーバーレイタイプに変更できる場合は、new JSONObject(pageImage).toString()を使用してオブジェクトをjsonにマーシャリングできます。 XStreamのようなJSONライブラリは、この文字列をサーバ上のJavaオブジェクトに戻すことができます。

GWTオーバーレイタイプのテクニックについては、questionを参照してください。

0

基本的にこのようなことは可能ですが、実装するのは非常に難しいでしょう。サーバーの部分は非常に簡単ですが、問題はクライアント側になります。

GWTにはリフレクションがないため、FieldSerializerのようなコンパイル時に生成されます。 GWT-RPCサービスを介して渡されるクラスの場合、GWTはFieldSerializerを作成します.FieldSerializerはオブジェクトのシリアル化/逆シリアル化の方法を知っています。

この機能を使用するには、何らかのオブジェクトをシリアライズ/デシリアライズしたいカスタムジェネレータを定義し、必要なものをすべて生成するようなフレームワークを作成する必要があります。

しかし、簡単な方法もあります(しかし、それは非常に汚いハックです、私は本当にそれを使用することをお勧めしませんが誰が気に=)。 -genオプションを指定してコンパイラを実行するよりも、一部のGWT-RPCサービスにシリアル化するクラスを追加してください。すべてのFieldSerializerをディスクに書き込みます。単にアプリケーションに含めることができ、それらを使用するよりも簡単です。しかし、シリアライズされたクラスを変更するたびに、それらを再生成する必要があります。これはかなりのハックですが、デバッグの目的で数回使用しました。

あなたの選択はあなたのものです。私は個人的にはGWT-RPCのメカニズムについて忘れて、overlay-type + JSON parse/stringifyを使用することをお勧めします