2. GAE/J + Slim3 のページ①

(作成中です!)
GAE+Slim3のページです。
Slim3は、Google App Engine/Java 用に最適化されているMVCフレームワークです。
http://sites.google.com/site/slim3appengine/
http://sites.google.com/site/slim3documentja/

まだちょっとしか触っていませんが、シンプルでわかりやすいイメージです。このページでちょっと紹介していきたいと思います。


2.1. 概要

Slim3の開発では作るモジュールは主に4つになります。


(1) controller
Slim3のServletがリクエストを受けて、URLに従って処理を振り分けますが、その時に呼ばれるのがこのクラスになります。
org.slim3.controller.Controllerの実装クラスを(rootパッケージ).controller の下に配置します(直接でも、さらにサブパッケージを掘ってもOKです)。
URLに従ってと書きましたが、その関係は単純で、下記のようになります。
URL:http://(ホスト)/member/list

クラス:(rootパッケージ).controller.member.ListController

基本的に、このクラスがリクエストを受け取り、(3)serviceクラスを介して、データストアと(2)modelオブジェクトをやり取りして処理を行い、結果をJSPに渡して、JSPが出力する流れになります。
実際に設計するときは、データつまりmodelを設計して、それに対するservice設計。それと平行して、画面仕様から、JSP、controllerを設計していく感じになるかと思います。


(2) model
データオブジェクトのクラスです。
(rootパッケージ).model の下に配置します(直接でも、さらにサブパッケージを掘ってもOKです)。
アノテーションをつけて定義します。
また、このクラスそれぞれに対応した、Metaクラスが必要になりますが、それは自動で生成され、
(rootパッケージ).Metaに配置されます。


(3) service
データストアへの書き込み読み取り等を行うクラスです。
(rootパッケージ).service の下に配置します(直接でも、さらにサブパッケージを掘ってもOKです)。

(4) JSP
JSPファイルです。
warの下に配置します(直接でも、さらにサブパッケージを掘ってもOKです)。
Slim3デフォルトのweb.xmlでは直接のリクエストはNGに設定されてます。


機能毎に分類してサブパッケージにして配置するのが良いみたいですね。
例) メンバー管理関係=menber、注文関係=order、商品関係=item
(PJルート)
 ┣src
 ┃ ┗(パッケージルート)
 ┃   ┣controller
 ┃   ┃ ┣member
 ┃   ┃ ┃ ┣ListController.java
 ┃   ┃ ┃ ┣CreateController.java
 ┃   ┃ ┃ ┣DeleteController.java
 ┃   ┃ ┃ ┗UpdateController.java
 ┃   ┃ ┣order
 ┃   ┃ ┃ ┣BasketListList.java
 ┃   ┃ ┃ ┣InsertBasket.java
 ┃   ┃ ┃ ・
 ┃   ┃ ┃ ・
 ┃   ┃ ┗item
 ┃   ┃   ┣List.java
 ┃   ┃   ・
 ┃   ┃   ・
 ┃   ┣meta
 ┃   ┃ ┣member
 ┃   ┃ ┃ ┗MemberMeta.java
 ┃   ┃ ┣order
 ┃   ┃ ┃ ┣BasketMeta.java
 ┃   ┃ ┃ ┗OrderMeta.java
 ┃   ┃ ┗item
 ┃   ┃   ┣CategoryMeta.java
 ┃   ┃   ┗OrderHistoryMeta.java
 ┃   ┣model
 ┃   ┃ ┣member
 ┃   ┃ ┃ ┗Member.java
 ┃   ┃ ┣order
 ┃   ┃ ┃ ┣Basket.java
 ┃   ┃ ┃ ┗Order.java
 ┃   ┃ ┗item
 ┃   ┃   ┣Category.java
 ┃   ┃   ┗Item.java
 ┃   ┗service
 ┃     ┣member
 ┃     ┃ ┗MemberService.java
 ┃     ┣order
 ┃     ┃ ┣BasketService.java
 ┃     ┃ ┗OrderService.java
 ┃     ┗item
 ┃       ┣
 ┃       ・
 ┃       ・
 ┗war
   ┣member
   ┃ ┣list.jsp
   ┃ ・
   ┃ ・
   ┣order
   ┃ ┣basketlist.jsp
   ┃ ・
   ┃ ・
   ┣item
   ┃ ┣list.jsp
   ┃ ・
   ┃ ・
   ┣image
   ┃ ┣xxx.jpg
   ┃ ・
   ┃ ・
   ┣css
   ┃ ┣common.css
   ┃ ┣member.css
   ┃ ・
   ┃ ・
   ┣WEB-INF
   ┃ ┣appengine-generated
   ┃ ┣lib
   ┃ ┣appengine-web.xml
   ┃ ┣cron.xml
   ┃ ┣queue.xml
   ┃ ┗web.xml
   ┗index.html


私の感じた特徴としては、

(1) 設定ファイルが少ない
先に書いたように、/menber/listへのリクエストをxxxx.controller.menber.ListControllerが処理する単純なルールですので、このマッピングの定義ファイルがありません(新機能でできるようになるみたいですが・・・)。
また、controllerからJSPへのフォワードは、controller内の処理だけで決定します。Controller#run()は、Navigationインスタンスを返すのですが、
return null; ←自力で出力した場合
return return forward("tree.jsp"); ← /file/tree.jspにフォワード
return redirect("tree"); ←/file/treeにリダイレクト
といった感じになります。
あと、modelはアノテーションでデータストアへ書き込む際のキーや、型等を定義しますので、これも定義ファイルがありません。設定が少ないと、処理を追うのが楽になりますね。


(2) GAE/Jでちょっとやっかいなところを吸収してくれる
multipartの時のparameter受信とか、グローバルトランザクションとか、ちょっとGAEだけだと不便なところを吸収して使いやすくしてくれます。


2.2. 環境


・slim3:slim3-blank-1.0.13.zip
slim3-blank-1.0.13.zipを落としてきてそのまま使いました。
まずは、このサイトを参考にしました。
他の環境は、1.2. を参照ください。commons-fileuploadは、slim3がやってくれるので入れていません。



0 件のコメント:

コメントを投稿