2.

struts-config.xmlの説明

編集
この記事の要点
  • struts-config.xml は Struts 1.x の中心設定ファイル
  • Action(コントローラ)・ActionForm(フォーム)・ActionForward(遷移先)を XML で定義
  • Struts 1 はレガシー — 新規開発では Spring MVC 推奨
  • 既存システムの保守用に最低限の構造を理解

 

struts-config.xml の役割

Struts 1 は MVC フレームワークで、リクエスト → Action → JSP の流れを struts-config.xml で宣言的に定義します。Struts 2 とは構成が大きく異なるので注意(こちらは struts.xml)。

Struts 1 のサポートは2013 年で終了しており、セキュリティ脆弱性も多数。新規開発では使わず、既存システムの保守用に必要な範囲で理解します。

全体構造

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
    "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

    <!-- 1. データソース定義 -->
    <data-sources>
        <data-source key="myDataSource" type="...">
            ...
        </data-source>
    </data-sources>

    <!-- 2. フォーム Bean 定義 -->
    <form-beans>
        <form-bean name="loginForm" type="com.example.LoginForm"/>
        <form-bean name="userForm" type="com.example.UserForm"/>
    </form-beans>

    <!-- 3. グローバル例外定義 -->
    <global-exceptions>
        <exception key="error.system" type="java.lang.Exception" path="/error.jsp"/>
    </global-exceptions>

    <!-- 4. グローバル転送先 -->
    <global-forwards>
        <forward name="login" path="/login.jsp"/>
        <forward name="error" path="/error.jsp"/>
    </global-forwards>

    <!-- 5. Action マッピング (★中心) -->
    <action-mappings>
        <action path="/login"
                type="com.example.LoginAction"
                name="loginForm"
                scope="request"
                validate="true"
                input="/login.jsp">
            <forward name="success" path="/home.jsp"/>
            <forward name="failure" path="/login.jsp"/>
        </action>
    </action-mappings>

    <!-- 6. メッセージリソース -->
    <message-resources parameter="ApplicationResources"/>

    <!-- 7. プラグイン (Validator 等) -->
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property property="pathnames"
                      value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
    </plug-in>

</struts-config>

各要素の役割

① form-beans(フォーム Bean)

HTML フォームのデータを受け取るクラス:

<form-beans>
    <form-bean name="userForm" type="com.example.UserForm"/>
</form-beans>
// com.example.UserForm.java
public class UserForm extends ActionForm {
    private String name;
    private String email;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    @Override
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        if (name == null || name.isEmpty()) {
            errors.add("name", new ActionMessage("error.name.required"));
        }
        return errors;
    }
}

② action-mappings(Action 定義)

URL → Action(コントローラ)の紐付け:

属性意味
pathリクエストパス(/login
typeAction クラスの FQDN
name使用する form-bean 名
scoperequest / session
validatetrue なら form-bean の validate() を呼ぶ
inputvalidate 失敗時の戻り先
parameterDispatchAction 等で使うメソッド名指定
<action path="/userSave"
        type="com.example.UserSaveAction"
        name="userForm"
        scope="request"
        validate="true"
        input="/userEdit.jsp">
    <forward name="success" path="/userList.jsp"/>
    <forward name="failure" path="/userEdit.jsp"/>
</action>
// com.example.UserSaveAction.java
public class UserSaveAction extends Action {
    @Override
    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        UserForm userForm = (UserForm) form;
        try {
            userService.save(userForm.getName(), userForm.getEmail());
            return mapping.findForward("success");
        } catch (Exception e) {
            return mapping.findForward("failure");
        }
    }
}

③ forward(遷移先)

名前と JSP パスの対応:

<!-- グローバル (全アクション共通) -->
<global-forwards>
    <forward name="error" path="/error.jsp"/>
</global-forwards>

<!-- アクション固有 -->
<action path="/login" ...>
    <forward name="success" path="/home.jsp"/>
    <forward name="failure" path="/login.jsp" redirect="true"/>
</action>

④ message-resources(メッセージ)

<message-resources parameter="ApplicationResources"/>

<!-- ApplicationResources_ja.properties -->
error.name.required=名前は必須です
welcome.message=ようこそ、{0} さん

典型的なリクエストの流れ

  1. ユーザが /login.do にアクセス
  2. ActionServlet がリクエストを受信
  3. struts-config.xml の action-mappings から /login を検索
  4. form-bean loginForm を生成してパラメータをバインド
  5. validate=true なら form の validate() メソッド呼び出し
  6. エラーあり → input 属性の JSP に戻る
  7. エラーなし → Action クラスの execute() 実行
  8. execute() が ActionForward を返す(例: success)
  9. 該当する forward の path(JSP)に遷移

Struts 1 vs Spring MVC(モダン)

項目Struts 1Spring MVC
設定XML 中心アノテーション中心
コントローラAction クラス@Controller / @RestController
フォームバインドActionForm 継承POJO + @ModelAttribute
バリデーションvalidate() メソッドBean Validation (@Valid)
テスト困難容易(POJO ベース)
DI限定的強力
サポート2013 終了アクティブ

レガシー保守の注意点

  • セキュリティパッチ: Struts 1 は提供されない。脆弱性報告(CVE)を確認
  • Java バージョン: Struts 1 は古い Java 向けで、Java 17+ では動作しない場合あり
  • 移行計画: Spring MVC / Spring Boot へのリプレースを段階的に
  • テスト不足: 単体テストが書きづらい設計、リファクタリング前にテスト追加

関連記事


📚 関連: ファイル形式・拡張子セクション — 主要なファイル拡張子・形式を体系的に解説。XML(.xml)

編集
Post Share
子ページ
  1. ActionMapping
同階層のページ
  1. 導入方法
  2. struts-config.xmlの説明
  3. ActionForm
  4. Action
  5. エラー一覧
  6. JSP タグ
  7. カスタムタグ(tablib)