□技術メモ - Struts ※管理人の個人的な技術メモです。このページの内容の実行結果について 管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。 ----------------------------------------------------------- ○MVC2モデル ・「Control」がHttpリクエストを受け付ける。   このとき、DBにアクセスするなら「Model」を呼び出す。 ・「Model」がデータにアクセスする。   多くの場合、SQLの発行によりDBにアクセスして、データの取得、更新等を行い、   JavaBeansにデータを保持する。 ・「View」が取得したデータを表示形式に加工するなどして、画面を生成する。   JSPなどのように、ViewからModelを呼び出してデータを取得する場合もありえる。 ・MVCモデルは、デザインパターンの1つとされているが、もっと大きな枠組み、  つまりソフトウェアアーキテクチャとも考えられる。MVCモデルをWebアプリケーション開発に適用  したものが、MVC2モデル。MVCモデルとの違いとしては、状態遷移の度にModelを作り直す点などがある。 ○Struts ・StrutsとはWebアプリケーションの開発フレームワークの1つ。 ・Java Servletと、JavaBeansを採用している。 ・Viewの実現にはJSP以外にも、Jakarta Velocity, XSLTなどを使用することもできる。 〇上記以外の特徴 ・全ての処理をActionServletクラスが受け取り、実際の処理はActionクラスで行われる。 ・formの入力情報は自動でActionFormクラスに格納される。 ・・・ ○環境構築 ・JavaによるWebアプリケーション開発環境は構築されているものとする。 ・以下のサイトから jakarta-struts-1.1-rc2.zip をダウンロードする(2017/05/08記)  http://struts.apache.org/index.html ・以下のファイルを「WEB-INF/LIB」ディレクトリに配置する。  ほかにも.jarファイルがあるので、必要に応じてLIBに配置する。 commons-beanutils.jar commons-collections.jar commons-digester.jar commons-logging.jar struts.jar ○web.xmlの設定 ・「WEB-INF/web.xml」は以下のように設定する。 ・url-pattern は、拡張子.do が推奨されている。 ・servlet-nameは特に規定はない。 ・servlet-classは、org.apache.struts.action.ActionServlet を指定する。  全ての処理をActionServletクラスが受け取り、  実際の処理はActionクラスで行われる。 ・init-param で初期値を設定する。  設定可能なパラメータは以下の通り。  (1)debug   debug出力のレベルを0〜6の数値で設定する。デフォルト値は0(出力なし)  (2)config   ActionServletの振る舞いを記述した設定ファイルを、   アプリケーションルートからの位置で指定する。   デフォルト値は、WEB-INF/struts-config.xml になる。   このファイルを、Struts設定ファイル と呼ぶこともある。 --------  ...     Action   org.apache.struts.action.ActionServlet       config    /WEB-INF/struts-config.xml --ここでStruts設定ファイルのパスを指定する      ...    ...     Action   *.do    ... -------- ○Struts設定ファイルについて ・ActionServlet は呼び出されると、Struts設定ファイルに基づいて  実行するActionクラスを決定する。 ・action-mappingsタグ において、URLに対応するアクションクラスを設定する。 (1)actionタグについて ・actionタグ において、URLに対応して呼び出す個々のアクションクラスの指定を行う。 ・path属性は、URLを指定する。 ・type属性は、クラスを指定する。 ・つまり、以下のURLが指定された場合は、shori.CheckActionクラスが実行されることになる。  http://(サーバ名)/(ルートpath)/shori/check.do (2)実行後の画面表示について ・Actionクラスは自身では表示を行わず、フォワード先で表示を行う。 ・この場合は、forwordタグのpath属性を参照して、shori/check.jsp が呼び出されて表示を行うことがわかる。 ・name属性は、複数のforwordが指定されている場合に1つを選択する際のkeyとして使用する。 struts-config.xml --------      --URLで、/shori/check.doが指定された場合はここを参照する     --実行後の表示は、/shori/check.jspが行う。      -------- ○Actionクラスの実装 ・以下はActionクラスの実装例。 ・org.apache.struts.action.Action の拡張クラスとして定義する。 ・引数の意味は以下のとおり。  ActionMapping は、主にタグとタグの情報を取得する。  ActionForm はHTMLの
の情報を取得する。  HttpServletRequest 使用しないことが多い。今回はとりあえず省略。  HttpServletResponse このクラス内でHTTPレスポンスを行う場合に使用する。今回はとりあえず省略。 ・戻り値 ActionForward は、タグの情報を管理する。  以下の例では、mapping.findForward("shori") と記述することで、  name属性が"shori"のforwordタグが選択され、shori/check.jsp が表示用に呼ばれることになる。 -------- package shori; import org.apache.struts.action.Action; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CheckAction extends Action{ public ActionForward execute(  ActionMapping mapping,  ActionForm form,  HttpServletRequest request,  HttpServletResponse response)  throws Exception{   ...   return(mapping.findForward("shori"));  } } -------- ○ActionFormの実装 ・ActionFormは、WebページのForm要素のパラメータ値を格納するためのJavaBeanであり、  org.apache.struts.action.ActionFormを拡張してクラスを作成する。 ・以下はActionFormの例。 InputForm.java は以下の通り -------- package shori; import org.apache.struts.action.ActionForm; public class InputForm extends ActionForm{ private String name=""; public void setName(String name){ this.name=name; } public String getName(){ return name; } } -------- 〇ActionFormの設定の例 ・以下は、struts設定ファイルにおける、ActionFormの設定の例。 (1)form-beansタグについて ・form-beansタグにおいて、個々ののActionBean のクラス名と、  紐づけるためのname属性が設定される。 (2)actionタグについて ・actionタグにおいて、path属性は、呼ぶためのURLを指定している。 ・該当するURLが指定されたら、type属性で指定しているクラスが実行される。 ・この際に、自動的にname属性に紐づくActionFormが呼ばれ、form内の情報が取得される。 ・実行後には、forwordタグで指定されているjspが起動されて、画面を表示する。 (3)Actionクラスでの利用について ・Actionクラスのexecuteメソッドの引数に、ActionForm form があるので、これをキャストして使えばよい。 ・以下はActionクラスにおける実装例。 ProductForm pf=(ProductForm)form; String name=pf.getName(); ・デフォルトでは日本語入力に対応していない点に注意。  従って、setterメソッドで以下のようなコードの記述が必要になる。  他に、HttpServletRequestの文字コードを設定する(setCharacterEncodingメソッドを呼び出す)フィルタを使用する  方法等がある。 public void setText(String text){ this.text=new String(text.getBytes("8859_1"), 入力ページの文字コード ); } struts-config.xml --------      name = "productForm"> scope= "request">          -------- (準備中)