atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
とりあえず雑記帳(跡地)
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
とりあえず雑記帳(跡地)
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
とりあえず雑記帳(跡地)
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • とりあえず雑記帳(跡地)
  • Slim3
  • Slim3でGWT

とりあえず雑記帳(跡地)

Slim3でGWT

最終更新:2011年11月15日 23:04

fujiyan

- view
管理者のみ編集可
WebコミックLibraryhttp://web-comi.appspot.com/
GAE/JとSlim3で作成してみた、各出版社から配信されているWebコミックをまとめて閲覧できるサイトです。只今、実験運用中…

Eclipse環境設定

Slim3に記載している内容と同じ

プロジェクト作成

  • 基本的に、公式サイトのGetting Started with GWTの通りに行う。だいたい以下の通り。
  1. ダウンロードしたzipを解凍する。
  2. 解凍して作成されたフォルダ"slim3-blank"を、Eclipseのワークスペースにインポートする。
  3. インポートしたプロジェクトの名前を、Refactorで変更する。
  4. プロジェクトのコンテキストメニュー→[Properties]→[Resource]の[Text file encoding]をUTF-8にして、デフォルトのファイルエンコーディングをUTF-8にする。これをしておかないと、日本語表示が面倒なことになる。
  • これによって、JavaソースファイルもUTF-8になるので注意。
  1. プロジェクトのプロパティダイアログを開き(プロジェクトのコンテキストメニュー→[Properties])、[Google]→[Web Toolkit]の[Use Google Web Toolkit]をチェックし、プロジェクトでGWTを利用するように設定する。
  2. war/WEB-INF/web.xmlのcontext-paramのslim3.rootPackage(で指定したパッケージ)に、作成するソースのルートパッケージ名を設定する。
<context-param>
  <param-name>slim3.rootPackage</param-name>
  <param-value>jp.fujiyan.gae.example.slim3.gwt</param-value>
</context-param>
  1. war/WEB-INF/web.xmlのGWTServiceServletのサーブレット定義(<servlet>要素)とサーブレットマッピング(<servlet-mapping>要素)のコメントアウトを解除し、有効にする。
<servlet>
  <servlet-name>GWTServiceServlet</servlet-name>
  <servlet-class>org.slim3.gwt.server.rpc.GWTServiceServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>GWTServiceServlet</servlet-name>
  <url-pattern>*.s3gwt</url-pattern>
</servlet-mapping>

  1. プロジェクトのプロパティダイアログを開き(プロジェクトのコンテキストメニュー→[Properties])、[Java Compiler]→[Annotation Processing]で、[Enable project specific settings]のチェックをONにし、[Enable annotation processing]のチェックもONにし、[Enable processing editor]のチェックはOFFにする。また、[Generated source directory]テキストボックスの内容を"src"とする。
  2. プロジェクトのプロパティダイアログを開き(プロジェクトのコンテキストメニュー→[Properties])、[Java Compiler]→[Annotation Processing]→[Factory Path]の[Add JARs]で、libフォルダの下にあるslim3-gen-xxx.jar(slim3-gen-1.0.2.jar)を追加する。



GWT Service作成

  • gen-gwt-serviceターゲットでServiceを自動作成する。
  1. build.xmlを開く(ダブルクリック等)。
  2. Outlineビューからgen-gwt-serviceターゲットを選択し右クリック→[Run As]→[Ant Build]を選択する
  3. [Ant Input Request]ダイアログの[Input a service name.]に、サブパッケージ名+Service名を入力すると、パッケージとServiceが作成される。
  • 以下のファイルが作成される。
    • [slim3.rootPackage].client.service.[サブパッケージ名].[サービス名]Service
    • [slim3.rootPackage].client.service.[サブパッケージ名].[サービス名]ServiceAsync
    • [slim3.rootPackage].server.service.[サブパッケージ名].[サービス名]ServiceImpl
  • これだと、Module分割した際に、[slim3.rootPackage]のサブパッケージにModuleを作った場合どうしよう?
→Moduleは基本的に[slim3.rootPackage]直下に置け、とのこと。だからサブパッケージにModuleを作る場合がナシ

Serviceにメソッドを定義する

  • メソッドint foo(String bar)を定義する場合、以下の3つを実施
    • [サービス名]Serviceに、メソッドのシグネチャを定義する。
