Strutsについて



StrutsではMVCモデルを採用しています。
MVCモデルはアプリケーションを次の3つに分けて設計、開発していく手法です。

|モデル |アプリケーションで取り扱うデータの管理及びデータに対するロジック |
|:------------:|:------------:|
|ビュー |画面等へのモデルの表示 | 
|コントローラ |モデルとビューの制御 | 

![struts_map.jpeg](https://qiita-image-store.s3.amazonaws.com/0/47909/5d3f239c-a8e1-504b-509f-5026ed571bcf.jpeg)

Strutsを用いたアプリケーションにおいて、モデルは開発者が実装するJavaBeanもしくはEJB（Enterprise JavaBeans）、ビューはJSPおよびStrutsのカスタムタグ、コントローラはActionServletとRequestProcessor、Actionとなります。
　ユーザーからのリクエストは、まずActionServletはリクエストのURLから呼び出すモジュールを判断し、そのモジュールのRequestProcessorへリクエストを転送します。そしてRequestProcessorは、あらかじめ設定された内容に応じて実行するActionを決定し、Actionを介してモデルであるJavaBean（もしくはEJB）ロジックを実行します。
 　モデルの処理が終了すると、RequestProcessorはActionを介して結果（どのJSPページを表示に使用）するかを取得します。ActionServletは取得した情報を、ビュー（JSP）にフォワードを行います。遷移先のJSPでは、sessionやrequestスコープに登録されたJavaBeanからデータを取得し、表示を行います。ユーザは最終的にJSPページによって生成された結果をレスポンスとして取得します。
  
## ActionForm
ActionFormの動作
    StrutsではActionFormを利用してリクエストパラメータの値の取得を手軽に簡単に実装することができます。Strutsでは設定ファイルでActionFormを使用するように定義されていると、自動的にリクエストパラメータの値を読み込んで、ActionFormのプロパティに設定します。
    この動作はRequestProcessorによって、Actionのexcute()メソッドが実行される前に行われます。つまりActionのexecute()メソッドでは、HttpServletRequestではなく、ActionFormを利用してリクエストパラメータの値を取得することができるのです。これにはHttpServletRequestからの取得に比べて値の取り扱いがわかりやすいという利点があります。


ActionFormの作成は非常に単純で、フォームから受け取りたいリクエストパラメータをフィールドとして宣言することと、フィールドの値を取得、設定するための getter/settterメソッドを実装するだけです。具体的には「set（フィールド名）」「get（フィールド名）」でフィールド名の先頭を大文字にしたメソッドを作成します。たとえばnameというパラメータを受け取りたい場合は、setName()という名前のsetterメソッドをとgetName()という名前のgetterメソッドを実装します。


## struts.config.xml

Strutsを利用したアプリケーションの動作を決定する非常に重要なファイルです。Struts設定ファイルは、ActionServletが初期化されるタイミングと、ActionServletからRequestProcessorが起動されるタイミングに読み込まれ、その設定内容に応じてモジュールの準備が整えられます。

### Struts設定ファイルに設定できる情報は、およそ以下

- URLと起動するActionの関連情報
- Action実行後に使用されるリソ一スの情報
- ActionFormの情報
- メッセ一ジリソースの情報

```xml:struts.config.xml
<form-beans>
		<form-bean name="test_loginForm" type="test.LoginAction"></form-bean>
</form-beans>

<action-mappings>
    <action 
    path="/test/login" //項目1
    type="test.LoginAction" //項目2
    name="test_loginForm" //項目3
    scope="request"> //項目4

    <forward name="success" path="/WEB-INF/jsp/test/success.jsp"> //項目5
    </forward>
</action-mappings>
```

- 項目1 `<form action="../test.do" method="post" >` と合わせる。
    - test.doというリクエストが来た場合に呼び出されるアクションに関する定義。URLには項目1のパス__/test/login__に飛ぶ。
- 項目2 test.doへのリクエストを処理するアクションを実装したアクションクラスを定義。LoginActionが実行。パッケージ名を含めたクラス名を記述。
- 項目3 アクションフォームBeanの論理名。form-beanのnameと合わせる。
- 項目4 スコープを指定。デフォルトは、セッション。
- 項目5 遷移先の論理名でloginActionの `return mapping.findfoward("success")`と合わせる。表示される中身のpathは飛ばすパス。


参照記事：<a href="http://www.arksystems.co.jp/closeupit/struts/article003_07.html" target="_blank">Webアプリケーションの作り方 (5) struts-config.xml - 株式会社アークシステム(infoARK)</a>


## web.xml
アプリケーションの設定ファイル。

<jsp-config>(2.4のみ) - *
J2EE2.4のみ存在します。JSPの各種情報を定義します。

引用元：<a href="http://www.techscore.com/tech/Java/JavaEE/Servlet/13/" target="_blank">13．web.xmlのまとめ | TECHSCORE(テックスコア)</a>

## Validator

Validate() メソッドとValidatorの2つがあります。

### Validator


#### ActionFormの作成
Validatorの機能を利用する場合は、通常のActionFormではなく、Validatorが拡張したActionFormであるValidatorFormのサブクラスを作成します。このクラスは、フォームのパラメータについて、getter/setter メソッドを作成するだけで実装は完了です。validate()メソッドを実装する必要はありません。