• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
T2@java-ja#toyama
 

T2@java-ja#toyama

on

  • 3,504 views

T2でつなごう~つなぐつながるWebフレームワークPHPからJavaへ行こうする向け機能も~

T2でつなごう~つなぐつながるWebフレームワークPHPからJavaへ行こうする向け機能も~

Statistics

Views

Total Views
3,504
Views on SlideShare
3,402
Embed Views
102

Actions

Likes
1
Downloads
4
Comments
0

3 Embeds 102

http://d.hatena.ne.jp 94
http://www.slideshare.net 7
http://k.hatena.ne.jp 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    T2@java-ja#toyama T2@java-ja#toyama Presentation Transcript

    • T2でつなごう! ~つなぐつながるWebフレームワーク PHPからJavaへ移行する人向け機能も~ 富山勉強会 2009/04/04
    • 自己紹介 名前 米林 正明 ID id:yone098 所属 株式会社Abby 代表取締役社長
    • 自己紹介 出身
    • 自己紹介 出身 富山
    • 自己紹介 好きです 富山
    • 自己紹介 カターレ富山 初勝利おめでと う!!!!!
    • 一句 富山県 雷鳥 立山 ますのすし❤
    • Agenda T2の概要 T2の仕組み T2のスタイル T2の目指す所 機能紹介 DIコンテナ非依存 今後の展開 デモ
    • T2 - The WEB Connector - T2の概要
    • Webを取り巻く環境の進化 クライアント HTML Flex3 Ajax Param XML AMF3 フレームワーク Struts Struts2 BlazeDS サーバ Action Action POJO Support
    • Webを取り巻く環境 無理なが 無理なが
    • T2とは T2とは シンプルなWebフレームワーク フィルタ指向 アノテーションベース テーマ「つなぐ・つながる」 ユーザと開発者を 実案件と楽しさを あらゆるクライアントとサーバアプリを クライアントとユーザーコードの仲介役
    • T2とは T2とは クライアント側は自由に選択可能 フォームのサブミット Ajaxリクエスト/REST Flex/AIR/Silverlightなどのリッチクライアント Webサービス 統一したプログラミングモデルの提供 クライアントがどうであっても常に同じように作れ る。作り方が変わらない 一貫したスキルセットで開発可能
    • T2とは つなぐ つながる
    • T2でつなごう! クライアント T2! サーバ
    • T2の仕組み T2の仕組み
    • T2の基本的な仕組み フィルタベースのWebフレームワーク URLとJavaオブジェクト(POJO)をマッチング アノテーションでマッチング マッチしたPOJOから適切なメソッドを選択 メソッドを実行 行き先と遷移方法を指定するNavigationインタ フェースの実装を返す T2がそれに従って遷移する テンプレートエンジンやレンダリングは任意で指定 JSP、ZPT、Mayaaなんでも可能
    • T2の基本的な仕組み リクエストURLと と リクエスト リクエスト がマッチ? POJOがマッチ? マッチした マッチしたPOJOのメソッド した の マッチ? とマッチ? 対象メソッドの 対象メソッドの実行 メソッド Navigationによる次の遷 による次 による レスポンス 移先と方法の 移先と方法の決定 ブラウザ
    • T2 - The WEB Connector - T2のスタイル
    • T2のスタイル アノテーションドリブン エントリーポイントのPOJOにアノテーション付与 エントリーポイントの分かりやすさ重視 規約とアノテーションを適切に利用 @GET サーバ @ActionPath(“/hoge”) @POST
    • T2のスタイル 基本はステートレス
    • T2のスタイル 基本はステートレス 特定のコンテナへ依存しない コンテナなくて コンテナなくて もOK
    • T2のスタイル ユーザーに介入してほしい コアはシンプルに。 エクステンションで便利機能を提供 プロジェクトごとに必要な機能を作るのも簡単 ユーザが制御可能だと自信をもって言え 制御可能だと自信をもって言 制御可能だと自信をもって る事がとても重要。 そのための徹底的なシンプルさ。
    • T2とは つなぐ つながる
    • T2 - The WEB Connector - T2の目指す所
    • T2の目指す所 マルチビューをさばける 過渡期でも使える 依存が少ない ユーザーが支配出来る・やりすぎない Webクライアントの自由度を妨げない Formサブミット リッチクライアント Ajax Webサービス
    • T2 - The WEB Connector - 機能紹介
    • T2 - The WEB Connector - リクエストとPOJOの マッピング
    • T2の基本的な仕組み リクエストURLと と リクエスト リクエスト がマッチ? POJOがマッチ? マッチした マッチしたPOJOのメソッド した の マッチ? とマッチ? 対象メソッドの 対象メソッドの実行 メソッド Navigationによる次の遷 による次 による レスポンス 移先と方法の 移先と方法の決定 ブラウザ
    • URLとPageのマッピング STEP1:@Pageでクラス特定 でクラス特定 http://yoursite.com/t2app/hello/world @Page(“/hello”) public class MyHello { …
    • T2 - The WEB Connector - リクエスト内容と アクションメソッドの マッピング
    • T2の基本的な仕組み リクエストURLと と リクエスト リクエスト がマッチ? POJOがマッチ? マッチした マッチしたPOJOのメソッド した の マッチ? とマッチ? 対象メソッドの 対象メソッドの実行 メソッド Navigationによる次の遷 による次 による レスポンス 移先と方法の 移先と方法の決定 ブラウザ
    • 基本機能 STEP2:メソッドアノテーションでメソッド特定 2 メソッドアノテーションでメソッド特定 メソッドアノテーション http://yoursite.com/t2app/hello/world @Page(“/hello”) public class MyHello { @GET @ActionPath(“/world”) public Navigation helloworld(){ …
    • メソッド特定方法 のリクエストで @GET GETのリクエストで かつ のパスの @ActionPath(“/world”) /worldのパスの場合 public Navigation helloworld(){ … 全マッチの場合、呼び出される。 マッチの場合、 される。
    • メソッドアノテーション @GET,@POST @ActionPath @ActionParam リクエストパラメータのkey key-value指定も可能 @Ajax @Amf (0.6から) @Default
    • アノテーションマッチ 複数のメソッドがマッチした場合 たくさんアノテーションがマッチした方を優先 同じ数のアノテーションがマッチした場合 先に見つかったほうを使用 マッチするのがなかった場合 @Defaultがついたメソッドを呼ぶ @Defaultつきがない場合、エラー
    • メソッド引数特定方法 引数のアノテーションを見て、適切なコン ポーネントをインジェクト @RequestParam @RequestHeader @SessionAttr @Upload @Form @Index @Var
    • メソッド引数特定方法 引数の型を見て、インジェクト HttpServletRequest, HttpServletResponse HttpSession ServletContext Cookie/Cookie[] WebContext Request, Response UploadFile ErrorInfo
    • メソッド引数特定方法 @ActionPath(“/world/{id}”) public Navigation helloworld( HttpSession session, @Var(“id”) String id, @RequestParam(“name”) String name){ …
    • T2とは つなぐ つながる
    • phpとつながる PHPでの開発 5年やってます
    • phpとつながる PHPといえば
    • phpとつながる $_GET $_POST $_SESSION $_FILES
    • phpとつながる $_GET[“arg1”] $_POST[“arg2”] $_SESSION[“name”] $_FILES[“sample”]
    • phpとつながる わかりやすい
    • phpとつながる PHPを知ってる人にJavaを教えると 「Javaはクラス名長い><」 「Javaはメソッド名長くない?><」 「HttpServletRequestとか何?><」 「$_POST[‘arg’]で取れないの><」
    • phpとつながる PHPを知ってる人にJavaを教えたら 「Javaはクラス名長い><」 「Javaはメソッド名長くない?><」 「HttpServletRequestとか何?><」 「$_POST[‘arg’]で取れないの><」 ごもっとも
    • 一句 無いのなら 作ってしまおう $_POST
    • PHPとつながる public class $_POST { public static <T> T get(String key) { T ret = null; String[] params = WebContextUtil.getRequest().getParameters(key); if (params != null && params.length == 1) { ret = (T) params[0]; } else { ret = (T) params; } return ret; } }
    • PHPとつながる 使い方 PHP : $_POST[‘arg1’] Java : $_POST.get(‘arg1’) @POST public Navigation execute() { String value = $_POST.get(“arg1quot;); …. }
    • PHPとつながる 対応クラス $_POST $_GET $_SESSION $_FILES
    • PHPとつながる 使い方 $_FILES ファイルアップロードも熱い @POST @ActionParam public Navigation upload() { UploadFile file = $_FILES.get(‘sample’); logger.debug(quot;file name: {}, size:{}quot;, file.getName(), file.getSize()); …. }
    • PHPとつながる 使い方 sampleのlikephpを参照 手軽に試す方法 t2-samplesをチェックアウト htmlを作成 対応するPageクラスで$_POST, $_FILES, $_SESSION, $_GETを実際に使ってみる
    • PHPとつながる 今後 $_ENVやvar_dump関数を提供もしくは作って ください 狙い PHPに記述が似ててすぐ動いて嬉しい $_POSTってどうなってるの? そのままソースを追う事によりJavaに興味を持 ちつつHttpServletRequestの理解 最後は自分で勉強することが大事 $_ENVを作ることにより理解も深まる
    • T2とは つなぐ つながる
    • T2 - The WEB Connector - レスポンス
    • T2の基本的な仕組み リクエストURLと と リクエスト リクエスト がマッチ? POJOがマッチ? マッチした マッチしたPOJOのメソッド した の マッチ? とマッチ? 対象メソッドの 対象メソッドの実行 メソッド Navigationによる次の遷 による次 による レスポンス 移先と方法の 移先と方法の決定 ブラウザ
    • レスポンス 戻り値として、Navigationインターフェースを 実装したクラスのインスタンスを返す Forward(フォワードする) Redirect(リダイレクトする) SimpleText(テキストデータを返す) Direct(ファイルなどを直接書き込む) Json(JSONにして返す) NoOperation(何もしない) PassThrough(次のServlet/Filterに委譲)
    • レスポンス に //JSPにForward @ActionPath(“/world/{id}”) public Navigation helloworld(){ return Forward.to(“/jsp/hoge.jsp”); } //画像ファイルを返す 画像ファイルを 画像ファイル @ActionPath(“/worldImage”) public Navigation helloworldImage(){ File image = new File(“world.png”); return Direct.from(image); }
    • レスポンス マルチビューデモ Applet->T2 JavaFX->T2
    • T2 - The WEB Connector - DIコンテナ非依存
    • DIコンテナ非依存 T2は特定のDIコンテナなどのフレーム ワークに依存しない 単体でも動作可能 主要DIコンテナとも連携可能 アダプタ機能を配布
    • DIコンテナ非依存 T2が動作するDIコンテナ Guice Spring Lucy
    • DIコンテナ非依存 今日は 今日は ひがさん きとるにか
    • DIコンテナ非依存 君 Seasar君 どこ行ってしもたんや… どこ行ってしもたんや
    • DIコンテナ非依存 T2が動作するDIコンテナ Seasar2 あるよ! あるよ! Guice Spring Lucy
    • DIコンテナ非依存 今日は 今日は ひがさん Slim3 メインやないか メインやないか
    • DIコンテナ非依存 Slim3 どこ行ってしもたんや… どこ行ってしもたんや
    • DIコンテナ非依存 T2が動作するDIコンテナ Seasar2 未検証>< 未検証>< ? Slim3? Guice Spring Lucy
    • DIコンテナ非依存 環境構築~Seasar2編~ 参照 t2-employee 構成 S2.4 + S2Dao
    • DIコンテナ非依存 作成設定ファイル~Seasar2編~ aop.dicon app.dicon dao.dicon jdbc.dicon
    • DIコンテナ非依存 web.xml~Seasar2編~ <filter> <filter-name>t2</filter-name> <filter-class>org.t2framework.filter.T2Filter </filter-class> <init-param> <param-name>t2.rootpackage</param-name> <param-value>examples.employee.page</param-value> </init-param> <init-param> <param-name>t2.container.adapter</param-name> <param-value>org.t2framework.plugins.container.Seasar2Adapter</param-value> </init-param> <init-param> <param-name>t2.eagerload</param-name> <param-value>true</param-value> </init-param> </filter>
    • DIコンテナ非依存 Pageクラス~Seasar2編~ @RequestScope @Page(quot;loginquot;) public class LoginPage
    • DIコンテナ非依存 PageクラスDI~Seasar2編~ protected FooService fooService; @Binding(bindingType = BindingType.MUST) public void setFooService(FooService fooService) { this.fooService = fooService; }
    • DIコンテナ非依存 環境構築~Guice編~ 参照 t2-guice 構成 Guice + JPA
    • DIコンテナ非依存 作成設定ファイル~Guice編~ persistence.xml ※Guice用のモジュール(Java で)
    • DIコンテナ非依存 web.xml~Guice編~ <filter> <filter-name>t2</filter-name> <filter-class>org.t2framework.t2.filter.T2Filter</filter-class> <init-param> <param-name>t2.rootpackage</param-name> <param-value>org.t2framework.samples.guice.page</param-value> </init-param> <init-param> <param-name>t2.container.adapter</param-name> <param-value>org.t2framework.t2.adapter.GuiceAdapter</param-value> </init-param> <init-param> <param-name>t2.exclude-resources</param-name> <param-value>css, js</param-value> </init-param> </filter>
    • DIコンテナ非依存 Pageクラス~Guice編~ @RequestScoped @Page(quot;addquot;) public class AddPage
    • DIコンテナ非依存 PageクラスDI~Guice編~ @Inject private CalcService calcService; @Inject @RequestParameters Map<String, String[]> params;
    • DIコンテナ非依存 環境構築~Spring編~ 参照 t2-spring 構成 Spring2.5 + iBatis
    • DIコンテナ非依存 作成設定ファイル~Spring編~ applicationContext.xml dao-ibatis.xml sql-map-config.xml XxxSqlMap.xml
    • DIコンテナ非依存 web.xml~Spring編~ <filter> <filter-name>t2</filter-name> <filter-class>org.t2framework.t2.filter.T2Filter</filter-class> <init-param> <param-name>t2.rootpackage</param-name> <param-value>org.t2framework.samples.spring.page</param-value> </init-param> <init-param> <param-name>t2.config</param-name> <param-value>applicationContext.xml</param-value> </init-param> <init-param> <param-name>t2.container.adapter</param-name> <param-value>org.t2framework.t2.adapter.SpringAdapter</param-value> </init-param> <init-param> <param-name>t2.eagerload</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>t2.exclude-resources</param-name> <param-value>css, js</param-value> </init-param> </filter>
    • DIコンテナ非依存 Pageクラス~Spring編~ @Component @Page(quot;addquot;) public class AddPage
    • DIコンテナ非依存 PageクラスDI~Spring編~ private CalcService calcService; @Autowired(required=true) public void setCalcService( CalcService calcService) { this.calcService = calcService; }
    • DIコンテナ非依存 動作確認アプリケーションサーバ Tomcat5x/6x JBoss4x/5x Jetty6x WebLogic10x その他いろいろ… Yonexで確認
    • T2 - The WEB Connector - T2の拡張性
    • 拡張性の高さ ユーザが制御可能=拡張性が高い メインフローの順序・実装 ActionFilter 例外ハンドリング部分 ExceptionHandler プラグイン機能による機能追加 Pluginによって処理を差し込める
    • T2 - The WEB Connector - 今後の展望
    • 今後の展望 バージョン0.6 Flex3対応 どのフレームワークよりも簡単に Flex/AIRと通信できる AMF3の実装 バージョン0.7 Atom、RSS、Webサービス対応
    • T2プロジェクトについて T2プロジェクトとは Apacheライセンスのプロジェクト Javaだけに限っていない 本当に現場で使えるものを作る 自分達が実際に使い、コミュニティに還元し、 洗練させていく ユーザを大事にし、継続してお互い成長する 楽しく開発・コミュニケーション!
    • 色々なプロダクト Commons 共通ユーティリティフレームワーク Commons-ext JTAトランザクション実装、DataSet API Lucy ライトウェイトDIコンテナ AOP機能 Daisy(開発中) 2waySQLフレームワーク 薄いJDBCラッパー
    • その他プロダクト Yonex(仮) Hyper Integration Test Suite レポーティング とかも 提供したい!
    • プロジェクトリソース サイト http://code.google.com/p/t-2/ リリースアーカイブ、ドキュメント、ソース コード メーリングリスト T2-users http://groups.google.com/group/t2-users 開発の話、仕様の話、なんでもOK。
    • T2 - The WEB Connector - まとめ
    • まとめ T2はマルチビュー対応なシンプルWebフ レームワーク あらゆるクライアントをつなぎます! が まだまだ発展途上。ご意見ください!
    • T2 - The WEB Connector - エンドロール
    • T2 - The WEB Connector - 出演
    • T2 - The WEB Connector - テツ
    • T2 - The WEB Connector - テツ
    • T2 - The WEB Connector - テツ
    • T2 - The WEB Connector - イーダ
    • T2 - The WEB Connector -
    • T2 - The WEB Connector - イーダ
    • T2 - The WEB Connector - イーダ
    • T2 - The WEB Connector -
    • T2 - The WEB Connector - イーダ
    • T2 - The WEB Connector - イーダ
    • T2 - The WEB Connector - イーダ
    • T2 - The WEB Connector -
    • T2 - The WEB Connector - イーダ
    • T2 - The WEB Connector - designed by カネウチカズコ
    • T2 - The WEB Connector - コミッタ
    • T2 - The WEB Connector - 片山 暁雄
    • T2 - The WEB Connector -
    • T2 - The WEB Connector - 米林 正明
    • T2 - The WEB Connector -
    • T2 - The WEB Connector - 横田 健彦
    • T2 - The WEB Connector -
    • T2 - The WEB Connector - 大谷 晋平
    • T2 - The WEB Connector -
    • 一句 おらっちゃ 富山人 富山、北陸 盛り上げよう (※字余り)
    • T2 - The WEB Connector - 御静聴ありがとうございました