public interface XxxService extends RemoteService {
    int foo(String bar);
}
    • [サービス名]ServiceAsyncに、メソッドのシグネチャを定義する。但し、メソッドに引数にAsyncCallback<戻り値の型>を追加する。
public interface XxxServiceAsync {
    void foo(String bar, AsyncCallback<int> callback);
}
    • [サービス名]ServiceImplに、メソッドの実装を定義する。
public class XxxServiceImpl implements XxxService {
    public String foo(String bar) {
        なんか実装
    }
}

  • サービスの引数や戻り値に用いる型は、GWTコンパイラーでJavaScriptに変換できるもの(基本データ型、java.langやjava.utilパッケージのクラス、Moduleの<source>で指定したパッケージのクラス(Serializableをimplement))しか無理っぽい。
    • 例えば、どっかのサードパーティが作ったjarファイルにあるクラスを利用しているクラスは使えないっぽい("did you forget to inherit a required module?"と言われる)
    • 筆者がハマったのは、自作の(jarファイル化した)ライブラリをextendsしたModelを戻り値にしたら駄目だった、Modelの内部でICU4Jを利用したら駄目だった等
    • じゃあModelからそういうクラスを用いなくすれば良い、というのも解決策の1つだけど、GWTの都合でModelの作りを変えるのもヤだ。
    • なので、Modelのプロパティのみを定義したDTOクラスを<source>パッケージに定義し、Serviceの引数/戻り値はそのDTOクラスにし、Serviceの実装メソッド内でDTO←→Modelの変換を行う
    • でもまぁ、ModelはGWTで利用できる程度に、極力簡単にしておくのも一案。
      • 自作ライブラリはModule jarファイル(後述)にしてしまう。
      • 自作でないライブラリを使う場合は、出来るだけサーバ側のServiceImpl内で利用する。

Serviceの呼び出し

  • Googleのサンプルを見ると、XxxServiceにSingletonとして定義し、アプリケーションからはそれを用いるようにしている。
public interface XxxService extends RemoteService {
    public static class App {

        private static final XxxServiceAsync instance = (XxxServiceAsync) GWT.create(XxxService.class);

        public static XxxServiceAsync getInstance() {
            return instance;
        }
    }
    ...
}
呼び出し側
    XxxServiceAsync service = XxxService.App.getInstance(); // クラスメンバにしておいても良い

    service.foo("引数", new AsyncCallback<String>() {

        public void onSuccess(String results) {
            // 成功時処理
        }

        public void onFailure(Throwable caught) {
            // 失敗時処理
        }

    });
  • Serviceの戻り値は、onSuccess()の引数に渡される。

Service内でSessionにアクセス

  • org.slim3.util.RequestLocatorのget()メソッドでHttpServletRequestを取得する。後は通常通りgetSession()で取得する。



GWT UiBinderとSlim3 Controllerでファイルアップロード

  • GWTのUiBinderでクライアントを作成し、Slim3のControllerでファイルを受け取り、結果(HTML)をクライアントに表示する。
  • ファイルのアップロード先にGWT Serviceは指定できない。そもそもformのsubmitじゃないとアップロードは無理。
  • GWTのFileUploadはFormPanel配下に配置する必要がある。
  • FormPanelには、encoding="multipart/form-data"とmethod="post"を指定しておく。
  • 結果の表示については、クライアントにHTML(widget)を置き、FormPanelのonSubmitCompleteイベントハンドラ内で、ControllerからのレスポンスのHTMLをHTML(widget)に設定する。

  • 以下は、アップロードしたファイル(テキスト限定)をそのまま結果表示するサンプル。

UploadForm.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
	xmlns:g="urn:import:com.google.gwt.user.client.ui">
	<ui:style>
	</ui:style>
	<g:HTMLPanel>
		<g:FormPanel ui:field="uploadFormPanel" action="upload" method="post" encoding="multipart/form-data">
			<g:VerticalPanel>
				<g:FileUpload name="data"></g:FileUpload>
				<g:SubmitButton>アップロード</g:SubmitButton>
			</g:VerticalPanel>
		</g:FormPanel>
		<g:HTML ui:field="resultHtml"/>
	</g:HTMLPanel>
</ui:UiBinder>

UploadForm.java
public class UploadForm extends Composite {

    private static UploadFormUiBinder uiBinder =
        GWT.create(UploadFormUiBinder.class);

