■プログラムの連携■クラスについてプログラム構成についての中で標準的なプログラム構成では新たにクラスを持ち込みました。サーブレット/JSPも実はサーブレットクラスと呼ばれるクラスなんですが、ここではもっと一般的なクラスが登場しています。 では「クラスとは何か」というと一般的には「一連の意味のあるデータと、そのデータに対する操作をまとめたもの」と言われています。 ただし必ずしも「データ+そのデータへの操作」が必須ではありません。例えばサーブレット編2の■もっとよいHTMLEncodeで説明したように純粋に機能だけを提供するクラスもあります。 そしてこれとは逆に「一連の意味のあるデータ」だけをまとめたクラスもあり得ます。これは何かというとCの構造体やVBのRecord型と同じようなものと思ってください。 基本的にこのクラスではインスタンス変数だけを定義します。このインスタンス変数定義をpublicにしてしまえば、まさにCの構造体やVBのRecord型と同じです。ですがオブジェクト指向の流儀としてこういうやり方はしないことになっています。 どうするかというとそのクラスのインスタンス変数にアクセスするためのアクセサ メソッドというメソッドを定義します。インスタンス変数に値を設定するセッター(setter)とインスタンス変数から値を取り出すゲッター(getter)というメソッドです。 そしてセッターメソッドのメソッド名はsetインスタンス名、ゲッターメソッドのインスタンス名はgetインスタンス名とするのが一般的です(なおこのサイトでは作者の趣味でset_インスタンス名、get_インスタンス名としています)。 このインスタンス変数とそれに対するセッターとゲッターだけを定義したクラスを、データ保持クラスやホルダークラスと呼ぶことにします。 データ保持クラスの例ではデータ保持クラスの例として業務処理クラスの処理結果を保持する、汎用的なReturn Informationクラスを上げてみます。処理結果といっても処理が上手くいったのかエラーになったのか、エラーならどんなエラーだったのか、その情報だけを保持するクラスです。 このクラスが保持するデータは
メッセージに関するデータは、通常はリタンコードを判定して正常以外の時に有効なものとします。 package yok; public class ReturnInf { /** * Return Information: * 各クラスのメソッドを呼び出した際の、実行結果情報を保持するクラス */ public static final int OK = 0; // 正常終了 public static final int WARNING = 4; // 警告 public static final int ERROR = 8; // エラー public static final int SERIOUS = 12; // 重度のエラー public static final int URGENCY = 16; // 緊急事態 public static final char INFORMATION_MSG = 'I'; // 情報メッセージ public static final char WARNING_MSG = 'W'; // 警告メッセージ public static final char ERROR_MSG = 'E'; // エラーメッセージ public static final char SERIOUS_MSG = 'S'; // 重度のエラーメッセージ public static final char URGENCY_MSG = 'U'; // 緊急メッセージ private int rtn_cd = 0; // RETURN CODE private String msg_id = null; // メッセージID private char msg_typ = '\u0000'; // メッセージ種別 private String msg_txt = null; // メッセージ文 // ReturnInfクラスのデフォルトコンストラクタ public ReturnInf() { } /** * Return Informationを文字列にして返す * @return String Return Information */ public String toString() { // (" " + String.valueOf(this.rtn_cd).length() - 2))はリタンコードを2桁固定表示にするため return ("RC:" + (rtn_cd.substring((" " + String.valueOf(this.rtn_cd)).length() - 2)) + " MSG-ID:" + (this.msg_id + " ").substring(0, 4) + " MSG-TYP:" + (this.msg_typ + " ").substring(0, 1) + " MSG:" + this.msg_txt); } /** * 正常終了時のReturn Information設定処理 * @return void */ public void set_rtn_ok() { this.rtn_cd = OK; this.msg_id = " "; this.msg_typ = ' '; this.msg_txt = null; return; } /** * RETURN CODEを取得する * @return int RETURN CODE */ public int get_rtn_cd() { return (this.rtn_cd); } /** * メッセージIDを取得する * @return String メッセージID */ public String get_msg_id() { return (this.msg_id); } /** * メッセージ種別を取得する * @return char メッセージ種別 */ public char get_msg_typ() { return (this.msg_typ); } /** * メッセージ文を取得する * @return String メッセージ文 */ public String get_msg_txt() { return (this.msg_txt); } /** * RETURN CODEを設定する * @param int RETURN CODE */ public void set_rtn_cd(int p_rtn_cd) { this.rtn_cd = p_rtn_cd; return; } /** * メッセージIDを設定する * @param String メッセージID */ public void set_msg_id(String p_msg_id) { this.msg_id = p_msg_id; return; } /** * メッセージ種別を設定する * @param char メッセージ種別 */ public void set_msg_typ(char p_msg_typ) { this.msg_typ = p_msg_typ; return; } /** * メッセージ文を設定する * @param String メッセージ文 */ public void set_msg_txt(String p_msg_txt) { this.msg_txt = p_msg_txt; return; } } 簡単に内容を説明しましょう。 頭のほうで定数定義がしてあります。これはある業務処理クラスのメソッドがこの戻り情報クラスを返すとき、処理結果を判定するときに使うためのものです。例えばこんな感じです。 if 業務処理クラス.メソッド(引数).get_rtn_cd == ReturnInf.OK このクラスの使い方、コーディング方法は2種類あります。1つ目は業務処理クラスでこの戻り情報を返すためのメソッドを実装している場合です。 if (業務処理クラス.メソッド(引数).get_rtn_cd == ReturnInf.OK) { // 正常時の処理 } else { // エラー時の処理 業務処理クラス.get_rtn_inf.get_msg_id 業務処理クラス.get_rtn_inf.get_msg_txt // とメッセージ情報を取り出して処理をする } もう一つは戻り情報を返すメソッドを別に実装することはしない場合です。この場合は呼び出し側で変数定義をして、戻り情報を保持しておきます。 private ReturnInf w_rtn_inf = null: w_rtn_inf = 業務処理クラス.メソッド(引数); if (w_rtn_inf.get_rtn_cd == ReturnInf.OK) { // 正常時の処理 } else { // エラー時の処理 w_rtn_inf.get_rtn_inf.get_msg_id w_rtn_inf.get_rtn_inf.get_msg_txt // とメッセージ情報を取り出して処理をする } それとReturnInfクラス中にtoStringメソッドがありますが、これはデバッグ時やログ出力をするときに使います。クラスの状態(この場合はプロパティ:インスタンス変数やクラス変数)を文字列化しています ■画面情報の引き渡し方前ページの最後で図解したサーバー側の基本構成に、少し手を加えた(業務処理クラスと要求解析クラスを分けた)ものがこれです。
次はこの中でクライアントから受け取った内容を要求解析クラスに渡すときの、呼び出し方について考えましょう。 1 個別のデータ項目を渡すクライアントからの送信データを受け取るにはHttpServletRequest.getParameter("パラメータ名")メソッドを使います。最初の方法は処理振り分けの判断に必要な全てのデータを個別に取得し、要求解析クラスに渡すというものです。 しかし処理振り分け判断を内部メソッドでなくわざわざ別クラスに分けて委託したのに、判断に必要な情報が何かまでサーブレット側で認識するというのは若干の違和感があります。 ただし業務処理クラス呼び出しの場合は問題ないでしょう。処理を委託するに当たってどんな情報を渡せばいいのか、それは委託する側が認識していてしかるべきです。 2 データをまとめて渡す、その1サーブレット側でHttpServletRequest.getParameterNamesとHttpServletRequest.getParameterValuesを使い、クライアントから送信データをまとめて受け取り、要求解析クラスに渡す方法があります。 HttpServletRequest.getParameterNamesは全てのパラメータ名をStringのEnumrationで返し、HttpServletRequest.getParameterValuesは全てのパラメータ値をStringの配列で返します。 getParameterNamesの戻り値型であるEnumration型についてはEnumerationで説明しているので参照してください。 これらを受け取った要求解析クラスでは、必要なパラメータ名をEnumrationから検索して存在有無をチェックする。存在していたときはその場所(何番目か)を覚えておく。そしてStringの配列から対応するパラメータ値を取得する。という操作が必要です。 このロジックを組み込むのはあまりスマートな気がしません。 3 データをまとめて渡す、その2あとはHttpServletRequestを要求解析クラスに渡してしまう方法です。要求解析クラス側で必要なパラメータ情報をgetParameterValueで取り出して処理します。 一番単純なのでこの方法でよさそうです。 ■処理結果の返し方サーブレットがコントローラーとなって業務処理クラスで処理をし、続いて結果出力をクライアントに返すためJSPに制御を渡す部分に移ります。 処理結果のJSPへの渡し方まずは業務処理クラスでの処理結果をJSP側に引き渡す方法を説明します。この部分も作り方としては
実際にJSPに引き渡す手段はインスタンス(実体化したクラス)を引き渡すということで、上記どちらの手段でも同じ方法です。 引き渡すにはサーブレット側でHttpServletRequestに属性としてインスタンスを登録します。JSP側ではHttpServletRequestから対象のインスタンスを属性として取り出してから処理をします。 登録の方法はsetAttributeメソッドを使い、HttpServletRequest.setAttribure("属性名", 対象インスタンス)とします。属性名は任意の値を文字列型で指定します。 取り出す場合はgetAttributeメソッドを使い、(対象インスタンスのクラス型)HttpServletRequest.getAttribure("属性名")とします。こちらも属性名は文字列型で指定します。戻り値は対象インスタンスのクラス型でキャストしておきます。 データ保持クラスの説明に使ったReturnInfを例にすると登録は HttpServletRequest.setAttribure("ReturnInf", w_rtn_inf) 取り出しは w_rtn_inf = (ReturnInf)HttpServletRequest.getAttribure("ReturnInf") といった感じです。なおJSPで実際にコーディングする場合は(ReturnInf)Request.getAttribure("ReturnInf")と書けます。 JSPの呼び出し方処理結果をHTMLでクライアントに返すためにJSPに制御を渡す構成を標準構成としてきました。次にこの制御を渡す部分を説明します。 制御を渡す方法としてforwardとincludeの2通りを説明しました。このどちらの場合もRequestDispatcherクラスを使います。forwardもincludeもRequestDispatcherクラスのメソッドです。 まずHttpServletRequestからRequestDispatcherを取得します。書き方は HttpServletRequest.getRequestDispatcher("JSPのパス") です。 これで取得したRequestDispatcherクラスに対しforwardメソッドかincludeでJSPに制御を渡します。どちらのメソッドの場合も引数でHttpServletRequestとHttpServletResponseを渡します。JSPに制御を渡す部分は
HttpServletRequest.getRequestDispatcher("JSPのパス").forward(HttpServletRequest, HttpServletResponse); あるいは
HttpServletRequest.getRequestDispatcher("JSPのパス").include(HttpServletRequest, HttpServletResponse); というコーディングです。。
次ページでここまでの説明に出てきたメソッド類の説明と、サンプルを例示します。 |
Copyright © 2011 yok. All Rights Reserved.