Struts2を始めよう!

41
Struts2 ををををを をを をを (shot6) http://twitter.com/shot6/

Transcript of Struts2を始めよう!

Page 1: Struts2を始めよう!

Struts2 を始めよう

大谷 晋平 (shot6)

http://twitter.com/shot6/

Page 2: Struts2を始めよう!

アジェンダ自己紹介Struts とは全体像重要なコンポーネントプラグインStruts2 のメリット・デメリットベストプラクティスリソース

Page 3: Struts2を始めよう!

自己紹介

大谷 晋平 (Shinpei Ohtani)HN : shot6 or shotISID 勤務Web 開発者 / オープンソース開発

Java/ActionScript/JavaScript/Silverlight/C#

コンタクト先ブログ :  http://d.hatena.ne.jp/shot6/Twitter : shot6Skype : shot_6

Page 4: Struts2を始めよう!

自己紹介 ( 続き )オープンソース

T2 フレームワーク近代的な Web アプリに向いたシンプルなフレーム

ワークhttp://code.google.com/p/t-2/wiki/Index

Page 5: Struts2を始めよう!

Struts とは ?

StrutsJava の Web フレームワーク

Servlet と JSP をベースにしているMVC pattern2 ベースのアーキテクチャApache Software License2http://struts.apache.org/ で開発中

Page 6: Struts2を始めよう!

Struts1 とは ?

Struts12002 年以来 Web フレームワークのデファクト

スタンダードPofEAA でいうところの Front controller pattern

ActionServlet

XML でコンポーネントを設定する開発者は Action と ActionForm, jsp を作成

Action はユーザからのリクエストを受け付けるテンプレートメソッドパターンの実装

ActionForm は DTO

Page 7: Struts2を始めよう!

Struts2 とは ?

Struts2 とはStruts1 とは全く違う !最新は 2.1.6-ga.ベースは WebWork というフレームワーク

その中でも Xwork core を使用POJO でも出来る Action を作成

ActionForm はもう作成しない. Action が兼務.基本的にはフィルタパターンとコマンドパターン

プラグインな仕組み複数のテンプレートエンジンに対応

Page 8: Struts2を始めよう!

全体像

From http://struts.apache.org/2.1.6/docs/nutshell.html

Page 9: Struts2を始めよう!

重要なコンポーネント

Struts2 では 3 つの重要なコンポーネントActionResultInterceptor

Page 10: Struts2を始めよう!

Action

ユーザのアクションを受け付けるクラスXwork2 の Action インタフェースを実装または POJO で以下のメソッドを持つように

作成String execute() なメソッド struts.xml で execute メソッドの代替を指定struts2-convention-plugin の @Action を使う

サンプルをみると、どれも Action インタフェースを継承しているけども。。。

Page 11: Struts2を始めよう!

Action( つづき )

その他 Action での注意点Jsp などからアクセスされる拡張子のデフォル

トは .action または何もなしAction はチェインして実行する事が出来るAction は xml 設定かアノテーションで指定で

きる

Page 12: Struts2を始めよう!

Action サンプル

Page 13: Struts2を始めよう!

Action 設定

Login アクション (mailreader2.Login)Login_input -> /Login.jspLogin_cancel -> Welcome アクションにリダイレクトLogin_expired -> ChangePassword アクションチェー

ンException mapping

Page 14: Struts2を始めよう!

アノテーションで Action 設定

幾つかだけ紹介すると @Result  : 画面遷移用 @Action: アクションメソッドを指定する @Actions  :複数の呼び出しを同一メソッドに指定する

Page 15: Struts2を始めよう!

Result

Xwork2 の Result インタフェースを実装Action の結果を生成する :ServletDispatcherResult(default)ServletRedirectResultStreamResultJasperReportsResult from jasper-report-pluginFreeMarkerResultChartResultand so on….

Page 16: Struts2を始めよう!

Result( 続き )

Result は以下の 2 通りの方法で設定xml

<result name="login" type="redirectAction">Login_input</result>

アノテーション@Result(name = "list", value = "listPeople.action",

type = ServletRedirectResult.class)

Page 17: Struts2を始めよう!

デフォルトの Result 設定

Page 18: Struts2を始めよう!

Interceptor

Interceptor はアクションを実行するまでのフィルタのようなもの. AOP のような感じ .XWork2 の Interceptor インタフェースを実装Struts2 拡張はこのインタセプタが中心Struts2 自身もインタセプタによって構築され

ているAOP のアラウンドインタセプタのような感じActionProxy から呼ばれて実行される

Page 19: Struts2を始めよう!

Interceptor( 続き )

Interceptor こそが Struts2 拡張そのもの .Spring との AutoWired の連携デバッグ例外ハンドリングファイルアップロードトークン生成とバリデーションセキュリティチェック

Page 20: Struts2を始めよう!

Interceptor( 続き 2)

Interceptor を使うには xml 設定アノテーション指定

