Download presentation
Presentation is loading. Please wait.
1
Struts勉強会資料 2002/06/27
2
Agenda 全体概要 モデル ビュー コントローラ その他 歴史、StrutsのMVCデザインパターン
三つのBean、アクションフォーム、アクションフォームとHTMLフォームの対応 ビュー 国際化されたメッセージ、カスタムタグ、入力チェック コントローラ 設定ファイルでのアクションマッピングの定義、 その他 Strutsの拡張ポイント、フォームの二重送信対策
3
全体概要
4
Strutsの歴史 2000/5 「Tomcat 4.0」の開発者であるCraig R.McClanahanによって、Jakartaプロジェクトへ寄贈 2000/9 マイルストーンビルド(バージョン0.5) 2002/2/13 バージョン 1.0 Beta 1 2001/6/15 バージョン 1.0 2002/1/12 バージョン 1.0.1 2002/2/11 バージョン 1.0.2 2002/3Q Struts Book(タイトル未定)がOReillyから出版予定 Jakarta Struts Book Review Project (
5
「JSP モデル2」と「MVC」 JSPモデル2までの経緯 Servletの登場 JavaServer Pagesの登場
CGIより速く、プラットフォームに依存しない Javaのコードの中にHTMLを記述するため、HTMLを変更する際に再コンパイルが必要 JavaServer Pagesの登場 HTMLの中にJavaのコードを記述できる HTMLとJavaを混合でき、Servletの長所をすべて持つ技術として人気が出る 「JSPセントリック」なWebアプリケーションでは、フロー制御などのWeb固有の問題を解決できず JSPモデル2の登場 コントロールフローはServletで制御し、JSPはビューに注力 Smalltalk-80由来のMVCと類似しているため、「JSPモデル2」と「MVC」は同じ意味の言葉として使われる JSPのみでアプリケーションを構築するのは、JSPモデル1とされる
6
StrutsのMVCデザインパターン① ハンドラは、リクエストとモデルの間のアダプタの役割を果たす モデルは、ビジネス ロジックや状態を表す
アプリケーションフローを中央のコントローラが制御 コントローラ モデル ①リクエストを受け付け ②適切なハンドラに 処理を委譲 コントローラ ハンドラ1 モデル1 ハンドラ2 ... ... モデルK ハンドラN ... ③ハンドラと結びついて いるモデルによって リクエストを処理 ビュー ビュー1 ・ハンドラはコントローラの一部であり、 「何をなすべきか決定する」責務を持つ ・ビジネスロジック(「行うべきもの」)は、 モデルが責務を持つ モデルは、以下の二つを含む 1.システムの内部状態 2.その内部状態を変更する ために講じることのできる アクション ビュー2 ... ビューN ④コントローラを通って、 制御がビューに転送される ⑤クライアントへ表示 ... ビューへの転送は、設定ファイルに従ってコントロールが制御する ⇒モデルのビューへの依存を排除し、疎結合に
7
StrutsのMVCデザインパターン② ①アクションマッピングを基に、1)リクエストに対応したアクションフォームの生成、
2)フォームデータのアクションフォームへの格納、3)アクションフォームの入力チェック実行 コントローラ モデル ActionServlet Action ActionForm ②アクションマッピングを 元にリクエストに応じた アクションを呼び出す struts-config.xml ActionForm Action ActionMapping ... JavaBeans ActionMapping ActionForward Action JavaBeans ④遷移先の論理 名を返却 ビュー ③フォームデータの参照、更新、 およびビジネスロジック実行 JSP JSP ⑤アクションマッピングを基に、遷移先の論理名を、 物理JSPに変換して呼び出す ... JSP ビューロジック(何が対応するページの名前であるか)から、コントロールロジック(次に何をすべきか)を分離する ... Struts Tag Library ※ ActionFormは、モデルではなく ビューとする分類もある
8
モデル
9
Strutsのモデルコンポーネント アクションフォーム(ActionForm) システム状態Beans ビジネスロジックBeans
「モデル」というよりは、実際には「ビュー」に近い アプリケーション内のそれぞれの入力フォーム(<form>タグ)に対応する ActionFormクラスを継承して作成する アクションマッピング(struts-config.xml)で、アクションに対応するように定義する システム状態Beans システムの状態を表すJavaBeans 商品カタログやその在庫状況、ユーザプロファイルデータなど しばしば、外部データベースに対応するようにメモリ上に作成される より大規模なシステムでは、エンティティEJBが使用される ビジネスロジックBeans 実現形態としては、システム状態Beansのために使用されたクラスの一部、あるいはロジック実行用の他のクラスのメソッドとなる 特定の環境に依存しない(例:javax.servlet.*をimportするとWebアプリケーション環境に依存してしまう)ように作成されるべき より大規模なシステムでは、セッションEJB(ステートフル or ステートレス)が使用される
10
アクションフォーム(ActionForm)
Strutsフレームワークでは一般に、アプリケーション内のそれぞれの入力フォームに対して「アクションフォーム(ActionForm)」を定義する アクションフォームをアクションマッピング(struts-config.xml)に定義した場合、ActionServletは以下を自動的に実行する 指定されたアクションフォームのインスタンスをセッション(あるいはリクエスト)から取り出し、型をチェックする。アクションフォームのインスタンスが存在しなかった場合には、ActionServletが生成する。 すべてのリクエストパラメータを、アクションフォームのプロパティにセットする。 アクションマッピング(struts-config.xml)で「validate=“true”」が指定されていた場合には、アクションフォームのvalidate()メソッド(入力チェック用メソッド)を起動する。 アクションフォームの有効性を検証した後、アクションフォームを引数として、アクションのperform()メソッドを起動する。
11
設定ファイルでのアクションフォームの定義
struts-config.xmlファイル <?xml version="1.0" encoding="ISO " ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" " <struts-config> <form-beans> <form-bean name="logonForm" type="org.apache.struts.webapp.example.LogonForm"/> ... </form-beans> <action-mappings> <action path="/logon" type="org.apache.struts.webapp.example.LogonAction" name="logonForm" scope="request" input="/logon.jsp"> </action> </action-mappings> </struts-config> アクションフォームは、アクションとは 別個に定義する。 ⇒ 一般に アクション : アクションフォーム ≒ N : 1 となり、複数のアクションに一つの アクションフォームが対応する アクションフォームの定義 アクションに対応するアクションフォーム名を指定する アクションフォーム(のインスタンス)のスコープ
12
HTMLフォームとアクションフォームの対応
Strutsで用意されているJSPカスタムタグ HTMLフォームを生成するJSP (logon.jsp) taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> ... <html:form action="/logon"> <html:text property="username"/> HTMLフォームには、アクションフォーム名の指定がない アクション先とアクションフォーム の対応は、アクションマッピング (struts-config.xml)で集中管理 フォーム表示時: アクションフォーム のgetterメソッドを 実行 各JSPにアクション先に応じた <jsp:useBean>タグを記述する必要 がなくなる ActionFomr (LogonForm) public final class LogonForm extends ActionForm { private String username = null; public String getUsername() { return (this.username); } public void setUsername(String username) { this.username = username; ... フォーム送信時: アクションフォーム のsetterメソッドを 実行 入力チェックエラー時などで、同一 画面を表示させた際に、ユーザの入力 をそのまま保持して出力可能
13
アクションフォーム作成時の留意点 継承元となるorg.apache.struts.action.ActionFormクラス自体は、実装が必要な抽象メソッドを持たない単純なクラスであり、一般にアクションフォームはプロパティゲッター/プロパティセッターメソッドのみを持つ単純なクラスとなる 当然、ビジネスロジックは持たない アクションフォームは、標準のバリデーションメカニズムを持つ ActionFormクラスのvalidateメソッドをオーバライドし、アクションマッピング(struts-config.xml)においてvalidate=“true”を指定しおけば、Strutsフレームワークが入力チェックメソッドを呼び出す 標準のバリデーションメカニズムは無視してもよい アクションフォームは、一種のファイアウォール アクションフォームは、HTTPとActionクラスの間のファイアウォールとも考えることができる Actionクラスに対して、必要な属性がすべてそろっていて、それらが適切な値であることを保証する
14
ActionFormとHTMLフォームのcardinality
アクションフォームが抽象化している「フォーム」は、単一のJSPのHTMLフォームと対応しているわけではない点に注目すること ウィザードスタイル(複数画面に渡って順々に入力していく画面パターン)の場合でも、Strutsフレームワークでは、全ての入力フィールドに対応したプロパティを持つ単一のアクションフォームを定義することが推奨される 単一のアクションフォームであれば、入力フィールドがどの画面で表示されるかに依存しないため、ページデザイナが入力フィールドを自由にページ間に移動させることができる アクションフォームのカバー範囲としては、”業務”単位などの画面復帰が必要である範囲が考えられる ウイザード形式等の 複数のページ 配送先の入力 単一の ActionFormBean 入力フィール ドが移動可能 サブミット先 クレジットカード 番号の入力 参照・更新 ... Action 購入の確認
15
ビュー
16
国際化されたメッセージ Strutsは、国際化されたアプリケーションの構築に着目
Javaプラットフォームの標準的な仕組みによって、アプリケーションを国際化する 重要な概念は、以下のとおり Locale 国際化をサポートするJavaの基本クラス それぞれのLocaleは特定の国と言語(オプション言語バリエーションの追加)を表す 数値と日付のようなものの為のフォーマットのセットを仮定している ResourceBundle 複数言語のメッセージを サポートする基本的なツールを提供する PropertyResourceBundle ResourceBundleの標準実装のうちの1つで、 初期化プロパティファイルで使っているシンタックス“name=value” を用いてリソースを定義する Webアプリケーションで使われるメッセージは一般的なテキストであるため有効 である MessageFormat 実行時に、指定された引数によってメッセージストリング (この場合、メッセージはリソースバンドルから検索されたもの) の一部を入れ替える事を可能にする メッセージ中のプレースホールダー ストリング{0}は、 第1のランタイム引き数と入れ替えられ、{1}は第2の引き数などと入れ替えられる MessageResources Strutsのクラス org.apache.struts.util.MessageResourcesは、データベースのような1セットのリソースバンドルを扱い、 そしてサーバ自身が動作しているデフォルトロケールでは、 (通常現在のユーザと関連した)ロケールに依存したメッセージストリングを要求する事を可能にする
17
Strutsでの入力フォームの作成 多くのWebアプリケーションでは、<input>タグのような HTMLの標準の機能を使用して入力フォームを構築する 一般にWebシステムでは、入力フォームでエラーがあった場合に、全ての項目を入力しなおすような動作は望ましくない 標準のHTMLとJSPを使った入力フォーム <input type="text“ name="username“ value="<%= loginBean.getUsername() %>"/> Strutsのカスタムタグを使った入力フォーム ・明示的にJavaBeansを参照する必要がない ・初期値についてもStrutsフレームワークが セットする <html:text property="username"/>
18
Strutsで用意されているカスタムタグ
Bean Tag 指定した JavaBeanのプロパティの値を取り出し、現在のページの残りの部分でアクセス可能にするタグなど リクエストクッキー、ヘッダーおよびパラメータの値に基づいた新しい bean を作成する便利なメカニズムも 提供される 例) <bean:define id=“...” name=“...” property=“...” /> 「name」で指定したJavaBeanの「property」で指定した属性を、「id」で参照できるようにする <bean:write name=“...” property=“...” /> 「name」で指定したJavaBeanの「property」で指定した属性を、ページに書き出す HTML Tag HTML ベースのユーザインタフェースの作成で一般的に使われるタグと同様に、 Strutsの入力 フォームを生成するタグなど <html:text property=“...” /> そのタグがネストされている<html:form>タグに関連付けられたJavaBeanの、「property」で指定された属性を<input type=“text”>タグに展開する Logic Tag 出力テキストの条件付生成、オブジェクトコレクションによる 出力テキストの反復的な生成、およびアプリケーションフロー管理に有効なタグなど <logic:iterate id=“...”> ... </logic:iterate> Template Tag
19
Strutsの入力チェック Strutsでは、 入力フィールドの値に対するチェック機能を提供する 入力チェックの利用方法
ActionFormクラスの以下のvalidate()メソッドをオーバライドする public ActionErrors validate(ActionMapping mapping, HttpServletRequest request); validate()メソッドは、コントローラ(ActoinServlet)によって呼ばれる 入力チェックのタイミング ユーザの入力をActionFormのプロパティを設定した後 対応するアクションクラスのperform()メソッドの呼び出しの前 入力チェック時にエラーとなった際の処理の流れ [ActionFormクラス] バリデーションを実行して問題が発見された場合には、validate()メソッドでActionErrorsインスタンス(エラーメッセージの キーを含んだ ActionErrorのコレクション)を返す [ActionServlet] ActionErrorsが返された場合には、コントローラ(ActionServlet)によってエラーの内容がリクエスト属性として保存される リクエスト属性に保存されたエラー内容は、<html:errors> タグによってそのエラーのメッセージが表示される コントローラ(ActionServlet)は、入力フォーム画面(ActionMapping の"input"プロパティで指定したページ)に遷移させる
20
Strutsの入力チェック(続き) ActionFormクラスとActionクラスへのチェックロジックの配置 その他
バリデーションの"レベル"に応じて、配置する 単純なバリデーション(必須、最大長、文字種等々)はActionFormクラスで 複雑なチェック(コードの存在チェック、その他ビジネスロジック的なもの)はActionクラス、またはActionクラスが呼び出すビジネスロジックで その他 Struts Validator ( オプション Jakrta Commons Validator ( XMLファイルにバリデーションルールを記述
21
コントローラ
22
Strutsでのコントローラ ブラウザからのリクエストはActionServletが集中的に受け取り、アクションマッピング(struts-config.xml)で指定されているActionクラスのperform()メソッドに処理が委譲される ・struts-config.xmlで設定された「URL」と「Action」 のマッピング情報 ・どのようなリクエストにマップされた結果として、そのアクション が起動されたのかをActionに伝える ・HTMLのフォームの入力データ ・ウィザード形式などの場合は、複数の HTMLフォームの入力をひとつActionForm に対応させる ActionMapping XXXActionForm ハンドラに処理を委譲 リクエスト Actionクラス ActionServlet (またはその継承クラス) XXXAction 遷移先情報を返却 ActionForward performメソッドのシグネチャ public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;
23
コントローラの設定ファイル ActionServletの設定 ActionMappingの設定 web.xml
<servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ・"*.do"形式のURLでのアクセスを、ActionServlet がすべて受け取る ActionMappingの設定 ・URL「/editSubscription.do」でのアクセスを、Actionクラス 「EditSubscriptionAction」に委譲する struts-config.xml <action path="/editSubscription" type="org.apache.struts.example.EditSubscriptionAction" name="subscriptionForm" scope="request" validate="false"> <forward name="failure" path="/mainMenu.jsp"/> <forward name="success" path="/subscription.jsp"/> </action> ・「EditSubscriptionAction」から、「faliure」「success」が返された ときに遷移するJSPを指定する struts-config.xmlのエントリの情報を基にActionMappingが作成され、Actionクラスのperform()メソッド 起動時に渡される
24
performメソッドの典型的な処理 ユーザのセッションの現在の状態の確認(たとえばユーザがログオンに成功したかのチェック)
Actionクラスが未ログオンを検出したなら、 ログオンのためのユーザ名とパスワードのプロンプトが表示される JSPページにリクエストをフォワードするなど ActionFormによる入力チェックに加えて、より高度な入力チェックを行う エラーが検出されたら、適切なメッセージを識別して入力用フォームに遷移を移す ビジネスロジックを実行するメソッドの呼び出し Actionクラス自身にロジックコードを埋め込むことも可能だが、適切なクラスへ委譲すべき ユーザインタフェースの次のページを作成するために、サーバサイドのオブジェクトを更新する クライアントへのレスポンスを生成するJSPを識別するためのActionForwardオブジェクトを返却する ActionMappingオブジェクトのfindForward()メソッドで検索する
25
Actionクラス作成時の留意点 Actionクラスはスレッドセーフに スレッドセーフコーディングを助ける重要な指針 例外のトラップ
コントローラServlet(ActionServlet)は、Actionクラスのインスタンスをひとつだけ作成し、全てのリクエストをそのインスタンスに委譲する マルチスレッド環境内での正確に動作するように、 Actionクラスをコード化する必要あり Servletのservice()メソッドを安全にコード化するのと同じ スレッドセーフコーディングを助ける重要な指針 Actionクラスではインスタンス変数ではなく、 ローカル変数のみを使う ローカル変数は、それぞれのリクエストスレッドのスタックに(JVMによって)割り当てられて作られるため、複数リクエストでの共有の心配をする必要がない 例外のトラップ Actionクラスから委譲されてビジネスロジックを実行するクラスは、データベースアクセスなどさまざまな処理で例外を投げる可能性がある perform()メソッド内で適切に例外を処理する 同一セッションの複数のリクエストにまたがって資源を確保しつづけない 適切なビューへコントロールをフォワードする前に、資源を解放する
26
URL:hogeのときは XXXAction
アクションマッピング StrutsコントローラServletは、 各リクエストURIを適切なActionクラスにどのようにマップしなければならないか知る必要がある URIとActionクラスとのマッピングは、Javaインタフェース「ActionMapping」でカプセル化されている URI:/hoge XXXAction ActionServlet (またはその継承クラス) アクションマッピングで 指定されたAction クラスへ委譲 YYYAction アクションマッピング ZZZAction URL:hogeのときは XXXAction ActionMappingの主なプロパティ プロパティ名 意味 type このマッピングによって使用されるAction実装 クラスのJavaクラス名 name このアクションでアクションフォームの名前 path リクエストのURI validate このマッピングに関して、アクションフォームのvalidate()メソッドを起動して入力チェックを行う場合はtrueにセットする
27
アクションマッピング設定ファイル StrutsコントローラServletに対して、アクションマッピング設定を伝えるためには、ActionMappingインタフェースを実装したJavaオブジェクトを作成すれば良い ActionMapping Javaオブジェクトの作成は単調なプロセスであるため、XMLの設定ファイル(sturts-config.xml)からフレームワークによって自動的に生成する仕組みが用意されている XML要素 説明 <struts-config> struts-config.xmlの最も外側の要素 <form-beans> アクションフォームの定義 <form-bean>を列挙する <form-bean>要素は主に以下の属性で定義する ・name・・・このフォームBeanのユニークな識別子 アクションマッピングの中で参照する際に用いる ・type・・・フォームBeanの完全修飾されたJavaクラス名 <action-mappings> アクションの定義<action>を列挙する <action>要素は主に以下の属性で定義する ・path・・・アクションのURLのパス ・type・・・アクションクラスの完全修飾されたJavaクラス名 ・name・・・このアクションで使う<form-bean>要素の名前
28
その他
29
Strutsの拡張ポイント ActionServletの拡張 ActionMappingの拡張
主要な処理(process()メソッド)は、protectedメソッドを順に起動するようになっているため、必要に応じてお processPreprosecc()メソッド等のフックメソッド ActionMappingの拡張 マッピング情報に独自のデータを追加できるよう配慮されている ActionMappingを継承したクラスを作成 <action>タグに独自の属性を追加、または<action>タグの子要素 <set-option>タグを利用して独自のプロパティを追加 フレームワークへのActionForm、ActionMappingのサブクラスの組み込み ActionForm、ActionMappingを拡張したサブクラスは、設定ファイルによってフレームワークへ組み込むことができる
30
フォームの二重送信対策 トランザクショントークン Strutsフレームワークにおいてフォームの二重送信を防ぐ仕組み
HttpSessionに保存したトークンと、リクエストに含まれるトークン(hiddenフィールド)を比較し、フォームの二重送信をチェックする トランザクショントークンは、セッション情報と時刻を基にリクエスト毎に毎回生成される Actionクラスの以下のメソッドを参照のこと protected java.lang.String generateToken(javax.servlet.http.HttpServletRequest request) protected boolean isTokenValid(javax.servlet.http.HttpServletRequest request) protected void resetToken(javax.servlet.http.HttpServletRequest request) saveToken(javax.servlet.http.HttpServletRequest request) Strutsで管理するトランザクショントークンは、セッションに付き一つだけであるため、複数のブラウザで並行して遷移するようなアプリケーションでは利用できない
31
OReilly Struts book(タイトル未定) 目次
1. Introduction 2. Inside the Web Tier 3. Overview of the Struts Framework 4. Configuring the Struts Application 5. Struts Controller Components 6. Struts Model Components 7. Struts View Components 8. Custom Tag Libraries 9. Extending the Struts Framework 10. Exception Handling 11. Externalizing the Struts Validation 12. Internationalization and Localization 13. Struts and Enterprise JavaBeans (EJB) 14. Security in your Struts Web Applications 15. Using Tiles 16. Using Alternate Presentation Technologies 17. Using Workflow with Struts (May Change) 18. Logging in a Struts Application 19. Addressing Performance 20. Packaging your Struts Application 21 Struts Design Strategies A. Struts API B. Downloading and Installing Struts C. Struts Resources D. Upgrading to Struts 1.1 下線は、 でレビュー中の章(2002/6/27現在)
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.