Javaのstrutsメモ

## はじめに
Javaでの実装経験はありませんが、Javaの案件に入るとstrutsばかりに出くわします。
いいかげんにして欲しいのですが、メモとして記載します。


## jspでhtmlタグやlogicタグ、name、property
StrutsのJSPで使用される`html`タグや`logic`タグ、`name`や`property`属性は、Strutsフレームワークのタグライブラリを用いて、JSPで効率的にデータを扱うためのものです。これにより、JSPでビジネスロジックを直接書くのではなく、MVC（Model-View-Controller）の設計パターンに従って、コードを整理して記述することができます。

### 1. `html`タグ
`html`タグライブラリは、HTMLフォーム要素を簡単に生成するために使用されます。例えば、フォーム、テキストボックス、ラジオボタン、チェックボックスなどのフォーム入力要素を作成するのに使用されます。

- **例:**
  ```jsp
  <html:form action="/submitAction">
      <html:text property="username" />
      <html:password property="password" />
      <html:submit value="Login" />
  </html:form>
  ```
  - `html:form`タグはフォームを生成し、`action`で指定したアクションにデータを送信します。
  - `html:text`はテキスト入力フィールドを作成し、`property`で指定したプロパティにデータをバインドします。

### 2. `logic`タグ
`logic`タグライブラリは、条件分岐やループなどのロジックをJSP内で実装するためのタグセットです。例えば、`if`や`iterate`（繰り返し処理）をサポートします。

- **例:**
  ```jsp
  <logic:present name="user">
      Welcome, <bean:write name="user" property="name" />!
  </logic:present>
  ```
  - `logic:present`は、`user`というスコープに指定されたオブジェクトが存在する場合に処理を実行します。
  - `bean:write`は、JavaBeanのプロパティをHTMLに出力します。

### 3. `name`と`property`
`name`は通常、リクエストやセッションに格納されているフォームオブジェクトやJavaBeanの名前を指定します。`property`はそのオブジェクト内の特定のプロパティ（フィールド）を指定します。

- **例:**
  ```jsp
  <html:text name="myForm" property="username" />
  ```
  - `name="myForm"`で、アクションフォームの名前を指定し、そのフォームの`username`プロパティにバインドするテキストボックスを生成します。

### まとめ
- **`html`タグ**: HTMLのフォームや入力要素を簡単に生成。
- **`logic`タグ**: JSPページ内での条件分岐や繰り返し処理。
- **`name`と`property`**: フォームオブジェクトやJavaBeanのプロパティにデータをバインド。

これらのタグを利用することで、ビジネスロジックをサーバサイド（Actionクラスなど）に分離し、JSP側はビューとしての役割に集中させることができます。

## ○○○Action.java、○○○Form.java:
Strutsにおける`○○○Action.java`と`○○○Form.java`は、MVCアーキテクチャにおいてモデルとコントローラの役割を果たします。この2つを使って、JSPページでのフォーム操作や表示を効率的に実現します。具体的にどのようにこれらが使われるのか、以下に説明します。

### 1. `○○○Action.java`（Actionクラス）
**Actionクラス**は、リクエストを処理し、ビジネスロジックを実行して、適切なビュー（JSP）に遷移する役割を持ちます。Strutsでは、ユーザーからのリクエストをコントローラがこの`Action`クラスにルーティングし、そこで必要な処理が行われます。

- **例: `LoginAction.java`**
  ```java
  public class LoginAction extends Action {
      public ActionForward execute(ActionMapping mapping, ActionForm form,
              HttpServletRequest request, HttpServletResponse response) {
          
          // formオブジェクトを取得
          LoginForm loginForm = (LoginForm) form;

          // フォームのデータを取得
          String username = loginForm.getUsername();
          String password = loginForm.getPassword();

          // 簡単なビジネスロジック（認証）
          if ("admin".equals(username) && "password".equals(password)) {
              return mapping.findForward("success");
          } else {
              return mapping.findForward("failure");
          }
      }
  }
  ```
  - **`execute`メソッド**: リクエストがActionクラスに到達すると、このメソッドが実行されます。
  - **`ActionMapping`**: 遷移先のJSPを指定するために使います。`success`や`failure`に基づいて異なるJSPを返すことができます。
  - **`ActionForm`**: フォームの入力データ（後述）を取得するために使用します。

### 2. `○○○Form.java`（ActionFormクラス）
**ActionFormクラス**は、フォームから送信されたデータを保持する役割を果たします。Strutsはリクエストを受け取ったとき、このフォームオブジェクトにデータをバインドし、Actionクラスでそのデータを使えるようにします。

- **例: `LoginForm.java`**
  ```java
  public class LoginForm extends ActionForm {
      private String username;
      private String password;

      // getter and setter for username
      public String getUsername() {
          return username;
      }
      public void setUsername(String username) {
          this.username = username;
      }

      // getter and setter for password
      public String getPassword() {
          return password;
      }
      public void setPassword(String password) {
          this.password = password;
      }
  }
  ```

  - **`LoginForm`**: フォームのデータ（`username`と`password`）を格納します。
  - **getter/setterメソッド**: JSPの`property`属性からデータを取得したり設定したりするために使います。

### 3. JSPとの連携
次に、これらの`Action`と`Form`を使って、JSPでフォームデータの入力や出力を実現します。

- **例: `login.jsp`**
  ```jsp
  <html:form action="/login">
      ユーザー名: <html:text property="username" />
      パスワード: <html:password property="password" />
      <html:submit value="Login" />
  </html:form>
  ```

  - **`html:form`**: `action`属性で`/login`というURLにフォームのデータを送信します。このURLは、Strutsの設定ファイル（`struts-config.xml`）で`LoginAction`にルーティングされます。
  - **`html:text`および`html:password`**: フォームの`username`と`password`プロパティに入力されたデータを自動的に`LoginForm`にバインドします。

### 4. `struts-config.xml`の設定
最後に、Strutsの設定ファイル`struts-config.xml`で、フォームとアクションを紐付けます。

- **例: `struts-config.xml`**
  ```xml
  <action-mappings>
      <!-- login action mapping -->
      <action path="/login"
              type="com.example.LoginAction"
              name="loginForm"
              scope="request"
              validate="true"
              input="/login.jsp">
          <forward name="success" path="/welcome.jsp"/>
          <forward name="failure" path="/login.jsp"/>
      </action>
  </action-mappings>

  <form-beans>
      <!-- form bean definition -->
      <form-bean name="loginForm" type="com.example.LoginForm"/>
  </form-beans>
  ```

  - **`action`要素**: `/login`というリクエストパスを`LoginAction`に関連付けます。フォームは`loginForm`という名前であり、その型は`LoginForm`です。
  - **`forward`要素**: 認証に成功した場合は`welcome.jsp`、失敗した場合は再び`login.jsp`に遷移します。

### まとめ
- `○○○Action.java`: リクエストを処理し、ビジネスロジックを実行するコントローラ。
- `○○○Form.java`: フォームデータを保持し、Actionクラスに渡すモデル。
- JSP: `html`タグや`logic`タグを用いて、フォームの入力や出力を管理。

これらを連携させることで、Strutsフレームワーク上で効率的なフォーム処理とページ遷移を実現できます。