Page 21: Struts2を始めよう!

Interceptor の設定

Page 22: Struts2を始めよう!

Plugins

Struts2 はプラグインが大量にある !ほとんどがインタセプタから介入するタイプいくつかは Result で描画時点での切り替え全てのプラグインは struts.xml で設定可能

Page 23: Struts2を始めよう!

Convention plugin

プラグイン例 1CoC を実現する Convention plugin

Converntion over configuration( 設定よりも規約を重視する )

Struts2 はゼロコンフィギュレーションをうたっている

ディレクトリを規約を頼りにトラバースしてコンポーネントを見つけるテクニック

Page 24: Struts2を始めよう!

Convention plugin( 続き )

Struts2 の規約詳細クラス名は XxxAction のようにするとアク

ションとみなされる .例 1 : examples.action.HogeAction

結論としては /hoge.action と解釈される“action|actions|struts|struts2” のどれかにパッケージ

名がマッチするとそこをルートとしてみなす次に、 クラス名から“ Action” を削除して、小文字

にする最後に “ .action” を最後につける -> hoge.action

Page 25: Struts2を始めよう!

Convention plugin( 続き 2)

規約例 2 : examples.action.mine.MyAction

結論としては、 /mine/my.actionExample.action パッケージをルートとみなすサブパッケージ (mine) はアクセスされる url の一

部になる結論としては : /mine/my.action

Page 26: Struts2を始めよう!

Convention plugin サンプル

Page 27: Struts2を始めよう!

Convention plugin サンプル

Page 28: Struts2を始めよう!

Convention plugin サンプル

Without it, it won’t work at my sample.

Page 29: Struts2を始めよう!

REST plugin

REST-like なリクエストを扱うプラグインRails の REST-like な規約にインスパイアConvention plugin をさらに拡張Example

examples.hoge.FooController -> /foo• 成功すると、 foo-success.jsp に遷移• 失敗すると、 foo-failed.jsp に遷移

Page 30: Struts2を始めよう!

REST の規約

Rails の REST-like な規約GET: /movies => method="index”GET: /movies/Thrillers => method="show",

id="Thrillers”GET: /movies/Thrillers;edit => method="edit",

id="Thrillers”GET: /movies/Thrillers/edit => method="edit",

id="Thrillers”GET: /movies/new => method="editNew”POST: /movies => method="create”

Page 31: Struts2を始めよう!

REST サンプル (Action)

Page 32: Struts2を始めよう!

REST サンプル (jsp)

Page 33: Struts2を始めよう!

REST サンプル (xml)

Page 34: Struts2を始めよう!

Struts1 plugin

レガシーな Struts1 コードを Struts2 で動かすAction と ActionForm を変更無しで動かすcommons-validator もサポートする

Struts2 はバリデータ部分も Xwork ベースただし、 Struts1 のタグリブはいっさい動かな

Page 35: Struts2を始めよう!

Struts1 設定サンプルStruts1Action を常にセット

実際の Action クラスを指定

Page 36: Struts2を始めよう!

Struts2 のメリット・デメリット

メリット仕組みを知っていれば拡張性は非常に高いプラグインが最初から大量に用意されており、

自製しなくてもよい場合があるJsp 以外のテンプレートエンジンと簡単に連携

jsp/freemarker/velocity

Jsp のビューコンポーネントやタグリブも豊富

Page 37: Struts2を始めよう!

Struts2 のメリット・デメリット

デメリットプログラミングモデルが混在していて一つ

じゃないので混乱の元。一つに統一すべき。保守性の低い CoC を過剰に使っている

convention プラグインはあまり良いとは言えないXWork2 ベースなので Xwork2 と Struts2 で

いったりきたりしないといけない一つに統一してしまうのが吉

設定ファイルの継承などはいらないJar ファイル内の XML ファイルは探しにくい

Page 38: Struts2を始めよう!

Struts2 のベストプラクティス

Action または ActionSupport を継承するモデルに統一

インタセプタを熟知して、拡張機能をまずは最小限に絞り込んで、徐々に足す

設定ファイルはユースケースか業務観点で小分けに分割する

Page 39: Struts2を始めよう!

Struts2 のベストプラクティス 2

Spring が使えるので出来るだけ使うまたは Guice/Seasar2/Lucy などを使うStruts.xml には画面遷移とインタセプタの指定DI コンテナの設定ファイルにコンポーネント

とスコープの管理Convention プラグインを使う場合は規約

と影響範囲を最小限に絞り込む

Page 40: Struts2を始めよう!

Struts2 リソース

Struts2 tutorialshttp://struts.apache.org/2.1.6/docs/tutorials.html

Struts2 developer guidehttp://struts.apache.org/2.1.6/docs/guides.html

Pluginshttp://struts.apache.org/2.1.6/docs/plugins.html

Page 41: Struts2を始めよう!

Thanks

Enjoy with Struts2!!