    interface UploadFormUiBinder extends UiBinder<Widget, UploadForm> {
    }
    
    @UiField
    FormPanel uploadFormPanel;
    
    @UiField
    HTML resultHtml;
    
    public UploadForm(Map<String, String> parameterMap) {
        initWidget(uiBinder.createAndBindUi(this));
    }

    @UiHandler("uploadFormPanel")
    public void onSubmitComplete_uploadFormPanel(SubmitCompleteEvent e) {
        resultHtml.setHTML(e.getResults());
    }

UploadController.java
public class UploadController extends Controller {

    @Override
    public Navigation run() throws Exception {
        FileItem fileItem = requestScope("data");
        
        requestScope("test", new String(fileItem.getData()));
        
        return forward("upload.jsp");
    }
}

upload.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>admin Upload</title>
</head>
<body>
<p><c:out value="${test}"/></p>
</body>
</html>



「Slim3でGWT」をウィキ内検索
LINE
シェア
Tweet
とりあえず雑記帳(跡地)
記事メニュー

メニュー

  • トップページ
  • コメント
  • とりあえずインターフェース入門
  • Yesod
  • Haskell
  • Slim3
  • JavaScript
  • Google App Engine
  • Android
  • Facebook
  • GWT
  • OpenSocial
  • Struts 2
  • Subversion
  • Apache
  • JSONIC
  • Flex

  • WebコミックLibraryについて

公式サイト

  • Yesod
  • Haskell
  • Slim3
  • JavaScript - MDN
  • App Engine for Java
  • Android Developers
  • Google Web Toolkit
  • Struts
  • OpenSocial
  • OSDE

  • ToDo

ここを編集
記事メニュー2
間違いの御指摘は
コメントまでm(_ _)m

更新履歴

取得中です。


ここを編集

総数: -
本日: -
昨日: -
人気記事ランキング
  1. Slim3/環境構築とプロジェクト作成
  2. Google App Engine
  3. Google App Engine/キャッシュの計画
  4. Google App Engine/Struts2
もっと見る
最近更新されたページ
  • 4399日前

    Haskell
  • 4399日前

    Yesod
  • 4399日前

    トップページ
  • 4509日前

    メニュー
  • 4510日前

    Struts 2
  • 4536日前

    コメント
  • 4705日前

    Google App Engine
  • 4742日前

    Slim3/環境構築とプロジェクト作成
  • 4767日前

    Google App Engine/キャッシュの計画
  • 4777日前

    Slim3/文字列の部分一致検索とページング
もっと見る
人気記事ランキング
  1. Slim3/環境構築とプロジェクト作成
  2. Google App Engine
  3. Google App Engine/キャッシュの計画
  4. Google App Engine/Struts2
もっと見る
最近更新されたページ
  • 4399日前

    Haskell
  • 4399日前

    Yesod
  • 4399日前

    トップページ
  • 4509日前

    メニュー
  • 4510日前

    Struts 2
  • 4536日前

    コメント
  • 4705日前

    Google App Engine
  • 4742日前

    Slim3/環境構築とプロジェクト作成
  • 4767日前

    Google App Engine/キャッシュの計画
  • 4777日前

    Slim3/文字列の部分一致検索とページング
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. 鹿乃つの氏 周辺注意喚起@ウィキ
  2. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  3. MadTown GTA (Beta) まとめウィキ
  4. R.E.P.O. 日本語解説Wiki
  5. AviUtl2のWiki
  6. シュガードール情報まとめウィキ
  7. ソードランページ @ 非公式wiki
  8. ドラゴンボール Sparking! ZERO 攻略Wiki
  9. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  10. 星飼いの詩@ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  6. 検索してはいけない言葉 @ ウィキ
  7. オレカバトル アプリ版 @ ウィキ
  8. 発車メロディーwiki
  9. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  10. 英傑大戦wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 過去の行動&発言まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  2. マイティーストライクフリーダムガンダム - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  3. 魚拓まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  4. 参加者一覧 - ストグラ まとめ @ウィキ
  5. 1103環境(遊戯王) - アニヲタWiki(仮)
  6. 前作からの変更点 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  8. コレクター・ユイ - アニヲタWiki(仮)
  9. サーヴァント/一覧/クラス別 - Fate/Grand Order @wiki 【FGO】
  10. 画像倉庫 - 鹿乃つの氏 周辺注意喚起@ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.