Comments
Description
Transcript
フレームワーク 1 ISE. Web インフラストラクチャー
02. フレームワーク設計 フレームワーク ISE. Webインフラストラクチャー Webインフラストラクチャー 清水 宣行 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 1 02. フレームワーク Disclaimer この資料は日本アイ・ビー・エム株式会社ならびに 日本アイ・ビー・エム システムズ・エンジニアリング株式会社の正式 なレビューを受けておりません。 当資料は、資料内で説明されている製品の仕様を保証するもので はありません。 資料の内容には正確を期するよう注意しておりますが、この資料の 内容は2009年12月現在の情報であり、製品の新しいリリース、 PTFなどによって動作、仕様が変わる可能性があるのでご注意下さ い。 今後国内で提供されるリリース情報は、対応する発表レターなどで ご確認ください。 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 2 OSSや他社製品の使用を推奨している訳ではありません。また、弊社が提供しているフレームワー クとしてWACs (Web application components)がございますが、本セッションの主な対象としておりま せんので、ご了承下さい。 ・WACs 日本IBMが開発・保守を行っているWACs (Web application components)というJava言語によるシス テム構築に必要な機能と支援ツールが統合されたアプリケーション基盤を提供しています。 Point.1:お客様の業務をシステム化する上で十分なシステム基盤機能を提供 Point.2:各種定型ロジックを自動生成するツールと豊富なガイド類 Point.3:研修サービス、オンサイトまたはリモート・サポート・サービスの提供 Point.4:標準技術をベースとしたコンポーネント構成と開発環境(JSF/Struts/Eclipse etc.) Point.5:フレームワークの拡張方式を標準化(コンポーネントの再利用が可能) (IBM社内情報) Notes://D19DBR12/49256F64003015EA//0B23D0D2E07C782E49257561003E8CC3 2 02. フレームワーク 目次 1.フレームワークとは 2.フレームワークの選定 3.Java EE 6 4.まとめ 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 3 3 02. フレームワーク 本セッションの位置付け クライアント層 プレゼンテーション層 ビジネス層 インテグレーション層 02.フレームワーク 02.フレームワーク 03.プレゼンテーション層 03.プレゼンテーション層 設計 設計 (Ajax/Dojo) (Ajax/Dojo) Resource Tier Integration Tier Business Tier Presentation Tier Client Tier 01.Webアプリケーション設計概要 01.Webアプリケーション設計概要 リソース層 04.Webサービス設計 04.Webサービス設計 05.非同期処理&キャッシング設計 05.非同期処理&キャッシング設計 06.データ・アクセス設計 06.データ・アクセス設計 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 4 4 02. フレームワーク 1.フレームワークとは 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 5 5 02. フレームワーク フレームワークとは 汎用的な機能をまとめて提供し、アプリケーションの土台として機能するソフトウェ アのこと。独自に必要とされる部分だけを開発すれば済むため開発効率の向上が見込 まれる。 汎用的に適用できるプログラムの設計モデルや典型的な処理パターンなどを含めてフ レームワークと呼ぶ場合もある。 (by IT用語辞典 e-Words) フレームワークを採用したWebアプリケーションの開発 アーキテクチャーを考慮したアプリケーション設計が容易 明確なレイヤー化 J2EEデザインパターンの適用 メリット z z レイヤー間の依存性を排除 開発方式を規定 コーディング量の減少 z 開発生産性の向上と品質の統一 保守性の向上 実装すべき骨組みを提供 デメリット 学習コスト 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop Developer 人材不足 スキル不足 Customer 高機能 短納期 仕様が 決まらない 仕様変更 が多い 6 開発現場の現状を考えて見ますと、開発メンバー側では人材不足やスキル不足等の課題がありま す。人的リソースを広範囲に求めて人材を確保するとか、様々なツールを駆使して効率を上げるな どの取り組みがありますが、プロジェクトには予算があり、予算が足りないため十分に実施できないと いうケースもあるかと思います。また、ユーザー側では高機能・短納期の要望、仕様が決まらない、 仕様変更が多い等の課題があります。 そこで、Webアプリケーションをフレームワークを採用して開発することで、アーキテクチャーを考慮 したアプリケーション設計が容易になり、開発生産性の向上と品質の統一を実現でき、この課題をあ る程度解決することができます。 プレゼンテーション層、ビジネス層、インテグレーション層にレイヤーが分離することで、アプリケー ションを構成する機能単位で設計/実装することができます。また、 Service to Worker、Factory Method、Singletonなどと言ったレイヤー毎に適したGoFのJ2EEデザインパターンを適用することで 効率的に設計することができます。 <補足> レイヤーパターン レイヤーで構造を考え、実現する考え方を「レイヤーパターン」と呼びます。このパターンの典型的な 例が、OSI参照モデルになります。JDBCも、JDBCドライバーとJDBCドライバーマネージャーとアプリ ケーションにレイヤーが分かれています。 6 02. フレームワーク MVCモデル、レイヤーとの関係 プレゼンテーション層 ビジネス層 インテグレーション層 コントローラー(C) Servlet モデル(M) MVC ・リクエスト処理の受付 ・ビジネス層への受け渡し システム固有な処理 O/Rマッピング モデル(M) データベースアクセス専門 ・DBへのアクセス処理 データベース JavaBean ビュー(V) JSF JSP DI/AOP ・インスタンス管理、接続プール、参照の注入、トランザクション制御 EJB 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 7 MVCモデルは、1970年代に登場したオブジェクト指向プログラミング言語であるSmalltalkでGUIア プリケーションを作成するために考案された考え方です。モデル(Model)、ビュー(View)、コントロー ラー(Controller)の3つのオブジェクトを定義し、連携することで目的の機能を実現します。MVC Model2は、Webアプリケーション開発において、ビューをJSP、コントローラーをServlet、モデルを JavaBeanで実装し、レイヤーパターンを取り入れています。これにより、モデルを複数のビューやコン トローラーで再利用することができ、.NETやJavaと言った異なるプラットフォームのアプリケーションか らモデルを共有して使うという考え方にまで発展させることができます。このアプローチはCORBA (Common Object Broker Architecture)であり、CORBAの概念をJava EEの世界で実現しようとしたア プローチがEJBです。デメリットとしては、ビューとコントローラー間が蜜結合となってしまうことや、モ デルの変更の影響をビューやコントローラーが受けてしまう可能性があることが挙げられます。この デメリットを解決するため、ビジネス層とインテグレーション層の2層にまたがっているモデル部分を分 離し、各層毎に専用のクラスを用意して4つのオブジェクトが連携して処理が行われるようにします。 これにより、各オブジェクトの責務がよりはっきりし、実装やテストを分業して実施することができます。 •MVCフレームワーク アプリケーションを、アプリケーション・データとそのデータへのアクセス制御を行うビジネス処理 (Model)、表示・入出力処理(View)、制御処理(Controller)の3つに分けたMVCモデルに従ったフ レームワークで、各処理の独立性と高い保守性を確保します。これは、クライアントからのリクエスト受 付や、ビジネス・ロジックの振り分けを行うプレゼンテーション層に位置付けられます。 •O/Rマッピング・フレームワーク Javaオブジェクトとリレーショナルデータベースのレコードをマッピングすることで、オブジェクトの データ取得やデータの永続化にかかわるプログラミング作業を軽減するためのフレームワークです。 これは、JDBCやJMSといった外部リソース・システムとの通信を管理する層であるインテグレーション 層に位置付けられます。 •DI/AOPフレームワーク コンポーネント間の結合度を下げ保守性・再利用性を高めるためのDIと、複数コンポーネントに含ま れる共通処理を分離して保守性を高めるAOPを組み合わせたフレームワークです。これは通常、 J2EE/Java EEの各層をまたぐ基盤技術として利用されます。 7 02. フレームワーク 2.フレームワークの選定 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 8 フレームワークの歴史を振り返えるとともにフレームワークが提供している機能を確認し、Java EE 5 および2~3年後を見据えた今後のフレームワークの選定指針をご説明します。 8 02. フレームワーク フレームワークの歴史 フルスタック化 キーワード Javaバッチ DI/AOP MVC Model2 の確立 EoD Web2.0 2000 2001 2002 2003 2004 2005 2006 2007 J2EE Struts 2008 2009 Ease of Development ・シンプルでコアなクラスで作成 - POJO ・ルールを別な技術で補完 - DI/AOP、アノテーション 軽量コンテナ Java EE 5 フレームワーク進化 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 9 「J2EE」は、J2EEそのものがエンタープライズ・システムの基盤を支えるフレームワークとして登場し ました。アプリケーションをコンポーネント化して再利用するための枠組みが提供され、EJBによる ポータビリティ、スケーラビリティを実現しました。 続いて、J2EEを補完するフレームワークとして「Struts」が登場しました。Strutsは、MVCモデルにお けるプレゼンテーション層とビジネス層、インテグレーション層を分離し、コンポーネント間の疎結合 化を実現しました。 「軽量コンテナ」では、複雑なJ2EE、特にEJBへの批判精神により新しいフレームワークが登場しま した。EJBを使用したアプリケーション開発は難易度が非常に高く、さらにEJBコンテナがないとテスト できないとか、難解なEJBの仕様を理解しなければいけないというのが、EJB批判の理由です。それ に対して、Spring FrameworkはよりLight-weightなコンテナを求め、HibernateはCMPのアンチテーゼ およびO/Rマッピングの代替を実現しました。 「Java EE 5」では、オープンソースの設計思想と技術トレンドをメインストリームとして取り入れ、 EJB3.0/JPA1.0として進化しました。アプリケーションとして作成すべき機能をObjectクラスのようなシ ンプルでコアなクラスで作成し(POJO)、HttpServeltクラスを継承する、web.xmlに決められた情報を 入力する等のルール部分をDI/AOP、アノテーションという技術によって補完するという考えが取り込 まれています。 「フレームワーク進化」では、機能拡張、バグ修正、最新技術トレンドの取り込みを行い、バージョン アップすることで更なる進化を遂げています。 9 02. フレームワーク フレームワークの黎明期から全盛期 2005 J2EEの課題 レイヤーの役割分担があいまい パフォーマンスがあまり良くない 2006 2007 2008 Struts ~フレームワーク黎明期 軽量コンテナ ~J2EE神話の崩壊、フレームワーク全盛期 オープンソース・フレームワークの登場 Struts Hibernate MVC2モデルに基づいたデザインによる、コンポーネント間の疎結合化 柔軟な画面遷移、入力値チェック等の機能 データアクセスの煩雑さを排除 O/Rマッピングの代替 CMPのアンチテーゼ プレゼンテーション層 ビジネス層 インテグレーション層 Spring DI/AOPによる、レイヤー間の依存性を排除 EJBのアンチテーゼとしてのLight-weightなコンテナ 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 10 典型的なJ2EEアプリケーションではレイヤーの役割分担があいまいであっため、「チーム開発がし ずらい」とか、「変更、機能拡張、テストが容易ではない」という課題がありました。また、フルスタック であるがため、パフォーマンスがあまり良くないという課題もありました。この課題の解決すべく、特定 の機能に特化したオープンソース・フレームワークが登場しました。 Strutsは、MVC2モデルに基づいたアプリケーションデザインを提供しており、柔軟な画面遷移、入 力値チェック、国際化対応等の機能が提供されています。コンポーネント間の疎結合化が実現され、 開発効率の向上、作業分担の容易、画面デザインの変更に強い、一定の品質を保てる、国際化対 応が容易、柔軟な画面遷移が実現できる、JSP の可読性が向上する等の様々なメリットを享受できま す。 HibernateはO/Rマッピングツールになり、リレーショナル・データベースのレコードをjavaオブジェク トとして直感的に扱えるようにするための仕組みが提供されます。これにより、データアクセスに関す る様々な問題や煩雑な処理から、開発者を解放できるというメリットを享受できます。 Springは、Rod Johnson氏の著書 “Expert OneonOne J2EE Design and Development” の中で使用 されたコードを元にしたオープンソースのJ2EE アプリケーションフレームワークです。Spring Coreや Spring AOP、Spring DAO等の複数のモジュールから構成されます。SpringはDIコンテナであり、イン タフェースを利用した設計/実装を実現し、開発効率の向上、変更に柔軟、機能拡張が容易等のメ リットを享受できます。さらにSpringはAOPを提供しており、AOPを利用したトランザクション管理、例 外処理、ログ処理を行うことで、開発効率の向上、テスト容易性の向上、複雑な技術の隠蔽等のメ リットを享受できます。 <補足>Front ControllerパターンとApplication Controllerパターン Front Controllerパターンは、リクエストの開始となるServletを1つにし、コンテナはそのServletしか呼 び出さないことで、「HTTPリクエストを処理するポイント」を一元化する考え方です。Application Controllerパターンは、HTTPリクエストを実際に処理するためのクラスとビューを生成するためのJSP の処理制御を一元化する考え方です。 Strutsはこのパターンを組み合わせています。また、これに より機能的な分離ができ、Application ControllerはServletである必要がなくPOJOで作成でき、テスト 効率を向上させることができます。 10 02. フレームワーク あるWebアプリケーション Action Employee Service Employee DB2Dao RDBMS 処理内容 社員情報の検索 特徴 フレームワークを採用していない インタフェース、DI/AOPを利用していない 課題 チーム開発がしずらい 変更、機能拡張、テストが容易ではない 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 11 11 02. フレームワーク Struts適用 ~コンポーネント間の疎結合化 Strutsが提供 Action ⑥リクエスト情報と設定ファイルによ <処理A> ②委譲 Request Action りリクエスト処理に関するオブジェク Action トを決定 -Servlet リクエストパラメーターの取得 Processer Servlet リクエスト処理毎 - 取得した値の検証 ブラウザ の処理 - ビジネスロジックへの割り振り リクエスト処理 リクエスト処理 の窓口 - 画面遷移 の制御 Employee Action ⑥処理結果 Service ・・・ 顧客データ 検索 / 登録 ⑤入力情報などを格納するオ <処理B> ブジェクトの生成と値の設定 開発者が設定した <処理C> 指示書の読み取り ⑦フォワード 参照が渡される Action ・・・ ①リクエスト struts-config.xml JSP 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop Form リクエスト パラメーター 12 アプリケーションの”Action”部分に、リクエストパラメーターの取得、取得した値の検証、ビジネスロ ジックへの割り振り、画面遷移等を処理毎にコーディングする必要がありましたが、Strutsが提供する 機能によって実現することができます。 ActionServletがリクエスト処理の最初の窓口になり、RequestProcesserに委譲します。この RequestProcesserがActionクラスの割り振りとJSPへのフォワードを行います。リクエストパラメータを格 納するための専用クラスはActionFormと呼ばれ、パラメーターを取り出してその内容を格納します。 実際にリクエストを処理するクラスはActionと呼ばれ、設定ファイルからどのリクエストの時はどの Actionクラスを使うべきかが判断され、インスタンス化されてメソッドが実行されます。このように、 Struts適用により、コンポーネント間を疎結合化を実現でき、以下のメリットを享受できます。 ・開発効率の向上:リクエストパラメーターの取得や再表示機能をStrutsが提供する。 ・作業分担の容易:Model/View/Controllerが疎結合になるため、作業の分担が容易となる。 (ロジッ ク(Model)、デザイン(View)、画面遷移(Controller)担当者) ・画面デザインの変更に強い:画面デザインの変更が発生した場合でも ModelやController の修正 は不要であり、ViewであるJSP の修正だけで済む。 ・システム品質の向上:Strutsが動作の流れを規定するため、 開発者によって作り方が異なる事態を 防げる。 ・国際化対応が容易:リソースバンドルを利用したマルチリンガルに対応している為、各国語用のリ ソースファイルを用意するだけでクライアントの環境に応じたコンテンツを表示できる。 ・柔軟な画面遷移の実現:画面遷移情報をstruts-config.xmlに設定する為、複雑になりがちな画面 遷移処理を容易に記述できる。 ・JSP の可読性が向上する:タグライブラリの利用により、JSPの記述に一貫性を持たせることができ、 スクリプトレット等を埋め込む事による可読性の低下を防ぐ事が可能になる。 ・ struts-config.xml リクエストを把握するための情報、リクエストパラメーターを格納するクラス、リクエストや処理結果毎 のJSPのフォワード先が定義される。 12 02. フレームワーク Hibernate適用 ~データアクセスの煩雑さを削除 社員テーブル 支給日: 2007/01/25 支給額: 300000 名字: たなか 名前: よしお Employee DB2Dao RDBMS 支給日: 2007/01/25 支給額: 250000 名字 名前 126 たなか よしお 743 すずき はなこ 手当てテーブル 名字: すずき 名前: はなこ 支給日: 2007/02/10 支給額: 7000 全体の設定 hibernate.cfg.xml O/R マッピング定義 <Class名>.hbm.xml オブジェクト指向 ・クラス ・フィールド ・インスタンス化されたオブジェクト 社員ID インピーダンス ミスマッチ 手当てID 対象者ID 支給日 支給額 1 743 2007/1/25 300000 2 126 2007/1/25 250000 3 743 2007/2/10 7000 リレーショナルデータベース ・テーブル ・カラム ・レコード HQL (Hibernate Query language) オブジェクトをベースとしたSQLライクなクエリ言語 from fromise.com.Employee ise.com.Employeewhere whereemployee.Id employee.Id==‘126’ ‘126’ SQLレスな開発 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 13 SQLを発行した結果セットから必要な情報を取り出してオブジェクトに構築していくという(※)、リ レーショナルとオブジェクト指向のデータ表現の違いをコードレベルで埋め合わせる必要がありまし たが、Hibernateが提供する機能によって実現できます。業務そのものの実装とは異なり、かつ RDBMSの接続情報等、面倒で繰り返しの多い作業をツールによってある程度自動化することができ ます。 Hibernate適用により、データアクセスの煩雑さが削除され、開発効率の向上とシステム品質 の向上が見込まれます。 (※)データのUPDATEやINSERTの際に、オブジェクトからデータを取り出してSQL文を構築するなど は、アプリケーション構築の本来の目的やアプリケーションの主要な機能の実装とは別に手間の掛 かる作業です。テーブルカラムを取り違えてしまうなどの気が付きにくいミスが生まれるからです。ま た、データベースのスキーマを変更したらアプリケーション内のSQLを広範囲にわたって修正する必 要があります。 <補足> ・hibernate.cfg.xml:Hibernate全体の設定 JDBC接続情報、ログ関連、L2キャッシュ設定、トランザクション設定、スキーマDDL設定、O/Rマッピ ング定義ファイルリスト等。 ・<Class名>.hbm.xml:O/Rマッピング定義 永続化オブジェクト・クラス名、対応するテーブル名、主キー定義、プロパティーのテーブルへのマッ ピング情報、関連のマッピング、クラス継承のマッピング、JOINするテーブル設定。 ・Hibernateのクエリ - HQL:オブジェクトをベースとしたSQLライクなクエリ言語 - Criteria:検索条件を文字列ではなくメソッド呼び出しで組み立てる - ネイティブSQL:RDBMS特有のSQLで検索条件を指定する ・Hibernateの状態 (transientとdetachedがGarbage Collectionの対象) - transient : Hibernateによって管理されていない。 - persistent : Hibernateによる管理対象となっているオブジェクト。 永続化対象としてデータベース との間でデータの同期がとられる。 - detached : 管理されている(persistent)状態から管理対象外になったオブジェクト。 13 02. フレームワーク Spring適用 ~レイヤー間の依存性を削除 Employee Dao Employee Service Action Employee ServiceImpl Employee DB2Dao RDBMS ブラウザ 生成 Bean定義 ファイル Injection Spring インターフェースを区切りとしたチーム開発 複雑な技術の隠蔽とコーディング量の減少による、 開発効率 / テスト容易性の向上 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 生成 Injection Advice ・トランザクション処理 ・ログ処理 ・例外処理 等 14 インターフェースを注入することで、このインターフェースを区切りとして、チームの開発効率を向 上させることができます。 Factory MethodなどのJ2EEデザインパターンの導入にて実現できますが、 Springを使用した方がより容易に実現できるかと思います。また、トランザクションやログ、例外処理を、 既存のオブジェクトに影響を与えないで追加することができ、コーディング量が減るとともに、開発効 率およびテストの容易性を向上させることが出来ます。 <補足> Factory Methodとは、スーパークラス側で処理の骨組みを作り、サブクラス側で具体的な処理の肉 付けを行う考え方のこと。インスタンスの作り方をスーパークラス側で定めますが、具体的なクラス名 までは定めません。具体的な肉付けは、すべてサブクラス側で行うことにより、インスタンス生成のた めの骨組みと、実際のインスタス生成のクラスとを分けて考えることができるようになります。 14 02. フレームワーク メインストリームの逆襲 2006 EJBの課題 2009 ~メインストリームの逆襲 EE 5の登場 オープンソースの設計思想と技術トレンドをメインストリームに取り入れる 2008 Java EE 5 EJB is too complex 非常に作るのが難しい 単体テストが困難 O/Rマッピングが使いにくい、制約が多い、遅い Java 2007 開発テーマ :Ease of Development キーテクノロジー:POJO、アノテーション、DI/AOP メインアップデート EJB 3.0 JPA 1.0 プレゼンテーション層 ビジネス層 EJB3.0 インテグレーション層 JPA1.0 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 15 EJBを作るのが非常に難しい(※)、単体テストが困難、O/Rマッピングが使いにくい、制約が多い、 遅いという課題がありました。Springを作成されたRod Johnson氏が「EJB is too complex」(J2EE Development without EJB、2004)と言われたのは、あまりにも有名です。 (※)本質的なビジネス・ロジックとは関係ない作成物、実装コードが多い。継承、実装のお作法、API が複雑。EJB クライアントもコーディングのお作法が複雑。 これに対してJava EE 5では、オープンソースの設計思想と技術トレンドをメインストリームとして取り 入れ、EJB3.0/JPA1.0として進化しました。アプリケーションとして作成すべき機能をObjectクラスのよ うなシンプルでコアなクラスで作成し(POJO)、HttpServeltクラスを継承する、web.xmlに決められた情 報を入力する等のルール部分をDI/AOP、アノテーションという技術によって補完するという考えが 取り込まれています。 <補足> EJB 3.0: 開発者は EJB コンポーネントを、Java ビジネス・インターフェースを使用したPOJOとしてプログラミン グすることができ、開発が単純化。ビジネス・ロジックを提供するコンポーネントのフレームワークで、 ミッション・クリティカルな分散システムの構築が可能になります。 - EJBコンテナが提供する機能 トランザクション管理、ビジネス・ロジックのアクセス制御、タイマーサービス、リモート呼び出し(分散 オブジェクト処理)、データの永続化 - EJBの種類 Session Bean:ビジネス・ロジックの実装、Stateless BeanとStateful Bean Message Driven Bean:キューからメッセージを取得し、非同期にビジネスロジックを実行 Entity:データの永続的な保存、Entity ClassとEntity Object JPA 1.0: Java EE 環境において、単純化されたパーシスタンス・テクノロジーを提供する。POJOをO/Rマッピ ングにより、透過的にパーシスタンス・データに変換する。EJBやJPA固有のクラス、例外の継承、実 装、throwが不要。 15 02. フレームワーク Java EE 5 ~EJBサンプル EJB 3.0 EJB 2.1 public publicclass classCartBean CartBeanimplements implementsSessionBean SessionBean{ { private privateSessionContext SessionContextctx; ctx; public publicint intsomeShoppingMethod() someShoppingMethod(){ {……} } public publicvoid voidejbCreate() ejbCreate(){ {} } public publicvoid voidejbRemove() ejbRemove(){ {} } public publicvoid voidejbActivate() ejbActivate(){ {} } public publicvoid voidejbPassivate() ejbPassivate(){ {} } public publicvoid voidsetSessionContext setSessionContext(SessionContext (SessionContextctx) ctx) { {} } }} Enterprise Bean Class Home Interface and Remote Interface Object obj = Object obj = Context.lookup(“java:comp/env/ejb/MyCartHome”); Context.lookup(“java:comp/env/ejb/MyCartHome”); CartHome theCartHome = (CartHome) CartHome theCartHome = (CartHome) PortableRemoteObject.narrow(obj、 PortableRemoteObject.narrow(obj、 CartHome.class); CartHome.class); ShoppingCart myCart = theCartHome.create() ; ShoppingCart myCart = theCartHome.create() ; myCart.someShoppingMethod(); myCart.someShoppingMethod(); Session Bean Client @Stateful @Stateful public publicclass classCartBean CartBeanimplements implementsShoppingCart ShoppingCart{ { }} public publicint intsomeShoppingMethod() someShoppingMethod(){ {......} } Enterprise Bean Class ・コーディング量が少ない ・アノテーションを活用 ・Home Interfaceの必要なし ・Bean Classは、Business Interfaceをそのまま 実装 @EJB @EJB private privateShoppingCart ShoppingCart myCart; myCart; public publicvoid voidsomeMethod() someMethod(){ { myCart.someShoppingMethod(); myCart.someShoppingMethod(); }} Session Bean Client ・実行時にインスタンスを注入 ・アノテーションを活用 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 16 EJB 3.0 では、特別なお作法に惑わされること無く、ビジネス・ロジックを実装しているクラスの作成 と、その公開メソッドをそのままインターフェースとして公開するという非常に素直なコーディングに なっています。また、EJBであることは、アノテーション(@Remoteや@Stateless)を使用して示し、EJB 固有のクラスやインターフェースの継承や実装は必要ありません。さらに、これまでのEJB 2.x の時と は、クライアント側のコーディングも変わり、Homeオブジェクトをlookupする必要はありません。直接、 Business Interfaceを実装したインスタンスを取得し、そのメソッドが実行できます。また、Business Interfaceを実装したインスタンスの取得方法も、コード上でlookupする方法だけでなく、アノテーショ ンを使用したDIで取得することができます。これにより、非常にシンプルなコーディングでEJB呼び出 しを行うことができます。また、アノテーションを使用したDIを利用することにより、EJBサーバー側が 完成していなくても、簡単にモックオブジェクトを作成・登録できますので、EJBクライアント側のテスト も容易に行うことができます。 <参考情報> EJB3.0/JPA1.0の詳細につきましては、以下のワークショップ資料をご確認下さい。 ・WAS V6.1 Feature Pack for EJB 3.0 ワークショップ http://www.ibm.com/developerworks/jp/websphere/library/was/was61_ejb3fep_ws/ 16 02. フレームワーク フレームワークの発展 フレームワークの課題 XML設定ファイル地獄 テスト効率があまり良くない Ajaxアプリケーションへの対応 2007 SSHは XMLの三重苦 2008 2009 フレームワーク進化 ~フレームワークの発展 生産性・テスト効率 が悪い 学習コスト がかかる フレームワークの進化 設定ファイルの簡潔化とアノテーション Hot Deploy (Reloading)機能 Ajax対応フレームワーク Seasar 2.3 (2005.11) Spring 2.5 (2007.11) Seasar 2.4 (2006.11) プレゼンテーション層 ビジネス層 EJB3.0 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop Light Language インテグレーション層 JPA1.0 17 デファクトスタンダードと言っても過言でない程、オープンソースのフレームワークが台頭しましたが、 課題が全くなかった訳ではありません。たしかに、フレームワークの採用によりコードディング量が減 りましたが、代わりにXML設定ファイルを書く量が増え、XML設定ファイル地獄が発生しました。SSH (Struts / Spring / Hibernate)は、「XMLの三重苦」とも言われたりしています。また、POJOとDIによっ てテストの容易性は向上しましたが、それは単体テストだけに当てはまるもので結合テストには当て はまりませんでした。生産性はEJBより良いが低かったという現状があり、生産性の高いRuby on Railsが注目を集めました。 この課題を踏まえて、コンポーネントの自動登録とアノテーションの組み合わせによるXML設定 ファイル地獄の解消が図られました。Seasarは2005年11月公開のバージョン2.3で、Springは2007年 11月公開のバージョン2.5で実現してます。さらに、開発生産性を向上すべく、アプリケーションサー バを稼働させたままソースコードの修正が即座に反映されるHot Deploy (reloading)機能が、2006年 11月のSeasarの2.4で実現されました。これにより、JavaでもRubyなどのいわゆる「LL (Light Language)」と同様にさくさくとした開発が可能になっています。また、別の観点では、よりリッチな ユーザーインタフェースを提供するAjaxアプリケーションの台頭により、そのAjaxアプリケーションを 容易に開発できるオープンソースのフレームワークも登場しています。 17 02. フレームワーク フレームワークの発展 ~Struts編 Struts1.xの課題 XML設定ファイル地獄 選択指針例 スタート struts-config.xml、validation.xml アプリケーションを実行するまで、わからない テスト効率があまり良くない 設定ファイルとクラスの関連の再定義 ソースコード修正時の再起動 Struts1.xの 既存プロジェクト Yes S2Strutsの 既存プロジェクト 主な機能拡張 No No Yes Struts 2.x (Struts + WebWorks) S2Struts (Struts1系 + Seasar) SAStruts (Struts1系 + Seasar) ActionクラスのPOJO化 アノテーション対応 設定ファイルの最小限化 設定ファイルが必要ない Hot Deploy機能 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop S2Struts SAStruts Struts2.x 互換性 Struts2とStrus1の下位互換性がない バージョン JDK1.4環境は、S2Struts 18 Strutsを利用して開発されたアプリケーションの数は膨大であり、最も人気の高いフレームワークと 言っても過言ではありません。しかしながら、XML設定ファイル地獄やテスト効率が良くないという(一 部の)現場開発者の不満もありました。特にXML設定ファイルは、アプリケーションの実行前にコンパ イルされて構文チェックなどが行われるわけではなく、アプリケーションの実行時に読み込まれるた め、実行してみないと記述ミスに気付きません。多くの情報が記述されている場合には、どこが間 違っているかを発見するのが大変手間になります。 Struts2.xでは、開発生産性とソースコードの簡素化に特徴があるWebWorkと融合され、Actionクラ スのPOJO化とアノテーション対応と設定ファイルの最小限化が実装されました。(詳細は次ページ) ActionクラスのPOJO化によりテスト効率が良くなり、アノテーション対応、および設定ファイルの最小 限化により開発生産性が向上しています。 また、Struts1系はDIコンテナであるSeasarとの融合により、S2StrutsとSAStrutsを選択することもでき ます。S2Strutsは、Strutsを使用した既存アプリケーションとSeasarの連携を簡単に実現し、より簡単 にWebアプリケーションを構築するための機能が提供されています。Super Agile Struts(以降 SAStruts)は、Strutsを使った開発をSuper Agileに行なうためのフレームワークです。設定ファイルを 書く必要はなく、アプリケーションサーバを稼働させたままソースコードの修正を反映させることがで きます。 Strus2系、S2Struts、SAStrutsの選択指針として、既にStruts1系で開発している案件はS2Strutsか SAStrutsを、新規案件はStruts2系を選択するのが良いと思います。Struts1.xとStruts2.xで下位互換 性がないことと、Struts2.xにて様々な機能拡張がされているのがその理由です。(その反面、Struts2 系では、新たな学習コストがかかります。)また、S2StrutsとSAStrutsの選択指針は、既にS2Strutsで 開発している、もしくはJDK1.4で開発している案件はS2Strutsを、それ以外はSAStrutsを選択するの が良いと思います。同様に、SAStrutsにてHot deploy機能等、様々な機能拡張がされているのがそ の理由です。 18 02. フレームワーク フレームワークの発展 ~Struts2系 機能拡張 ActionクラスのPOJO化 public ActionForward execute public ActionForward execute (ActionMapping mapping、 (ActionMapping mapping、 ActionForm form、 ActionForm form、 httpServletRequest request、 xxx) httpServletRequest request、 xxx) Struts1 アノテーション対応 <action <actionpath="/sample/hello" path="/sample/hello" type=“xxx.HelloAction" type=“xxx.HelloAction"name=“xxx"> name=“xxx"> <forward <forwardname="hello" name="hello"path="/hello.jsp" path="/hello.jsp"/>/> </action> </action> Struts1 テスト効率 の向上 public publicclass classHelloAction HelloAction{ { public publicString StringgetMessage() getMessage(){ { return return"Hello!"; "Hello!"; }} public String execute() throws Exception { public String execute() throws Exception { return "success"; return "success"; } } } Struts2 } @Action("/sample/hello") @Action("/sample/hello") public publicString Stringexecute() execute(){ { …… …… }} 開発生産性 の向上 Struts2 設定ファイルの最小限化 Conventionプラグイン 設定ファイル(:struts-config.xml)が不要 Struts2.1とSpring2.5連携 ActionクラスによるSpring Injection機能の利用が可能 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 開発生産性 の向上 @Autowired @Autowired public publicvoid voidexecute() execute(){ { …… …… }} Struts2 19 ・ActionクラスのPOJO化 Struts1系のActionクラスは、Strutsが提供するActionクラスを継承する必要があります。アクションメ ソッドであるexecute() は、戻りにActionForward、パラメーターにはActionMapping、 HttpServletRequestなどのクラスやインタフェースをパラメーターにする必要がありました。それに対 して、Struts2系のActionクラスは何も継承せずにPOJOとして作成することが可能です。 ・アノテーション対応 Struts1系では定義ファイルであるstruts-config.xmlとの密接な連携が必要でしたが、Struts2系では アノテーションで遷移先を決めることが可能です。 ・設定ファイルの最小限化 Conventionプラグイン (struts2-convention-plugin-2.1.6.jar) Struts1系では定義ファイルであるstruts-config.xmlに、利用するActionクラスやFormクラス、Actionク ラスの処理結果を元にした遷移先のJSPファイル等を記述する必要がありました。Struts2系では、規 約を守れば、簡単なWebアプリケーションであれば、struts-config.xmlを設定する必要がなくなって います。 ・Struts2.1とSpring2.5連携 Struts1系では、Springの管理するビジネスコンポーネントをActionクラスから利用するためには ActionSupportクラスを継承したり、リクエストプロセッサであるAutowiringRequestProcessorを置き換 えたり、 StrutsとSpringの定義ファイルを紐付けるなど様々な作業が必要でした。Struts2.1では、 Actionクラスのインスタンス変数にAutowiredアノテーションを定義するだけで実装することが可能で す。 19 02. フレームワーク フレームワークの発展 Hibernate API Metadata HQL ~Hibernate編 3.xの主な機能拡張 EJB3.0 Annotation、JPA、merge() Lazyロード(デフォルトtrue) ANTLRベースのHQL/SQL翻訳エンジン 選択指針例 最新版を使用する 機能拡張 / 最新技術のサポート N+1 セレクト問題 Lazyロード: 関連するオブジェクトのロードを最初にアクセスされるまで遅延する 夫テーブル 夫ID 名字 名前 1 たなか よしお 2 すずき のぶお 妻テーブル 妻ID 夫ID 名字 名前 1 1 たなか よしこ 2 2 すずき のぶこ select select* *from from夫テーブル 夫テーブル →1件:select →1件:select* *from from夫テーブル 夫テーブル →N件:select →N件:select* *from from妻テーブル 妻テーブルwhere where妻テーブル.夫ID=? 妻テーブル.夫ID=? Nレコード分だけ SQL を発行する Nレコード分だけ SQL を発行する++全レコードの取得に1件 全レコードの取得に1件 join fetchの設定 テーブル再定義(主キーと外部キーの関係) キャッシュ検討 L1キャッシュ:evict()、clear()、ScrollableResults L2キャッシュ:更新頻度が低い参照専用のテーブル 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop RDBMSのスキル 初期段階で検討 20 ・Hibernateの選択指針 Hibernate 2.x is no longer being actively developed. Hibernate3 still runs perfectly with JDK 1.2. また、Annotationを使用する場合は、Hibernate3以上が必須です。(JSR-175) Lazyロードとは、関連するオブジェクトのロードを最初にアクセスされるまで遅延させます。使用さ れていないオブジェクトに対してデータベースへの問い合わせを行わないことになり、リソースを節約 しパフォーマンスを向上させることができます。その反面、N+1セレクト問題とも言われていますが、 実際にデータベースにアクセスするタイミングにて、関連しあう全てのオブジェクトの処理データ+1件 分のSQLをDBに発行してしまいます。これは、RDBMSに大きな負担となり、システムのパフォーマン スを低下させる可能性があります。この問題の対応策として、join fetchの設定やテーブルの再定義 を検討して下さい。(外部キーがない1対1関連、主キーで結合する多対1関連等、Hibernateが関連 Entityの存在を判別できない場合に発生します。)join fetchは、Lazyロードせず、外部結合によるDB 問い合わせを行います。(select fetchは、外部結合を行わず、別々のSELECT文による関連しあうオ ブジェクトを取得します。)また、DI/AOPによって、ユースケースに応じてこのfetch設定を上書きする ようなアーキテクチャーを検討して下さい。 L1キャッシュはデフォルト有効で、Sessionがオープンされている間、永続化オブジェクト (=persistent)のキャッシュが保持されます。L2キャッシュはオプションで、SessinFactoryが存在する間、 JavaプロセスやAppServerのCluster間で保持されます。Session間の共有可能です。L1キャッシュは、 OutOfMemoryの発生を避けるため、特に大量のデータを扱う場合には、適宜evict() / Clear()を実 行することを心掛けて下さい。evict()は引数に渡した1つのオブジェクトを削除するのに対し、clear() はセッション・キャッシュ上のすべてのオブジェクトを削除します。このメソッドを実行すると、(1)セッ ション・キャッシュから永続オブジェクトを除去します。その結果、セッション管理の対象外となった永 続オブジェクトの状態は、分離オブジェクトへと遷移します(2)セッション・キャッシュから削除された永 続オブジェクトに対する更新系の処理はキャンセルされます。また、大量の検索結果を扱う場合には、 ScrollableResultsを利用して下さい。L2キャッシュは更新頻度が低い参照専用のテーブルを対象と すると宜しいかと思います。(WASの動的キャッシュ機能と同様の考え方になりますので、05.非同期 &キャッシング設計をご参照下さい。また、L2キャッシュにつきましては、06.データアクセス設計をご 参照下さい。) <参考情報> ・Hibernate3 Migration Guide: https://www.hibernate.org/Documentation/Hibernate3MigrationGuide ・JBoss Cache, EHCache, OSCache, SwarmCache http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-cache 20 02. フレームワーク フレームワークの発展 ~Spring編 Spring1.xの課題 DI/AOPを実現するための XML設定ファイルが複雑 主な機能拡張 Spring2.0 (2006.10) Spring2.5 (2007.11) Spring3.0 (2009.10) 設定ファイル簡素化と強化 設定ファイル簡素化と強化 設定ファイル簡素化と強化 - XMLスキーマの利用 - AspectJの連携強化 - カスタムスキーマ JPAサポート MessageDriven POJO導入 Spring JDBCの強化 Portlet MVCのサポート アノテーションの強化 OSGiサポート Java EE 5サポート 設定ファイルの簡素化 / 最新技術のサポート 選択指針例 互換性 バージョン - オブジェクトとXMLの マッピングサポート - AspectJの連携強化 アノテーションの強化 REST/SpringMVCサポート Portlet2.0サポート Servlet2.5との後方互換 Java EE 6先取りサポート - JSR-303、JSR-330 WASV7は、Spring WASV7は、Spring2.5.5以降を推奨 2.5.5以降を推奨 Spring 2.0とSpring1.x、Spring 3.0とSpring2.5の互換性あり Spring 2.5(JDK1.4 or higher)、Spring 3.0(JDK1.5 or higher) 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 21 Springは、DI/AOPという手法を導入することで、複雑化したJava EEに代わるフレームワークとして 普及しました。しかし、その一方で、DI/AOPを実現するためのXML設定ファイルの記述が複雑であ るという課題もありました。そこでSpring 2.0以降にて、設定ファイルの簡素化と最新技術のサポート 対応が実施されました。(XMLスキーマ、AspectJ、アノテーション等) AspectJは、@AspectJアノテーションによってAspectJのアスペクトを定義できるようになり、AspectJと Spring AOPの間でアスペクトを容易に共有できるようになりました。また、Bean定義ファイル中で AspectJのポイントカット記法を記述できるようにするなどの拡張も追加されています。 Springのバージョンの選択指針においては、Springの互換性とSpringが対応しているJDKのバー ジョンにご注意下さい。 <補足> 後方互換とは、新たに作られるシステムに、旧世代での古い機能を満たすように考慮され仕様に含 まれること。下位互換とは、機能やグレードが下位のシステムが、上位のシステムの規格を扱えること。 <参考情報> Chapter 2. What‘s new in Spring 2.0 and 2.5? (2.7. Migrating to Spring 2.5) http://static.springsource.org/spring/docs/2.5.x/reference/new-in-2.html Spring3.0での機能拡張 (2.5 Overview of new features) http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ch02s05.html Class JdkVersion (Spring 2.5) http://static.springsource.org/spring/docs/2.5.x/api/index.html Class JdkVersion (Spring 3.0) http://static.springsource.org/spring/docs/3.0.0.RC1/javadoc-api/ WASV7.0 Information Center - 「Spring Framework」 http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.nd.m ultiplatform.doc/info/ae/ae/cspr_intro.html 21 02. フレームワーク フレームワークの発展 ~トランザクション Spring 1.x Spring 2.0以降 <beans> <beans> <!– <!–トランザクション定義情報の設定 トランザクション定義情報の設定--> --> <bean <bean id=“dataSource“ id=“dataSource“class=“org.springframework.transaction. class=“org.springframework.transaction. interceptor.nameMatchTsansactionAttributeSource”> interceptor.nameMatchTsansactionAttributeSource”> <property name=“properties"> <property name=“properties"> <props> <props> <prop <propkey=“insert*”>PROPAGATION_REQUIRED,key=“insert*”>PROPAGATION_REQUIRED,java.lang.Exception</prop> java.lang.Exception</prop> <prop <propkey=“find*”>PROPAGATION_REQUIRED key=“find*”>PROPAGATION_REQUIRED ,readOnly</prop> ,readOnly</prop>・・・ ・・・ <!– <!–トランザクション定義情報の設定 トランザクション定義情報の設定--> --> <bean <bean id=“transactionInterceptor“ class=“org.springframework.tr id=“transactionInterceptor“ class=“org.springframework.tr ansaction.interceptor.TransactionInterceptor”> ansaction.interceptor.TransactionInterceptor”>・・・ ・・・ <!– <!–BeanNameAutoProxy BeanNameAutoProxy--> --> <bean <bean id=“autoProxy“ id=“autoProxy“class=“org.springframework.aop.framewo class=“org.springframework.aop.framewo rk.autoproxy.BeanNameAutoProxyCreator”> rk.autoproxy.BeanNameAutoProxyCreator”> ・・・ ・・・ Bean定義ファイル XMLスキーマを利用したBean定義 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop aopタグとtxタグを使用した例 <aop:config/> <aop:config/> <aop:advisor pointcut=“execution(*..TxExBean.exMethod(…))” <aop:advisor pointcut=“execution(*..TxExBean.exMethod(…))” advice-ref=“txAdvice”/> advice-ref=“txAdvice”/> </aop:config> </aop:config> <tx:advice id=“txAdvice”> <tx:advice id=“txAdvice”> <tx:attributes> <tx:attributes> <tx:method name=“exMethod” propagation=“REQUIRED” <tx:method name=“exMethod” propagation=“REQUIRED” timeout=“20”>・・・ timeout=“20”>・・・ <bean id=“exBean” class=“txexample.TxExBeanImpl”></bean> <bean id=“exBean” class=“txexample.TxExBeanImpl”></bean> <bean id=transactionManager” ・・・ <bean id=transactionManager” ・・・ Bean定義ファイル @Transactionalとtxタグを使用した例 @Transactional( @Transactional( propagation=Propagation.REQUIRES_NEW, propagation=Propagation.REQUIRES_NEW, isolation=Isolation.SERIALIZABLE,readOnly=false, isolation=Isolation.SERIALIZABLE,readOnly=false, rollbackFor={RuntimeException.class, IOException.class}) rollbackFor={RuntimeException.class, IOException.class}) Public classTxBeanImpl implements TxBean { ・・・ } Public classTxBeanImpl implements TxBean { ・・・ } Bean <tx:annotation-driven/> <tx:annotation-driven/> <bean id=“exBean” class=“txexample.TxExBeanImpl”></bean> <bean id=“exBean” class=“txexample.TxExBeanImpl”></bean> <bean id=transactionManager” ・・・ <bean id=transactionManager” ・・・ Bean定義ファイル 22 Spring 1.xの時は、上図のように非常に設定が複雑になってしまいました。それに対してSpring 2.0 以降は、XMLスキーマおよびアノテーションを使用することにより、設定量が減り、タグによりその設 定内容が見やすくなりました。 ・XMLスキーマ一覧 utilスキーマ(spring-util-2.0xsd):定数定義やプロパティーファイルの読み込み等のユーティリティー 機能の設定を簡略化 langスキーマ(spring-lang-2.0xsd):動的言語による設定を簡略化 aopスキーマ(spring-aop-2.0xsd): AOPの設定を簡略化 txスキーマ(spring-tx-2.0xsd):トランザクションの設定を簡略化 jeeスキーマ(spring-jee-2.0xsd): JNDIのlookupおよび、EJBのlookupの設定を簡略化 <参考情報> WASV7 Feature Pack for Service Component Architecture 1.0.1リフレッシュ版では、Spring Framework 2.5.5をサポートします。 IBM WebSphere Application Server V7.0 Feature Pack for Service Component Architecture (SCA) V1.0.1 Open Beta https://www14.software.ibm.com/iwm/web/cc/earlyprograms/websphere/iwsasfpscaob/index.shtm l 22 02. フレームワーク フレームワークの発展 WAS x Spring/Hibernate連携 ~WAS/Hibernate連携 データソース トランザクション WAS独自機能の利用が可能 接続プール、トランザクション、分離レベル ピアリカバリー、タイマー、モニター Spring x Hibernate連携例 ビジネス層 トランザクショ ンマネージャー Session Factory DAO トランザクション開始() <<intercept>> Hibernate RDBMS トランザクション開始() 新規登録() セッション取得() セッション開始() save() commit() <<intercept>> commit時同期処理() セッション終了() insert() SQLException() HibernateException() DBアクセスをDAOレイヤーにて隠蔽 トランザクション境界でHibernateの例外が発生 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop トランザクション境界にインターセプタを 追加して、例外をラップする 23 Springにてデータソースやトランザクションを管理できますが、これらをWASで管理させることを検討 して下さい。WASが提供する接続プール、トランザクション管理、分離レベル設定機能を利用できま す。また、トランザクションについては、以下のWASが提供している機能を利用できます。WASと Spring、Hibernateの連携方法については、参考資料の 「WAS × Webフレームワーク連携手法」を ご確認下さい。 ・ピア・リカバリー機能 HAマネージャーによるトランザクションマネージャーのフェイル・オーバー機能です。トランザクション マネージャー障害時にトランザクションのリカバリーを実施します。 ・タイマー機能 トランザクション・タイムアウトが設定可能です。ある一定時間を経過したトランザクションをロールバッ クします。 ・モニター機能 実行トランザクションのスナップショット機能です。実行中やロールバックされたトランザクション数等、 トランザクションの状態をTivoli Performance Viewerでモニターできます。 Hibernateが書込みSQLを発行するタイミングは、クエリで検索を行う時と、Session.flush()を呼び出 した時と、Transaction.commit()を呼び出した時です。そのため一意制約例外や並行性制御例外が トランザクション境界で発生してしまうことがあります。DBアクセスをDAOレイヤーで隠蔽したとしても、 Hibernateの例外が返ってしまいますので、Springによって例外をラップすることを検討して下さい。 <参考情報> WASV7.0 Information Center 「JTA サポート」 http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.nd.m ultiplatform.doc/info/ae/ae/cjta_extjta.html <コラム> Hibernate開発者の方も、以下の理由によりRDBMSのスキルがあった方が望ましいと考えます。 ・データアクセスはHibernateが裏で勝手に実施してくれるから、開発者は発行されるSQL文を意識 しなくて良いという考えでは、N+1セレクト問題を早期に発見できない。 ・開発者がDBインフラ担当者に複雑な検索について相談すると、HQLを知らないDBインフラ担当者 はSQLでその検索方法を答えます。開発者は、そのSQL文をHQLに翻訳しなければいけない。 23 02. フレームワーク フレームワークの発展 ~Beanスコープ Spring 1.x <beans> <beans>id="sample" id="sample"class=“ise.com..SampleBean“ class=“ise.com..SampleBean“singleton=“false"/> singleton=“false"/> デフォルト値は、singleton=“true” Spring 2.0 <beans> id="sample" class=“ise.com..SampleBean" scope=“prototype"/> <beans> id="sample" class=“ise.com..SampleBean" scope=“prototype"/> Spring 2.0で利用可能なスコープ Spring 2.5 スコープ @Scope("session") @Scope("session") public publicclass classShoppingCart ShoppingCart{ {...} ...} Spring x Hibernate連携例 Employee DaoDB2 Injection Spring A社用 DB B社用 DB 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 詳細 singleton アプリケーション開始と終了までのスコープ prototype 取得されるたびに新しいBeanが作成されるスコープ request ServeltAPIのリクエストスコープ session ServletAPIのセッションスコープ globalSession Portlet APIのグローバルsessionスコープ singletonでは、意図したDBに 接続できない可能性がある スコープの設定に注意 マルチスレッド環境で判明する事象がある 24 Spring 1.xまでは、利用可能なスコープがsingletonかprototypeのみでしたが、Spring2.0にて request / session / globalSessionが追加されました。Beanのライフサイクルの種類が増え、ライフサイ クルの広いほうから狭いほうを参照できるようになりました。また、独自のライフサイクルの仕組みを作 成することも可能です。 (注意1) デフォルト値がsingletonの場合、上図のようにDI/AOPによってDB接続先を切り替えている場合、意 図したDBに接続できない可能性があります。また、このような事象はマルチスレッド環境でテストする 必要があります。マルチスレッド環境は、システムテスト等、プロジェクトの後半にならないと実施され ないケースが多いかと思いますので、事前に確認項目をリストアップされると良いと思います。 (注意2) sessionスコープを定義したBeanは、セッションタイムアウト/セッション破棄まで残ります。同一session からマルチスレッドで実行した場合、同期しないと状態が壊れてしまいますので、ご注意下さい。(通 常のセッションと同様です。開発者が意識しないで使用できることが考慮点です。) <補足> singletonとは、インスタンスが1個しか存在しないことを保証するJ2EEデザインパターンです。 prototypeとは、クラスからインスタンスを生成するのではなく、インスタンスから別のインスタンスを作 成するJ2EEデザインパターンです。下記のようなケースでメリットがあります。 ・種類が多すぎてクラスにまとめられない場合 (1つ1つを別のクラスにしていたら、ソースファイルを多数生成する必要が生じてしまう) ・クラスからインスタンス生成が難しい場合 (グラフィックエディタ等でユーザがマウス操作によって作り上げたインスタンス) ・フレームワークと生成するインスタンスを分けたい場合 (インスタンスを生成するときのフレームワークを、特定のクラスに依存しないように作りたい) 24 02. フレームワーク フレームワークの発展 ~Seasar編 Seasar登場の背景、特徴 J2EEを易しく・優しく SpringよりLight-weightなコンテナ より設定ファイルの記述量が少ない より実用的な仕様 Hot Deploy機能 主な構成例 S2Struts + S2DAO SAStruts + S2JDBC S2Struts(SAStruts) + S2Hibernate Spring/Seasar選択指針例 思想 Spring:汎用的な機能を提供するDIコンテナ Seasar:DIコンテナを中心としたWebアプリ ケーションフレームワーク 情報量 日本語はSeasar、英語を含めるとSpring DIコンテナとしての機能 ほとんど変わらない 市場 Seasarは日本のみを対象とする 構成指針例 SQLを書きたい、Daoパターンを好む → S2Dao SQLを書きたい、Javaオブジェクトとテーブルは同一構造で良い → S2JDBC テーブルに引きずられなく、 Javaオブジェクトをモデリングしたい → S2Hibernate 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 25 Seasarのテーマは「J2EEの解体と再構築、易しさと優しさ」です。J2EEの複雑さを取りのぞき、トラン ザクション管理や接続プールといったJ2EEの良いところだけを、なるべく軽く、簡単に利用できるよう にしています。SpringよりもLight-weightなコンテナを目指しています。 SeasarとSpringの選択指針は、DIコンテナの機能としてはほとんど変わらないため、SeasarがDIコン テナを中心としたWebアプリケーションフレームワークを思想としている点と日本のみをターゲットとし ている点になるかと思います。また、SeasarはSpringと同様にStrutsやHibernateと連携することができ ます。主な構成例として、S2Struts + S2DAO、SAStruts + S2JDBC、S2Struts (SAStruts) + S2Hibernateなどが挙げられます。(詳細は参考資料を参照) <参考情報> ・DTO (Data Transfer Object) EJBにて開発した場合、リモートとのやり取りのたびに通信が発生するため、パフォーマンスの悪化 を解消するために用いられるJ2EEデザインパターンのひとつになります。このやり取りの回数を減ら すためにDTOオブジェクトに一度に多くのデータを詰め込んでやり取りを行い、パフォーマンスを向 上させます。DTOはデータを保持するという点に特化しているため、振る舞いを持たないPOJOのク ラスになります。現在は、EJB以外の場合でも、レイヤー間でデータを受け渡す際に入れ物としての 役割を果たしています。 ・Hot Deploy機能 通常のクラス・ローダーは、委譲モデルに従ってクラスのロードを親クラス・ローダーに委ねますが、 Seasarが提供するHotdeployClassLoaderは、未ロードのクラスを親クラス・ローダーに委譲することな く自分自身でロードします。こうすることで、クラスがアプリケーションサーバーのクラス・ローダーに ロードされることを防ぎ、リクエスト毎にロードし直しますことで、アプリケーションの再デプロイすること なく、Javaコードの修正を反映することが可能になっています。再デプロイが発生しないため、待ち 時間の発生やセッション情報の喪失を防ぐことができます。 ・WASとSeasarとの連携については、下記リンク先資料をご確認下さい。 http://www.ibm.com/developerworks/jp/views/java/libraryview.jsp?search_by=Seasar2&S_TACT=1 05AGX90&S_CMP=content 25 02. フレームワーク フレームワークの発展 ~Ajax対応 Ajaxアプリケーション開発の課題 JavaScriptのスキル習得 ブラウザの非互換、非同期通信の実現方法、データ変換(XML or JSON) 等 Ajaxアプリケーション開発フレームワーク DWR (Direct Web Remoting) クラス名.メソッド名 JavaScriptからサーバー側のJavaオブジェクトを呼び出す GWT (Google Web Toolkit) HTML HTML/ /JavaScript JavaScript function functioneventHandler(){ eventHandler(){ AjaxService.execute(callback); AjaxService.execute(callback); }} Javaで作成したクライアントアプリケーションを、 JavaScript+HTMLアプリケーションに変換する function functioncallbackr(data){ callbackr(data){ dwr.util.setValue(“result”、data); dwr.util.setValue(“result”、data); }} 選択指針例 メッセージ:Hello DWR! JavaScript開発の難しさ JavaScriptで開発するか? Javaで開発するか? DWR: GWT: Java経由により開発速度、柔軟性、表現力が犠牲になる JavaScriptよりJavaで開発する方が、質の良いコードが書ける 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 26 Ajax (Asynchronous JavaScript + XML)とは、名前が示す通りJavaScriptで作成されたブラウザー 上で稼動するアプリケーションです。JavaScriptやCSS、HTMLのみを使用してリッチなユーザーイン ターフェースを作成します。また、画面表示後は画面全体ではなく必要な部分のみ書き換えることに より、アプリケーションの画面遷移をよりユーザーが使い易い様に設計することが可能です。部分的 なデータの送受信には、HTTPプロトコルを用い、データフォーマットはXMLかJSONを使用すること が多いです。 Ajaxアプリケーションを開発するためには、JavaScriptに関するスキルを取得しなければいけない、 ブラウザの非互換性を解決しなければいけない、非同期通信の実現方法、サーバーとクライアント 間のデータ変換方法(XML or JSON)等を検討する必要がありました。 DWRは、JavaScript-Java連携用フレームワークです。Ajax独特の複雑なJavaScriptを必要とせず、 JavaScript内で「クラス名.メソッド名」と記述することによって、Javaの該当メソッドを透過的に呼び出 すことが出来ます。DWRはわかりやすいことに加えて、様々なフレームワークとの連携が容易である ため、スクラッチでJavaScriptを大量にコーディングしたり、GWT (Google Web Toolkit)のようにガチ ガチにフレームワークに縛られることに抵抗感を覚えるJava技術者にとって、最適なフレームワークと 言えます。 GWTは、クライアントアプリケーションをJava言語で作成し、それをJavaScript+HTMLアプリケー ションに変換するというフレームワークです。言い換えますと、Ajaxアプリケーション開発の際に JavaScriptを書く必要がありません。 そのDWRとGWTの選択指針は、一概には言えませんが、「Javaで開発するか、JavaScriptと開発す るか?」で判断できるかと思います。GWTを使用するメリットとしてJavaScriptよりJavaで開発すること により、質の良いコードを書くことができます。もちろん、スキルフルなJavaScript技術者であればその 限りではありませんが、Java開発よりエラーメッセージの意味がわかりにくく、テスト(jsUnit等)の準備 作業が大変です。反対に、Javaで開発することにより、軽量プログラミング言語(JavaScript)の特徴で ある開発速度、柔軟性、表現力が犠牲になります。 26 02. フレームワーク Java EE 5におけるフレームワーク選択指針 MVC フレームワーク 標準重視 or オープン技術 - JSFは標準、Strutsはオープンソース 成熟度・実績 - 実装の成熟度・実績では、(かなり)Strutsがリード StrutsとJSFの共存、Facelets / Myfaces (JSFの開発生産性向上と機能拡張) O/Rマッピング フレームワーク 標準重視 or オープン技術 - JPAは標準、Hibernate/iBATISはオープンソース 成熟度・実績 - 実装の成熟度・実績では、(若干)Hibernateがリード - HibernateとEJB 3.0(JPA)は機能的に非常に類似 SQLの生成 - SQL文をより自由にチューニングしたい場合に、iBATISが向いている DI / AOP フレームワーク 標準重視 or オープン技術 - EJB3.0は標準、Spring/Seasarはオープンソース 成熟度・実績 - 実装の成熟度・実績では、Springがリード 分散システムの構築 -分散システムを構築する場合は、EJB 3.0 ・標準を重視するか、実績のあるオープン技術を選択するかを念頭に置き、 プロジェクト要件とフレームワークの特性を突き合わせる ・Java EE 5では、JSF/EJB/JPAが十分な選択肢である 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 27 Java EE 5のフレークワークの選択指針をまとめたチャートになります。また参考資料にて、フレーム ワーク毎に特徴やメリット/デメリット等をまとめていますので、合わせてご確認下さい。 Java EE 5におけるフレームワークの選択指針は、JDK1.4と同様に、「標準を重視するか、実績の あるオープン技術を選択するかを念頭に置き、プロジェクト要件とフレームワークの特性を突き合わ せる」ではないかと思います。JDK1.4と異なるのは、JSF/EJB/JPAが十分な選択肢となったことです。 アーキテクチャーだけを考慮すれば、オープンソースよりも優れている標準のフレームワークもありま す。また、今後はより標準とオープンソースのフレームワークを組み合わせた事例が増えていくので はないかと推測します。 <補足> :JSFとStruts JSFは概念的にはStrutsと同等の機能を持ち、 より洗練された優れたアーキテクチャになっている と言えます。 (JSFのスペックリードをStrutsを開発したCraig McClanahan氏が務めています。)また、 JSFをStrutsのフロントエンドとして利用し,ビジネスロジックの呼び出しやフロー制御はStrutsを利用 することも可能です。 主な違いは、JSFはPOJOベースの実行環境である点です。Strutsでは、HTMLフォームに入力さ れたHTTPパラメータは、 StrutsのActionFormサブクラスのプロパティに格納されます。 そして、プレ ゼンテーション層とビジネス層を疎結合にするため、 ActionFormのプロパティをPOJOなバリュー・オ ブジェクトに移し替えてから、 ビジネス・メソッドの引数とするのが一般的です。 一方、JSFは、HTML フォームを構成するJSP上の入力コンポーネントから、 JSF-EL を使用して、 直接POJOなオブジェク トのプロパティに入力値を設定することができます。 また、Strutsを採用するとデファクトスタンダード であるがゆえに他社との差別化が難しい、バージョンアップ時の互換性の保証がないという懸念点も あります。(しかし、現状としては、あまりJSFの実績はありません。) 入力フォームのページに入力パラメータが数十個あったとすると、StrutsのActionFormでは数十個 のsetter / getterがずらりと並ぶ数百行のソースコードになります。そのため、場合によっては、 ActionFormのパラメータをきれいなビジネス・オブジェクトのツリー構造に変換するためのフレー ム ワーク開発が別途必要になります。JSFのページの場合はこのようなオブジェクトマッピングのための 追加開発は必要なく、JSF-ELのバインディング を定義するだけで、複雑なオブジェクト・ツリーへの 変換が可能です。また、JSFの実行環境は、セッター・インジェク ションに限定されますが、DIコンテ ナとしての機能を持っています。ビジネス層の入出力となるオブジェクト・ツリーとアクション・メソッドを 含むバッキン グ・ビーンとの依存関係は、JSF設定ファイルのタグで依存性の注入を行うことができま す。 27 02. フレームワーク 2~3年後を見据えたフレームワーク選択指針 解決されていないフレームワークの課題 XML設定ファイルの更なる簡便化 複数のフレームワーク連携による、XML設定ファイル地獄 フルスタックフレームワークによる、パフォーマンスの劣化 開発コストの削減 Contexts and Dependency Injection Java EE 6 Slim3 vCloud Seasar VMware / Spring 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 28 続いて、2~3年後を見据えたフレームワークの選択指針を考えます。Java EE 5時代でも解決され ていないフレームワークの課題として、XML設定ファイルの更なる簡便化があります。また、そもそも 複数のフレームワークを連携するからXML設定ファイル地獄が発生すると考えられ、フルスタックフ レームワークが解決策なのですがパフォーマンスが悪くなるという別の問題が発生してしまいます。 また、いつの時代でも出来る限り開発コストを削減したいという要望があります。 この課題を解決するキーワードが「軽量フルスタック」と「クラウド」になり、そのキーワードを実現す るテクノロジーが、「Contexts and Dependency Injection」と「Slim 3」、「vCloud」ではないでしょうか。 <参考情報> ・Amazonの提供するWebサービス群(Amazon EC2/S3/EBS/SQS)をEclipseから利用するためのツー ルを提供するプロジェクト http://sourceforge.jp/projects/eclipse-aws/ ・Myfacesの主な機能 (JSFのオープンソースによる実装) - 画面遷移をビジュアルに構成できるグラフィカル・ナビゲーション・フロー・デザイナー - faces-config.xmlファイルのソースを直接編集できる拡張XML ソース・エディター - faces-config.xmlファイルの構成要素の種別ごとに構成できるFaces構成エディター - faces-config.xmlファイルの各構成要素を簡単に構成するための様々なウィザード ・Faceletsの主な機能 (JSFを作成するためのフレームワーク ) - JSF 1.1とJSF 1.2をサポート - テンプレートの作成と利用(Tilesのように) - 合成コンポーネント - カスタムロジックタグ - ELファンクション - デザイナーフレンドリーなページ開発 - コンポーネントライブラリの作成 - Webコンテナに依存しない 28 02. フレームワーク 軽量フルスタック・フレームワーク Contexts and Dependency Injection Java EE 6にて取り込まれるフルスタックのWebアプリケーションフレームワーク JBoss Seamにより実現されているJSF、EJB、JPAの統合 (JSR-299) Java EEの統合コンポーネントモデル 疎結合かつ、厳密な型システムの提供 ステートフルなコンテキストの扱い JSP POJO POJO @NAME (“xxx”) @NAME (“xxx”) JSF Slim3(Simple POJO NAME EJB Java EE 6 and Less Is More) JPA アノテーション による連携 アジャイルな開発のためのフルスタックのWebアプリケーションフレームワーク Hot deployment Less configuration Less Learning Cost Slim3 Struts Slim3 JDBC Struts JDBC Slim3 Container Spring 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop ≒SAStruts 設定ファイルの必要がない Seasar Hot Reload機能 Spring設定ファイル トランザクション管理、接続プール →Spring機能 29 「Java EEに統合されたコンポーネントモデル」 いくつかのアノテーションを使うだけでEJBとJSFをつなぎ合わせることができるのが、特徴です。 「疎結合を目指しながら、厳密な型システムを提供する」 アノテーションやメタアノテーションにより、型の安全性を犠牲にすることなく疎結合を実現します。 「ステートフルなコンテキストの扱い」 今までのJava EEでは、ステートレスなサービスかスコープに状態を保持するのが主流でしたが、複 数のリクエストに渡って状態を保持できる対話 (Conversation) コンテキストがあります。 「HOT deployment(生産性向上)」 アプリケーションサーバを稼働させたままソースコードの修正が即座に反映される機能です。Rubyな どのLLと同様に迅速な開発が可能になり、生産性が大きく向上します。 「Less configuration(少ない設定)」 CoC (Convention over Configuration)とアノテーションの組み合わせによって設定ファイルを減らし ます。コードの書き方などで規約を守っていれば、フレームワークが自動で設定を行ってくれます。 CoCを使うと設定ファイルが減りますが、多用すると規約を知らない人には分かりづらく、生産性も上 がらないという面もあります。また、Java EE 5のアノテーションの流行により、 1行のコードにいくつも のアノテーションを定義しアノテーション地獄が発生しています。 「Less Learning Cost(少ない学習時間)」 Struts 1.2系の上に「Slim3 Struts」が、JDBCの上に「Slim3 JDBC」が、DI/AOPコンテナとしてSeasar ではなくSpringの上に「Slim3 Container」が乗る構成になっています。Slim3 StrutsはSeasar2の SAStrutsに近いイメージです。Strutsを使いつつ、struts-config.xmlなど面倒な設定ファイルを定義 する必要がありません。Slim3 Containerは、Seasar2から設定ファイルをなくしたイメージになり、設定 ファイルを使う場合はSpringの機能を使うことができ、 Seasar2のHot Deploy (Reloading)機能を搭載 しています。ユーザーからの変更が入りやすい要件は、HOT Deploy機能によってSlim3 Container 上のコンポーネントとして動かします。トランザクション管理やコネプションプール管理など非機能要 件は、Springをそのまま使うことが想定されています。 29 02. フレームワーク クラウド対応フレームワーク 開発環境クラウド化によるコスト削減 構築コストの低下、構築時間の短縮 リソース・ニーズの有効活用 Slim3 Application Middleware OS Hardware (Simple and Less Is More) Google App Engineに最適化した Webアプリケーションフレームワーク V-Cloud PaaS → PaaSソリューション クラウド・サービス間の相互運用性を実現するAPI DMTF (Distributed Management Task Force) オープンクラウドインキュベーターに提出 V-Cloud Public Cloud 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop Private Cloud 30 IaaS (Infrastructure as a Service)は、CPUやストレージをクラウド基盤に配置し、サービスとして提 供します。Amazon® EC2やAmazon® S3が当てはまります。Paas (Platform as a Service)は、アプリ ケーション稼動プラットフォームをクラウド基盤に配置し、サービスとして提供します。Force.com、 Google® App EngineやWindows Azureが当てはまります。 ・ DMTF システム運用管理のためのH/W、S/W等のインタフェース標準化活動を行う国際的な業界団体。 ・VMotion 稼働中の仮想マシンを停止させることなく、しかもクライアントからのセッションも維持したまま、別の VMware ESX Server上に移動させる技術のこと。 ・Developer: VMware vCloud™ API http://communities.vmware.com/community/developer/forums/vcloudapi VMware vCloud API は、vCloud 構想の幅広いアプリケーションとサービス プロバイダの相互運用 性を支えています。この API は、プライベート クラウド リソースへのプログラムからのアクセスを可能 にし、既存のプライベートクラウドを活用するサービスとアプリケーションの提供をサポートしています。 Public/Privateクラウドの両方で、より効率的なアプリケーションの開発、実行、管理が可能に 【2009 年 9 月 16 日 (米国時間)米カリフォルニア州発】 VMware, Inc. (NYSE: VMW) は2009 年 8 月10 日に買収を発表したエンタープライズおよび Web アプリケーション開発・管理のリーディング 企業、SpringSource の買収が正式に完了したことを発表します。今回の買収完了により、 SpringSource は、VMwareの一部門となり、SpringSourceの創業者でCEOであるRod Johnson氏 が ジェネラル マネージャとして本部門を統括します。この新しい部門では、あらゆるプラットフォーム上 の企業向けアプリケーションやWebアプリケーション開発者に対して、引き続き最も優れた環境を提 供していくことに注力していきます。また、それに加えVMwareはSpringSourceの技術とVMware vSphere™との組み合わせにより、容易に「開発、実行、運用」可能な統合製品の開発を推し進めて いきます。これらの新製品は、VMwareの戦略である顧客のデータ センターまたはサービス プロバイ ダの施設でホストされるプラットフォームをサービスとして提供する、PaaSソリューションをさらに拡大 するものです。 30 02. フレームワーク Rod Johnson氏 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop Spring Frameworkの開発者 VMWare社 ジェネラルマネージャー 31 31 02. フレームワーク 3.Java EE 6 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 32 フレームワークのセッションで、Java EE 6が説明されることに疑問を持たれた方もいらっしゃるかと 思います。ご説明する理由は、小規模のサンプルアプリケーションをJava EE 6にて作成してみたとこ ろ、Contexts and Dependency Injectionを含めて、Java EE 6が今後のフレームワークのデファクトス タンダードになる可能性を感じたからです。今までは、Struts/Spring/Hibernateがフレームワーク選 定の前提であるケースが多かったかと思いますが、 今後はJava EE 6が前提で足りない機能をオー プンソース・フレームワークで補完するという時代が来てもおかしくないと推測致します。 32 02. フレームワーク Java EE 6の方針 Proposed Final Draft サイズの適正化 Web Profile (柔軟性) JSF2.0 JSP2.2 Java EE完全版に対するサブセット版 Pruning (軽量化) EL2.2 Servlet3.0 EJB3.1 Lite Java EE 6での削除候補 次期版(Java EE 7)で、“削除”、”必須”、”削除提案のまま”を決定 z JSTL2.2 JPA2.0 JTA1.1 BeanValidation 1.0 JSR 316: JavaTM Platform, Enterprise Edition 6 (Java EE 6) Specification EJB 2.X Entity Beans、JAX-RPC、JAXR、JSR-88(Java EE Application Deployment) 拡張性 オープンソースフレームワーク受容 web.xml のモジュール化 (web fragment) 使い勝手、開発しやすさの追及 Java EE 5からの継続的な進化 アノテーションを活用したプログラムモデル DDの必要性を削減・削除する 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop Lite版 Lite版 ・・Local LocalSession SessionBeans Beans ・・Annotations Annotations/ /ejb-jar.xml ejb-jar.xml ・・CMT CMT/ /BMT BMT ・・Declarative DeclarativeSecurity Security ・・Interceptors Interceptors ・・JPA JPA2.0 2.0 ・・JTA JTA1.1 1.1 完全版=Lite版+α 完全版=Lite版+α ・・Message MessageDriven DrivenBeans Beans ・・EJB EJBComponent ComponentWeb Web Service ServiceEndpoints Endpoints ・・RMI-IIOP RMI-IIOPInteroperability Interoperability ・・2.x/3.x 2.x/3.xRemote RemoteView View ・・2.x 2.xLocal LocalView View ・・Timer TimerService Service ・・CMP CMP/ /BMP BMP 33 ・プロファイル (柔軟性) アプリケーションの特定の分類をターゲットとしたJava EE プラットフォームの構成です。Java EE 完 全版に対するサブセット版であり、JSR-316で、Web Profileを規定されます。 ・オープンソースの受容 web.xml のモジュール化(web fragment) ライブラリ・フレームワーク開発者は、必要があればweb-fragment.xml を用意します。(jar内の META-INFディレクトリ内)。アプリケーション開発者は、自分で開発したコードに関する設定だけを 行い、利用するライブラリ・フレームワークのjarをWeb-INF/lib 内に置きます。Webアプリケーション・ サーバがweb-fragment.xml の検索、その内容の走査を行い、最終的な配布記述子にマージします。 これにより、Java EE 6のフレームワークのセットアップは、WEB-INF/libフォルダにjarファイルを置く だけになります。デフォルトのマッピングであれば環境設定の必要がなく、環境設定ファイルを用意 したりサービスローダーを使用すればカスタマイズしたマッピングが可能です。 Java EE6のプログラムコードの記述・構文については検討中のものであり、確定ではありませんので ご注意下さい。 33 02. フレームワーク 主な構成要素の追加/変更点 Contexts JSF、EJB、JPAの統合 Bean Validation 1.0 (JSR-303) 新規アノテーションを利用したバリデーション JAX-RS and Dependency Injection 1.0 (JSR-299) 1.0 (JSR-311) @Null、@NotNull、@AssertTrue、 @Null、@NotNull、@AssertTrue、 @AssertFalse、@Min、@Max、 @AssertFalse、@Min、@Max、 @DecimalMin、@DecimalMax、 @DecimalMin、@DecimalMax、 @Size、@Digits、@Past、 @Size、@Digits、@Past、 @Future、@Pattern @Future、@Pattern RESTful Web Service に対応 JSF 2.0 (JSR-314) Servlet3.0 (JSR-315) アノテーションによる宣言的プログラミング JPA 2.0 (JSR-317) O/Rマッピングの拡張、Criteria API EJB3.1 WASV7 WASV7Feature FeaturePack Packfor forJPA2.0 JPA2.0 (JSR-318) war内へのパッケージング、シングルトン、非同期、組込み可能なEJBコンテナ 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 34 Bean Validationにより、Java Beanのプロパティが取り得る値の範囲や条件を設定し、実行時に統 一的な方法でそれを検証できるようになります。これにより、WebアプリケーションやGUIアプリケー ションの入力値検証や、オブジェクトの永続化の際のデータ検証などが容易に行えるようになります。 数値プロパティの最大値/最小値の指定や、文字列の長さやフォーマットの指定などが含まると推測 されます。また、このような機能を提供するフレームワークはすでにいくつか実在しており、JSR 303の 仕様もそれらの影響を受けているかと思います。 <参考情報> ・IBM WebSphere Application Server V7 Java Persistence API (JPA) 2.0 Open Alpha https://www14.software.ibm.com/iwm/web/cc/earlyprograms/websphere/wsasjpaoa/index.shtml Feature Packとは、WASに最新の機能を追加してくれるパッケージです。これは、WASの機能拡張 であるので、WASのライセンスのみで使用可能で、サポートも同様に行われます。 FP for Web Services、FP for EJB 3.0、FP for Web 2.0等が公開されています。また、FP for JPAが予定されてい ます。 ・Bean Validationサンプル @Entity public class Employee implements Serializable { private Long id; @NotNull @Length(min=0,max=80) ←最小値と最大値の指定 private String name; @NotNull ←NotNullの指定 private Address address; } Hibernate Validator:https://www.hibernate.org/412.html JSR 303 Bean Validation:http://jcp.org/en/jsr/detail?id=303 34 02. フレームワーク Javaの歴史 Rightsizing Ease of Development Web Services Enterprise Java Platform J2EE 1.2 JPE Project ・Servlet ・JSP ・EJB ・JMS ・RMI/IIOP Robustness J2EE 1.3 ・CMP ・Connector Architecture 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop J2EE 1.4 ・Web Services Management ・Deployment ・Async Connector Java EE 5 ・Ease of Development ・Annotations ・EJB 3.0 ・Persistence ・New and Updated Web Services Java EE 6 ・Pruning ・Extensibility ・Profiles ・Ease of Development ・EJB Lite ・RESTful Services ・Dependency Injection ・WebProfiles 35 35 02. フレームワーク EJB Packaging Java EE 6 / EJB 3.1 EJBSample.war WEB-INF/classes/ com/ise/EJBSampleServlet.class com/ise/EJBSampleBean.class Java EE 5 / EJB 3.0 EJBSample.ear EJBSample.ear EJBSample_web.war lib/EJBSample_common.jar WEB-INF/web.xml WEB-INF/classes/ com/ise/EJBSampleServlet.class com/ise/EJBSample.class com/ise/EJBSample.class EJBSample_ejb.jar com/ise/EJBSampleBean.class com/ise/EJBSample.class EJBSample_web.war OR WEB-INF/web.xml WEB-INF/classes/ com/ise/EJBSampleServlet.class EJBSample_ejb.jar com/ise/EJBSampleBean.class 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 36 36 02. フレームワーク EJB 3.1新機能 シングルトンSession Bean (@Singleton) アプリケーションレベルで一度だけ初期化される カレンダー表記のタイマー // Every weekday at noon // Every weekday at noon ScheduleExpression expr = new ScheduleExpression().dayOfWeek(“Mon-Fri”).hour(12); ScheduleExpression expr = new ScheduleExpression().dayOfWeek(“Mon-Fri”).hour(12); timerSvc.createTimer(expr, null); } timerSvc.createTimer(expr, null); } UNIXのcronに類似 自動生成タイマー 配置時にコンテナがタイマを自動的に生成 @Schedule アノテーションの追加 @Schedule(dayOfWeek=”Mon”) @Schedule(minute=”15”, hour=”3”, dayOfWeek=”Mon-Fri”) 非同期処理 // 毎月曜日深夜0:00 // 月~金の午前3:15 (@Asynchronous) @Local public interface EmployeeHandler { @Local public interface EmployeeHandler { @Asynchronous @Asynchronous public void processEmployee(Employee Employee); } public void processEmployee(Employee Employee); } 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop EJBで非同期呼び出し ローカルインターフェースにて指定 37 EJB3.1の新機能として、シングルトンSession Beanが追加されます。シングルトンという名前の通り、 アプリケーションレベルで一度だけ初期化されます。(サンプルは、参考資料をご確認下さい。)その 他に、カレンダー表記および自動生成のタイマー機能が追加されます。上記のようにUNIXのcronに 似た文法で、スケジュールを設定することができます。また、@Scheduleアノテーションにてスケ ジュールを設定することができます。これらは、JBoss Seamの考え方が取り入れられていると推測で きます。 37 02. フレームワーク Servlet 3.0新機能 @WebServlet、@WebFilter、@WebInitParam、 @MultipartConfig @WebServlet( name=“mytest”, urlPatterns = {“/myurl”}, initParams = { @WebInitParam (name="n1", value="v1")) @WebServlet( name=“mytest”, urlPatterns = {“/myurl”}, initParams = { @WebInitParam (name="n1", value="v1")) public class TestServlet extends javax.servlet.http.HttpServlet { public class TestServlet extends javax.servlet.http.HttpServlet { 初期パラメーター public void doGet(HttpServletRequest req, HttpServletResponseres res) { ... } public void doGet(HttpServletRequest req, HttpServletResponseres res) { ... } } } @WebServlet("/upload") @WebServlet("/upload") @MultipartConfig(maxFileSize=10) @MultipartConfig(maxFileSize=10) public publicclass classNewServlet NewServletextends extendsHttpServlet HttpServlet{ {… … Servlet、Filterの動的登録 サイズ制限 ファイルアップロード処理 / 動的検索(Lookup) ServletRegistration.Dynamic dynamic = servletContext.addServlet ("MyServlet"); ServletRegistration.Dynamic dynamic = servletContext.addServlet ("MyServlet"); dynamic.addMapping ("/MyServlet"); dynamic.addMapping ("/MyServlet"); 非同期処理用のAPI ServletRequest AsyncContextServletRequest AsyncContext AsyncListener 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 38 Servlet 3.0ではEoDをさらに促進するため、ServletやFilterなどを定義するためのアノテーションが 用意される予定となっています。これにより、コードの記述量の削減やweb.xmlなどに対する設定の 簡略化が実現されます。 @WebServlet – Define a Servlet @WebFilter – Define a Filter @WebListener – Define a Listener @WebInitParam – Define init params @MultipartConfig – Define fileupload Can use web.xml to override values specified in the annotations ・非同期処理用のAPI ServletRequest isAsyncSupported(), setAsyncTimeout(long) AsyncContextServletRequeststartAsync(), startAsync(ServletRequest, ServletResponse) AsyncContextdispatch(), dispatch(String), complete() AsyncListenerOnTimeout(AsyncEvent), OnComplete(AsyncEvent) <コラム> Java EE 6ではJava EE 5と同様に、アノテーションを活用して設定ファイルを削減・削除する流れに なっています。Servlet2.5にて@Resourceが追加され、データソース等のリソース参照をweb.xmlに定 義する必要がなくなりました。Servlet3.0では@WebServletが追加され、サーブレットマッピング情報 をweb.xmlに定義する必要がなくなりました。アノテーション地獄という言葉が出てきていますが、必 ずしも全てのケースでアノテーション化することがより良いと限りません。運用、メンテナンスを考慮し、 何をアノテーションで定義し、何をweb.xmlで定義するかの開発標準を制定することが重要になると 思います。 38 02. フレームワーク 4.まとめ 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 39 39 02. フレームワーク フレームワーク 選択指針 まとめ Java EE 5における選択指針 標準を重視するか、実績のあるオープン技術 JSF / EJB / JPAも十分な選択肢である JSP POJO POJO POJO NAME @NAME (“xxx”) @NAME (“xxx”) JSF EJB JPA Java EE 6 2~3年後の見据えた選択指針 軽量フルスタック クラウド Contexts and Dependency Injection Slim3 vCloud Java EE 6 今後のスタンダードとなる可能性を秘めている 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop VS Slim3 Struts Slim3 JDBC Struts JDBC Slim3 Container Spring VS V-Cloud Public Cloud Private Cloud VMware / Spring → PaaSソリューション 40 40 02. フレームワーク 参考資料 WAS V6.1 Feature Pack for EJB 3.0 ワークショップ http://www.ibm.com/developerworks/jp/websphere/library/was/was61_ejb3fep_ws/ WAS Feature Pack for Web2.0 ワークショップ http://www.ibm.com/developerworks/jp/websphere/library/was/was_web20fep_ws/ WebSphere Application Server 最新動向ワークショップ http://www.ibm.com/jp/software/websphere/developer/was/wv61/workshop/ Using Spring and Hibernate with WebSphere Application Server http://www.ibm.com/developerworks/websphere/techjournal/0609_alcott/0609_alcott.html Developing Hibernate applications for use with WebSphere Application Server http://www.ibm.com/developerworks/websphere/techjournal/0409_patil/0409_patil.html WAS × Webフレームワーク連携手法 http://www.ibm.com/developerworks/jp/websphere/library/was/was61_framework/2004.html 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 41 41 02. フレームワーク 参考資料 ~フレームワークの種類 過渡的な状況 MVCフレームワーク JSF、Struts、Tapestry、Shale、Velocity O/Rマッピングフレームワーク JSF Servlet/JSP Hibernate、JPA、iBATIS 、TopLink DI/AOPフレームワーク Spring、Seasar 機能に特化したフレームワーク パフォーマンス (ページング) JDBC セキュリティー S2Pager Spring Security (Acegi) Javaバッチ Spring Batch、TERA EJB 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 42 Java EEが提供している標準のフレームワーク、 オープンソースのフレームワーク、さらにはIBMの WACsやNRI様のObjectWorksと言ったベンダーが提供している有償のフレームワークがあります。 まさに過渡的な状況にあり、次世代のより洗練されたフレームワークが台頭し始めようとしています。 また、Wikipediaでは数十のフレームワークが存在していることが確認できます。 より特定の機能に特化したフレームワークもあります。例えば、ページングとは、データベースの検 索結果等に対して、1ページに表示する件数を制限し1アクセスのデータ量を削減することができる 機能になります。この機能は、S2Pagerというフレームワークによって提供されています。(アプリケー ションで対応する場合、DB2:rownumber()/over ()、Oracle:RowNoを実装する必要があります。S/W で対応する場合、DB2ワークロード管理機能を実装する必要があります。)セキュリティーでは、 Spring Securityというフレームワークによって、認証・認可の仕組みが提供され、セキュリティーに関 するコーディング量を削減することができます。Javaバッチは、オープンソースフレームワークでは長 い間空白域でしたが、Spring BatchやTERA、JBeX(IBMアセット)などが登場しています。(WACsV6.0 にてJbexを取り込んでいます。) <参考情報> ・Wikipedia - 「Comparison of web application frameworks」 http://en.wikipedia.org/wiki/List_of_web_application_frameworks ・S2Pager http://s2dao.php5.seasar.org/pager.html#S2Pager ・Spring Security概要 認証:FORM 認証、SHA-1/MD5 などのアルゴリズムで暗号化されたパスワードとの照合、RDBMS による認証情報の管理、 認証後の旧セッションの破棄,および新セッションの生成 認可:ロール/時間によるURL毎のアクセス制御、 認証されていないユーザのアクセス制御 その他:セッションタイムアウト時のハンドリング ・Acegi を使って Java アプリケーションをセキュアにする https://www.ibm.com/developerworks/jp/java/library/j-acegi1/ 42 02. フレームワーク 参考資料 ~フレームワーク解説 MVCフレームワーク 画面遷移や入力値チェック等、Webアプリケーション基本機能 MVCアーキテクチャーに従って、必要な機能を提供 コンポーネント間の独立性により、生産性・保守性が向上 Model部分や基盤部分に他フレームワークの利用や作りこみが必要 プレゼンテーション部分の開発生産性向上のための仕組みが必要 メリット: 考慮点: O/Rマッピングフレームワーク メリット: 考慮点: オブジェクトとリレーショナルデータベース間のマッピング手法 DBとマッピングされたJavaオブジェクトを操作し、データにアクセス マッピング作業の自動化により、生産性・保守性が向上 異なるRDBMSによるSQLの違いを吸収 パフォーマンス・チューニング時にSQLを意識する必要がある 内部的に発行しているSQLはチューニングができない場合がある DI/AOPフレームワーク メリット: 考慮点: 組み合わせ例 MVCのみ MVC+O/Rマッピング WACs、Struts JSF + Hibernate MVC+DI/AOP Struts + Spring MVC+DI/AOP+OR Struts + Spring + Hibernate DI/AOPの機能を統合した基盤フレームワーク コンポーネント間を疎結合としPOJOとすることで、保守性・再利用性が向上 設定ファイルの外部化、コンポーネント間管理が複雑になる 実行時までバインディングが正しいかどうか確認できない AOPを使用した場合は、パフォーマンスを考慮する必要がある 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 43 43 02. フレームワーク 参考資料 ~フレームワーク選定の考え方 プロジェクト要件 フレームワーク特性 前提条件 ・動作環境 ・コスト ・サポート状況 ・フレームワークの前提 前提条件 ・開発期間 ・開発プロセス ・スキル ・契約 ・環境 提供機能 ・画面フロー制御 ・入力チェック ・トランザクション制御 ・ログ出力 ・DBアクセス 非機能要件 ・パフォーマンス ・セキュリティー ・運用 / 障害 機能要件 ・アプリケーション ・データ フレームワーク 選定 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop その他 ・アーキテクチャー 44 フレームワークを選定する場合には、プロジェクト要件とフレームワーク特性を突き合わせることが 重要になります。 <前提条件> 提供形態: ソース・コードが提供されるのか 動作環境: フレームワークの稼動条件(OS、Webアプリケーション・サーバー、RDBMS) 実績: 適用事例の規模/件数 コスト: ランタイム・ライセンス、開発ライセンス、開発ツールの使用料 サポート: ソフトウェア保守、導入サポート、技術サポート、研修、提供ドキュメント、 サポート期間 生産性向上のためのアセット提供: 開発ツールや業務パッケージや、仕様書テンプレートの提供 開発手法:開発プロセスの規定、必要スキル、 開発に必要となるスキル ライセンス条件: アプリケーションの著作権、展開時の条件、カスタマイズ時の条件 44 02. フレームワーク 参考資料 ~フレームワークの特性 基本機能 基本機能 プレゼンテーション層 プレゼンテーション層 (MVCフレームワーク) (MVCフレームワーク) その他 その他 ログ・トレース ログ・トレース メッセージ・カタログ メッセージ・カタログ サービス開閉 サービス開閉 セキュリティー(認証、認可) セキュリティー(認証、認可) 起動時の初期化 起動時の初期化 終了時の終了処理 終了時の終了処理 例外処理 例外処理 リクエストと処理のマッピング リクエストと処理のマッピング 画面フロー制御 画面フロー制御 複数ウィンドウへの対応 複数ウィンドウへの対応 入力チェック 入力チェック ファイル送受信 ファイル送受信 入出力データ変換 入出力データ変換 流量制御 流量制御 ライブラリー ライブラリー ページング ページング レイアウト機能 レイアウト機能 国際化対応 国際化対応 マルチ・クライアント対応 マルチ・クライアント対応 機能制約 機能制約 (2PC処理、クラスター環境) (2PC処理、クラスター環境) テスト容易性 テスト容易性 開発生産性 開発生産性 移行容易性 移行容易性 ビジネス層 ビジネス層 (DI/AOPフレームワーク) (DI/AOPフレームワーク) トランザクション制御 トランザクション制御 ビジネス・ロジック・テンプレート ビジネス・ロジック・テンプレート 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop インテグレーション層 インテグレーション層 O/Rマッピングフレームワーク O/Rマッピングフレームワーク DBアクセス DBアクセス メッセージング機能 メッセージング機能 メール送信機能 メール送信機能 帳票出力機能 帳票出力機能 外部接続機能 外部接続機能 45 45 02. フレームワーク 参考資料 S2Struts + S2DAO ~Struts/Seasar特徴比較 SAStruts + S2JDBC S2truts(SAStruts) + S2Hibernate コンセプト SQLが中心 Entityとテーブルが同一モデル Entityが中心 SQL生成 検索処理は開発者が作成 挿入/更新/削除は自動生成 複雑なSQL以外は自動生成 Hibernateから継承やLazyロードな どの機能を削除 ほとんどのSQLが自動生成 メリット SQLを開発者が書くため、トラ ブルが発生しにくい 学習コストが低い SQLをほとんど書かなくてよい 同一モデルなので、インピーダンスミ スマッチが発生しにくい Hibernateと比較して、マッピングの 仕様がシンプルで学習コストが低い 機能が限定されているため、トラブル が発生しにくい 機能が豊富である エンティティの設計がデータベースに引き ずられることなく、そのドメインを正確に 表したものになる デメリット SQLを書くのが面倒 検索の結果セットごとにDTOを 作成するため、DTOが増える傾 向がある Entity設計が、テーブルに引きずら れ、完全にドメインを表したものにな らない 学習コストが高い 自動生成されてたSQLの効率が悪くな るリスクがある 継承やLazyロードによってパフォーマン スが悪化するリスクがある 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 46 46 02. フレームワーク 参考資料 項目 ~EJB 3.0/Spring特徴比較 EJB3.0 Spring サポート・開発 JCPで規定された標準。仕様は主要なJ2EEサーバー・ベン ダーなどの関係者が合意。実装は各J2EEサーバー・ベンダー がサポート。 オープンな(Interface21 Inc)開発、管理。非標準 主目的 エンタープライズ・サービスに必要となる機能をコンテナとして 提供することを目的とし、開発・テスト容易性にも対応 Dependency Injection (DI)をベースとしたアーキテクチャーに よる、軽量、開発/テスト容易なフレームワーク DBアクセス EJBの仕様として、JPAを使用 他のO/Rマッピング・ツールとの統合が容易(JPAもそのうちの 一つ) トランザクション JTAトランザクション・マネージャーを使用 JTAトランザクション・マネージャーだけでなく、Spring独自や、 O/Rマッピング・ツールが提供するトランザクション・マネー ジャーも使用可能 セキュリティ アノテーションまたはDDによる宣言的セキュリティーをサポート 宣言的セキュリティーをサポートするオープンソースのAcegiフ レームワークとの統合をサポート リモートアクセス リモート・アクセスを主要な機能の一つとし、トランザクションや セキュリティー属性の伝播も可能 フレームワークとしては、もともとリモート・アクセスは重視してい ない テスタビリティー ほとんどのコンポーネントは、コンテナ外でテスト可能 すべてのコンポーネントをコンテナ外でテスト可能 DI Java EE の特定の型 (EJBやデータソースなどのリソース) 任意のPOJOをInjection可能 AOP EJB (Beanまたはメソッド) のみがスコープ 任意のPOJOをスコープとできる 設定の特徴 アノテーションを多用(DD(XML)での設定も可) XMLの構成ファイルを多用(アノテーションでの設定も可)。 成熟度 まだ、実装は広くは使われていない 広く使われている 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 47 47 02. フレームワーク 参考資料 項目 ~JPA/Hibernate/iBATIS特徴比較 EJB 3.0 /JPA Hibernate 特徴 Hibernateの影響を強く受 けたJCP標準 JavaEE5へ移行を予定して いる場合。JPAを選択する 機能が豊富にあり、オブジェクトクエリ 言語の「HQL」や、シンプルで扱いやす いAPIを提供 アノテーション機能がないJDK1.4環境 を利用している場合、Hibernateを選 択する SQL文をマッピングファイルに記述 メリット Hibernateに準じる 標準準拠 アノテーションでO/Rマッピン グを定義する 機能が豊富 Java開発者は、関連を意識しなくて もよい SQLレスの開発ができる 永続化オブジェクトクラスのコードから、 O/Rマッピング定義を分離する SQLの機能が生かせる パフォーマンスチューニングなどの柔軟 な対応が可能 デメリット Hibernateに準じる 実装の実績が少ない 関連を多用するとパフォーマンスに影 響 習得に時間が必要 マッピング・ファイルにSQL文を記述す るため、マッピング・ファイルの管理が 煩雑になる 情報が比較的少ない 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop iBATIS 48 48 02. フレームワーク 参考資料 ~DWRの仕組み DWR 利用イメージ HTML HTML/ /JavaScript JavaScript function functioneventHandler(){ eventHandler(){ AjaxService.execute(callback); AjaxService.execute(callback); }} Java Java public class AjaxService{ public class AjaxService{ public String execute(){ public String execute(){ return “Hello DWR!”; return “Hello DWR!”; } } } } クラス名.メソッド名 function functioncallbackr(data){ callbackr(data){ dwr.util.setValue(“result”、data); dwr.util.setValue(“result”、data); } } メッセージ:Hello DWR! :処理フロー DWR全体像 :開発者が作成するもの クライアント サーバー JavaScript HTML DHTML DWR POJO呼出 コールバック Creator XMLHttp Request DWRServlet Converter リモート オブジェクト (POJO) dwr.xml 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 49 ・サーバ側のJavaはPOJO サーバ側の処理はPOJOとして実装し、すべてDWRのサーブレット (DWRServlet)が処理します。 POJOなのでAPサーバを起動しなくても、単独でテストすることが可能です。 ・Java/JavaScript間のデータ変換で多くの型をサポート サーバのJavaオブジェクトとクライアントのJavaScriptオブジェクトの間でデータ変換を行います。文字 列や単純な型については何も指定しなくても自動的に変換してくれます。また、複雑な型(Array、 Bean、 Collection、 DOM、 Enumオブジェクト)であっても、簡単な記述を追加することでDWRが自動 的に変換することが可能です。 ・Struts、JSF、Springなどのフレームワークとの統合 ・多くのブラウザに対応 ブラウザによってJavaScriptの振る舞いなどに微妙な違いがありますが、DWRではブラウザの違いを 気にする必要がありません。IEやFireFox、Safari、Opera、Mozilla、Konquerorなど多岐です。 ・動的にページを生成するためのユーティリティメソッドを提供 コレクションクラスのオブジェクトをHTMLのテーブルやリストに展開するためのメソッドが用意されて おり、JavaScriptに詳しくなくても簡単にページをダイナミックに生成することが可能です。 ・エラーハンドリング、タイムアウトハンドリング JavaScriptからサーバ側Javaメソッドを呼び出すときに、エラーハンドラやタイムアウトの指定が簡単に できます。 ・リバースAjax DWR 1.xまでは、クライアントのJavaScriptからサーバのJavaオブジェクトを非同期に呼び出せました。 DWR 2.0からは、逆に、サーバ側のJavaからクライアントのJavaScriptを非同期に呼び出せるようにな り、、チャットのような対話型のAjaxアプリケーションを記述しやすくなりました。 <参考情報> WAS Feature Pack for Web 2.0 ワークショップ資料 - 05 Java EEの拡張(Struts/JSFとAjax連携) http://www.ibm.com/developerworks/jp/websphere/library/was/was61_ejb3fep_ws/index.html 49 02. フレームワーク 参考資料 ~Hibernate問題判別(JDBCトレース) 設定方法 管理コンソールより、 データ・ソース -> カスタム・プロパティー を選択 traceLevel、traceFileAppend、 traceFile、traceDirectoryを設定 問題判別に役立つ主な取得項目 JDBCドライバーレベルのレスポンスタイム [jcc][SystemMonitor:stop] [jcc][SystemMonitor:stop]core: core:3.626159ms 3.626159ms| |network: network:1.7996699999999999ms 1.7996699999999999ms| |server: server:0.0ms 0.0ms パラメーターマーカーの設定値 Hibernate: Hibernate:insert insertinto intoise.COUNTER ise.COUNTER(ID) (ID)values values(?) (?) [jcc][Time:2009-12-01-10:15:53.421][Thread:WebContainer [jcc][Time:2009-12-01-10:15:53.421][Thread:WebContainer: :3][PreparedStatement@63256325] 3][PreparedStatement@63256325] setShort setShort(1, (1,22) 22)called called 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 50 JDBCトレースは、管理コンソールより、JDBC -> データ・ソース -> カスタム・プロパティーを選択し、 traceLevel、traceFileAppend、traceFile、traceDirectoryを設定して下さい。traceLevelについては、 下記リンク先をご確認下さい。 ・DB2 Information Center - 「サポートされるすべてのデータベース製品に共通の IBM Data Server Driver for JDBC and SQLJ のプロパティー」 http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=/com.ibm.db2.luw.apdv.ja va.doc/doc/r0052038.html - traceLevel:トレースレベルを設定する。 整数値を加算することで、複数のトレースが取得可能。 例:1+2=3 (CONNECTION_CALL,STATEMENT_CALL) - traceFileAppend:trueに設定すると、トレースファイルが上書きされない。 - traceFile:トレースファイルを設定する。 -traceDirectory:接続オブジェクト毎にトレースファイルが出力される。 例:_cpds_1 , _cpds_2…。traceFileを設定すると、traceDirectoryは無効になる。 50 02. フレームワーク 参考資料 主要機能 ~Java EEを構成する主なAPI J2EE 1.3 J2EE 1.4 Java EE 5 Java EE 6 Servlet 2.3 2.4 2.5 3.0 JSP 1.2 2.0 2.1 2.2 JSF - - 1.2 2.0 JSTL - - 1.2 1.2 JTA 1.0 1.0 1.1 1.1 EJB 2.0 2.1 3.0 3.1 JPA - - 1.0 2.0 JMS 1.0 1.1 1.1 1.1 J2EE 1.3 J2EE 1.4 Java EE 5 Java EE 6 XML/Webサービス Web Service JAXP JAX-RPC - 1.1 1.1 1.3 1.1 1.2 1.2 1.3 - 1.0 1.1 1.1 JAX-WS - - 2.0 2.2 JAXB - - 2.0 2.2 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 51 51 02. フレームワーク 参考資料 Java SE 関連 JDBC4.0 JAXP1.3 StAX JMX2.0 JAF1.1 赤字:Web 赤字:WebProfile候補 Profile候補 青字:Java 青字:JavaEE EE66新機能 新機能 緑字:Java EE 緑字:Java EE5でのバージョン 5でのバージョン *:Prunig対象 *:Prunig対象 ~Java EE 6を構成するAPI Java EE EJB 3.1*(Lite) (←3.0) Servlet 3.0 (←2.5) JSP 2.2 (←2.1) EL 2.2 JMS 1.1 JTA 1.1 JavaMail 1.4 Connector 1.6 (←1.5) Web Services 1.3 (←1.2) JAX-RPC 1.1* JAX-WS 2.2 (←2.0) JAX-RS 1.1 JAXB 2.2 (←2.0) SAAJ 1.3 JAXR 1.0* 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop Java EE Management 1.1 Java EE Deployment 1.2* JACC 1.3 (←1.1) JASPIC 1.0 JSP Debugging 1.0 JSTL 1.2 Web Services Metadata 2.0 JSF 2.0 (←1.2) Common Annotations 1.1 StAX 1.0 JPA 2.0 (←1.0) Contexts and Dependency Injection 1.0 Bean Validation 1.0 JAXM1.0 52 EL (Expression Language)とは、式言語とも呼ばれ、演算結果や値の参照の結果を出力するため に使用されます。 52 02. フレームワーク 参考資料 ~EJB 3.1サンプル @Singleton @Singleton @ConcurrencyManagement(CONTAINER) @ConcurrencyManagement(CONTAINER) @Lock(READ) @Lock(READ) public publicclass classSharedBean SharedBean{ { private privateSharedData SharedDatashared; shared; @Singleton @Singleton @ConcurrencyManagement(Bean) @ConcurrencyManagement(Bean) @Lock(READ) @Lock(READ) public publicclass classSharedBean SharedBean{ { private privateSharedData SharedDatashared; shared; @AccessTimeout(1000) @AccessTimeout(1000) public publicint intgetXYZ() getXYZ(){ { return returnshared.xyz; shared.xyz; }} synchronized synchronized public publicint intgetXYZ() getXYZ(){ { return returnshared.xyz; shared.xyz; }} @LOCK(WRITE) @LOCK(WRITE) public publicvoid voidupdate(...) update(...){ { ////update updateshared shareddata data }} synchronized synchronized public publicvoid voidupdate(...) update(...){ { ////update updateshared shareddata data }} コンテナ管理の並行実行性 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop Bean管理の並行実行性 53 EJB3.1の新機能として、シングルトンSession Beanがあります。シングルトンという名前の通り、アプ リケーションレベルで一度だけ初期化されます。また、このシングルトンSession BeanのConcurrency オプションは3種類あります。 ・Single threaded (default):For consistency with all existing bean types ・Container Managed Concurrency:Control access via method-level locking metadata ・Bean Managed Concurrency:All concurrent invocations have access to bean instance さらに、LOCKのレベルを設定することができます。READ lockは、Beanインスタンスに対して Concurrentアクセスを許可します。WRITE Lockはデフォルト値となり、シングルスレッドによるBeanア クセスであることを確認します。そしてLockが解放されるまで、アクセスがブロックされます。 @StartupWeb @DependsOn アプリケーション起動処理中に初期化される シングルトン間の依存関係(起動順)を指定する 53 02. フレームワーク 参考資料 ~Servlet 3.0サンプル @WebServlet(urlPatterns @WebServlet(urlPatterns=={"/chat"}, {"/chat"},asyncSupported asyncSupported==true) true) public publicclass classAjaxCometServlet AjaxCometServletextends extendsHttpServlet HttpServlet{ { private privatestatic staticfinal finalQueue<AsyncContext> Queue<AsyncContext>queue queue== new newConcurrentLinkedQueue<AsyncContext>(); ConcurrentLinkedQueue<AsyncContext>(); ////...... @Override @Override protected protectedvoid voiddoGet doGet(HttpServletRequest (HttpServletRequestreq, req,HttpServletResponse HttpServletResponseres) res) throws throwsServletException, ServletException, IOException IOException{ { ////...... final finalAsyncContext AsyncContextac ac==req.startAsync(); req.startAsync(); req.setAsyncTimeout(10 req.setAsyncTimeout(10* *60 60* *1000); 1000); queue.add(ac); queue.add(ac); req.addAsyncListener(new req.addAsyncListener(newAsyncListener(){ AsyncListener(){ public publicvoid voidonComplete(AsyncEvent onComplete(AsyncEventevent) event)throws throwsIOException IOException{ {queue.remove(ac); queue.remove(ac);} } public publicvoid voidonTimeout(AsyncEvent onTimeout(AsyncEventevent) event)throws throwsIOException IOException{ {queue.remove(ac); queue.remove(ac);} } }); }); ////...... }} 非同期処理 2009/12 WAS V7 アプリケーション・デザインWorkshop アプリケーション・デザインWorkshop 54 54