Struts2 を始めよう 大谷 晋平 (shot6) http://twitter.com/shot6/
アジェンダ 自己紹介 Struts とは 全体像 重要なコンポーネント プラグイン Struts2 のメリット・デメリット ベストプラクティス リソース
自己紹介 大谷 晋平 (Shinpei Ohtani) HN : shot6 or shot ISID 勤務 Web 開発者 / オープンソース開発 Java/ActionScript/JavaScript/Silverlight/C# コンタクト先 ブログ :  http://d.hatena.ne.jp/shot6/ Twitter  : shot6 Skype : shot_6
自己紹介 ( 続き ) オープンソース T2 フレームワーク 近代的な Web アプリに向いたシンプルなフレームワーク http://code.google.com/p/t-2/wiki/Index
Struts とは ? Struts Java の Web フレームワーク Servlet と JSP をベースにしている MVC pattern2 ベースのアーキテクチャ Apache Software License2 http://struts.apache.org/ で開発中
Struts1 とは ? Struts1 2002 年以来 Web フレームワークのデファクトスタンダード PofEAA でいうところの Front controller pattern ActionServlet XML でコンポーネントを設定する 開発者は Action と ActionForm, jsp を作成 Action はユーザからのリクエストを受け付けるテンプレートメソッドパターンの実装 ActionForm は  DTO
Struts2 とは ? Struts2 とは Struts1 とは 全く違う ! 最新は 2.1.6-ga. ベースは WebWork というフレームワーク その中でも Xwork core を使用 POJO でも出来る Action を作成 ActionForm はもう作成しない. Action が兼務. 基本的にはフィルタパターンとコマンドパターン プラグインな仕組み 複数のテンプレートエンジンに対応
全体像 From http://struts.apache.org/2.1.6/docs/nutshell.html
重要なコンポーネント Struts2 では 3 つの重要なコンポーネント Action Result Interceptor
Action ユーザのアクションを受け付けるクラス Xwork2 の Action インタフェースを実装 または POJO で以下のメソッドを持つように作成 String execute() なメソッド  struts.xml で execute メソッドの代替を指定 struts2-convention-plugin の @Action を使う サンプルをみると、どれも Action インタフェースを継承しているけども。。。
Action( つづき ) その他 Action での注意点 Jsp などからアクセスされる拡張子のデフォルトは .action または何もなし Action はチェインして実行する事が出来る Action は xml 設定かアノテーションで指定できる
Action サンプル
Action 設定 Login アクション (mailreader2.Login) Login_input -> /Login.jsp Login_cancel -> Welcome アクションにリダイレクト Login_expired -> ChangePassword アクションチェーン Exception mapping
アノテーションで Action 設定 幾つかだけ紹介すると @Result  : 画面遷移用 @Action : アクションメソッドを指定する @Actions  :複数の呼び出しを同一メソッドに指定する
Result Xwork2 の Result インタフェースを実装 Action の結果を生成する : ServletDispatcherResult(default) ServletRedirectResult StreamResult JasperReportsResult from jasper-report-plugin FreeMarkerResult ChartResult and so on….
Result( 続き ) Result は以下の 2 通りの方法で設定 xml <result name=&quot;login&quot; type=&quot;redirectAction&quot;>Login_input</result> アノテーション @Result(name = &quot;list&quot;, value = &quot;listPeople.action&quot;, type = ServletRedirectResult. class)
デフォルトの Result 設定
Interceptor Interceptor はアクションを実行するまでのフィルタのようなもの. AOP のような感じ . XWork2 の Interceptor インタフェースを実装 Struts2 拡張はこのインタセプタが中心 Struts2 自身もインタセプタによって構築されている AOP のアラウンドインタセプタのような感じ ActionProxy から呼ばれて実行される
Interceptor( 続き ) Interceptor こそが Struts2 拡張そのもの . Spring との AutoWired の連携 デバッグ 例外ハンドリング ファイルアップロード トークン生成とバリデーション セキュリティチェック
Interceptor( 続き 2) Interceptor を使うには xml 設定 アノテーション指定
Interceptor の設定
Plugins Struts2 はプラグインが大量にある ! ほとんどがインタセプタから介入するタイプ いくつかは Result で描画時点での切り替え 全てのプラグインは struts.xml で設定可能
Convention plugin プラグイン例 1 CoC を実現する Convention plugin Converntion over configuration( 設定よりも規約を重視する ) Struts2 はゼロコンフィギュレーションをうたっている ディレクトリを規約を頼りにトラバースしてコンポーネントを見つけるテクニック
Convention plugin( 続き ) Struts2 の規約詳細 クラス名は XxxAction のようにするとアクションとみなされる . 例 1 : examples.action.HogeAction 結論としては  /hoge.action と解釈される “ action|actions|struts|struts2 ” のどれかにパッケージ名がマッチするとそこをルートとしてみなす 次に 、  クラス名から“ Action” を削除して、小文字にする 最後に “ .action” を最後につける  -> hoge.action
Convention plugin( 続き 2) 規約 例 2 : examples.action.mine.MyAction 結論としては、 /mine/my.action Example.action パッケージをルートとみなす サブパッケージ  (mine) はアクセスされる url の一部になる 結論としては  : /mine/my.action
Convention plugin サンプル
Convention plugin サンプル
Convention plugin サンプル Without it, it won’t work at my sample.
REST plugin REST-like なリクエストを扱うプラグイン Rails の REST-like な規約にインスパイア Convention plugin をさらに拡張 Example examples.hoge.FooController -> /foo 成功すると、 foo-success.jsp に遷移 失敗すると、 foo-failed.jsp に遷移
REST の規約 Rails の REST-like な規約 GET: /movies => method=&quot;index” GET: /movies/Thrillers => method=&quot;show&quot;, id=&quot;Thrillers” GET: /movies/Thrillers;edit => method=&quot;edit&quot;, id=&quot;Thrillers” GET: /movies/Thrillers/edit => method=&quot;edit&quot;, id=&quot;Thrillers” GET: /movies/new => method=&quot;editNew” POST: /movies => method=&quot;create”
REST サンプル (Action)
REST サンプル (jsp)
REST サンプル (xml)
Struts1 plugin レガシーな Struts1 コードを Struts2 で動かす Action と ActionForm を変更無しで動かす commons-validator もサポートする Struts2 はバリデータ部分も Xwork ベース ただし、 Struts1 のタグリブはいっさい動かない
Struts1 設定サンプル Struts1Action を常にセット 実際の Action クラスを指定
Struts2 のメリット・デメリット メリット 仕組みを知っていれば拡張性は非常に高い プラグインが最初から大量に用意されており、自製しなくてもよい場合がある Jsp 以外のテンプレートエンジンと簡単に連携 jsp/freemarker/velocity Jsp のビューコンポーネントやタグリブも豊富
Struts2 のメリット・デメリット デメリット プログラミングモデルが混在していて一つじゃないので混乱の元。一つに統一すべき。 保守性の低い CoC を過剰に使っている convention プラグインはあまり良いとは言えない XWork2 ベースなので Xwork2 と Struts2 でいったりきたりしないといけない 一つに統一してしまうのが吉 設定ファイルの継承などはいらない Jar ファイル内の XML ファイルは探しにくい
Struts2 のベストプラクティス Action または ActionSupport を継承するモデルに統一 インタセプタを熟知して、拡張機能をまずは最小限に絞り込んで、徐々に足す 設定ファイルはユースケースか業務観点で小分けに分割する
Struts2 のベストプラクティス 2 Spring が使えるので出来るだけ使う または Guice/Seasar2/Lucy などを使う Struts.xml には画面遷移とインタセプタの指定 DI コンテナの設定ファイルにコンポーネントとスコープの管理 Convention プラグインを使う場合は規約と影響範囲を最小限に絞り込む
Struts2 リソース Struts2 tutorials http://struts.apache.org/2.1.6/docs/tutorials.html Struts2 developer guide http://struts.apache.org/2.1.6/docs/guides.html Plugins http://struts.apache.org/2.1.6/docs/plugins.html
Thanks Enjoy with Struts2!!

Struts2を始めよう!

  • 1.
    Struts2 を始めよう 大谷 晋平(shot6) http://twitter.com/shot6/
  • 2.
    アジェンダ 自己紹介 Strutsとは 全体像 重要なコンポーネント プラグイン Struts2 のメリット・デメリット ベストプラクティス リソース
  • 3.
    自己紹介 大谷 晋平 (ShinpeiOhtani) HN : shot6 or shot ISID 勤務 Web 開発者 / オープンソース開発 Java/ActionScript/JavaScript/Silverlight/C# コンタクト先 ブログ :  http://d.hatena.ne.jp/shot6/ Twitter : shot6 Skype : shot_6
  • 4.
    自己紹介 ( 続き) オープンソース T2 フレームワーク 近代的な Web アプリに向いたシンプルなフレームワーク http://code.google.com/p/t-2/wiki/Index
  • 5.
    Struts とは ?Struts Java の Web フレームワーク Servlet と JSP をベースにしている MVC pattern2 ベースのアーキテクチャ Apache Software License2 http://struts.apache.org/ で開発中
  • 6.
    Struts1 とは ?Struts1 2002 年以来 Web フレームワークのデファクトスタンダード PofEAA でいうところの Front controller pattern ActionServlet XML でコンポーネントを設定する 開発者は Action と ActionForm, jsp を作成 Action はユーザからのリクエストを受け付けるテンプレートメソッドパターンの実装 ActionForm は DTO
  • 7.
    Struts2 とは ?Struts2 とは Struts1 とは 全く違う ! 最新は 2.1.6-ga. ベースは WebWork というフレームワーク その中でも Xwork core を使用 POJO でも出来る Action を作成 ActionForm はもう作成しない. Action が兼務. 基本的にはフィルタパターンとコマンドパターン プラグインな仕組み 複数のテンプレートエンジンに対応
  • 8.
  • 9.
    重要なコンポーネント Struts2 では3 つの重要なコンポーネント Action Result Interceptor
  • 10.
    Action ユーザのアクションを受け付けるクラス Xwork2の Action インタフェースを実装 または POJO で以下のメソッドを持つように作成 String execute() なメソッド struts.xml で execute メソッドの代替を指定 struts2-convention-plugin の @Action を使う サンプルをみると、どれも Action インタフェースを継承しているけども。。。
  • 11.
    Action( つづき )その他 Action での注意点 Jsp などからアクセスされる拡張子のデフォルトは .action または何もなし Action はチェインして実行する事が出来る Action は xml 設定かアノテーションで指定できる
  • 12.
  • 13.
    Action 設定 Loginアクション (mailreader2.Login) Login_input -> /Login.jsp Login_cancel -> Welcome アクションにリダイレクト Login_expired -> ChangePassword アクションチェーン Exception mapping
  • 14.
    アノテーションで Action 設定幾つかだけ紹介すると @Result  : 画面遷移用 @Action : アクションメソッドを指定する @Actions  :複数の呼び出しを同一メソッドに指定する
  • 15.
    Result Xwork2 のResult インタフェースを実装 Action の結果を生成する : ServletDispatcherResult(default) ServletRedirectResult StreamResult JasperReportsResult from jasper-report-plugin FreeMarkerResult ChartResult and so on….
  • 16.
    Result( 続き )Result は以下の 2 通りの方法で設定 xml <result name=&quot;login&quot; type=&quot;redirectAction&quot;>Login_input</result> アノテーション @Result(name = &quot;list&quot;, value = &quot;listPeople.action&quot;, type = ServletRedirectResult. class)
  • 17.
  • 18.
    Interceptor Interceptor はアクションを実行するまでのフィルタのようなもの.AOP のような感じ . XWork2 の Interceptor インタフェースを実装 Struts2 拡張はこのインタセプタが中心 Struts2 自身もインタセプタによって構築されている AOP のアラウンドインタセプタのような感じ ActionProxy から呼ばれて実行される
  • 19.
    Interceptor( 続き )Interceptor こそが Struts2 拡張そのもの . Spring との AutoWired の連携 デバッグ 例外ハンドリング ファイルアップロード トークン生成とバリデーション セキュリティチェック
  • 20.
    Interceptor( 続き 2)Interceptor を使うには xml 設定 アノテーション指定
  • 21.
  • 22.
    Plugins Struts2 はプラグインが大量にある! ほとんどがインタセプタから介入するタイプ いくつかは Result で描画時点での切り替え 全てのプラグインは struts.xml で設定可能
  • 23.
    Convention plugin プラグイン例1 CoC を実現する Convention plugin Converntion over configuration( 設定よりも規約を重視する ) Struts2 はゼロコンフィギュレーションをうたっている ディレクトリを規約を頼りにトラバースしてコンポーネントを見つけるテクニック
  • 24.
    Convention plugin( 続き) Struts2 の規約詳細 クラス名は XxxAction のようにするとアクションとみなされる . 例 1 : examples.action.HogeAction 結論としては /hoge.action と解釈される “ action|actions|struts|struts2 ” のどれかにパッケージ名がマッチするとそこをルートとしてみなす 次に 、 クラス名から“ Action” を削除して、小文字にする 最後に “ .action” を最後につける -> hoge.action
  • 25.
    Convention plugin( 続き2) 規約 例 2 : examples.action.mine.MyAction 結論としては、 /mine/my.action Example.action パッケージをルートとみなす サブパッケージ (mine) はアクセスされる url の一部になる 結論としては : /mine/my.action
  • 26.
  • 27.
  • 28.
    Convention plugin サンプルWithout it, it won’t work at my sample.
  • 29.
    REST plugin REST-likeなリクエストを扱うプラグイン Rails の REST-like な規約にインスパイア Convention plugin をさらに拡張 Example examples.hoge.FooController -> /foo 成功すると、 foo-success.jsp に遷移 失敗すると、 foo-failed.jsp に遷移
  • 30.
    REST の規約 Railsの REST-like な規約 GET: /movies => method=&quot;index” GET: /movies/Thrillers => method=&quot;show&quot;, id=&quot;Thrillers” GET: /movies/Thrillers;edit => method=&quot;edit&quot;, id=&quot;Thrillers” GET: /movies/Thrillers/edit => method=&quot;edit&quot;, id=&quot;Thrillers” GET: /movies/new => method=&quot;editNew” POST: /movies => method=&quot;create”
  • 31.
  • 32.
  • 33.
  • 34.
    Struts1 plugin レガシーなStruts1 コードを Struts2 で動かす Action と ActionForm を変更無しで動かす commons-validator もサポートする Struts2 はバリデータ部分も Xwork ベース ただし、 Struts1 のタグリブはいっさい動かない
  • 35.
    Struts1 設定サンプル Struts1Actionを常にセット 実際の Action クラスを指定
  • 36.
    Struts2 のメリット・デメリット メリット仕組みを知っていれば拡張性は非常に高い プラグインが最初から大量に用意されており、自製しなくてもよい場合がある Jsp 以外のテンプレートエンジンと簡単に連携 jsp/freemarker/velocity Jsp のビューコンポーネントやタグリブも豊富
  • 37.
    Struts2 のメリット・デメリット デメリットプログラミングモデルが混在していて一つじゃないので混乱の元。一つに統一すべき。 保守性の低い CoC を過剰に使っている convention プラグインはあまり良いとは言えない XWork2 ベースなので Xwork2 と Struts2 でいったりきたりしないといけない 一つに統一してしまうのが吉 設定ファイルの継承などはいらない Jar ファイル内の XML ファイルは探しにくい
  • 38.
    Struts2 のベストプラクティス Actionまたは ActionSupport を継承するモデルに統一 インタセプタを熟知して、拡張機能をまずは最小限に絞り込んで、徐々に足す 設定ファイルはユースケースか業務観点で小分けに分割する
  • 39.
    Struts2 のベストプラクティス 2Spring が使えるので出来るだけ使う または Guice/Seasar2/Lucy などを使う Struts.xml には画面遷移とインタセプタの指定 DI コンテナの設定ファイルにコンポーネントとスコープの管理 Convention プラグインを使う場合は規約と影響範囲を最小限に絞り込む
  • 40.
    Struts2 リソース Struts2tutorials http://struts.apache.org/2.1.6/docs/tutorials.html Struts2 developer guide http://struts.apache.org/2.1.6/docs/guides.html Plugins http://struts.apache.org/2.1.6/docs/plugins.html
  • 41.