◀ 2.

struts-config.xmlの説明

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

 

保守では、XMLの綴りだけでなく、実際に読み込まれた設定・対象モジュール・フォームとActionの対応・エラー時の遷移を一組で照合します。以下の断片は全体構造の説明であり、そのまま配備する完成アプリではありません。

Struts設定で対応付けるForm取得、初期化、入力検証とActionへの流れ

struts-config.xml の役割

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

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

全体構造

次のtype="..."やデータソース内の...は省略です。各クラス・JAR・メッセージ・Validator設定を別に用意する必要があります。struts-config.xmlはファイル名だけで自動読込と判断せず、web.xmlのActionServletのconfig/configモジュール名の設定と稼働中の配備先を確認します。

<?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 定義)

nameはフォーム定義の名前、typeはActionのJavaクラス名で、別の設定です。DispatchActionのparameter="method"はmethodというJavaメソッドを固定指定する意味ではありません。要求のmethod=listならlistを選ぶ構造ですが、処理選択は認可やCSRF検証を自動で付けるものではありません。

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

属性意味
pathリクエストパス(/login)
typeActionクラスの完全修飾名(FQCN)。ホスト名のFQDNではない
name使用する form-bean 名
scoperequest / session
validate標準処理でFormがある場合に入力検証を有効化。キャンセル等の分岐も確認
input入力検証エラー時の戻り先。inputForward設定によりパスまたはforward名
parameterDispatchActionでは処理名を読む要求パラメータの名前。parameter="method"ならmethodの値で処理を選ぶ
<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");
        }
    }
}

上のUserSaveActionは省略断片です。 userServiceの宣言・初期化、imports、認可、保存失敗の処理は別に必要です。例外をfailureへの遷移だけで握りつぶす完成実装として使わず、必要なトランザクションと診断情報を保持します。利用者の入力・認証情報をログへ丸ごと記録しないでください。

③ forward(遷移先)

forwardのpathはJSPに限らず、別Action等を指す場合もあります。mapping.findForward(name)はAction固有の定義を先に探し、なければ同じモジュールのglobal-forwardsを探します。見つからない場合のnullも確認します。redirect=trueでは新しい要求になるため、元の要求属性をそのまま引き継ぐ設計にしません。

名前と 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を取得または生成し、resetを呼んでから送信値をバインド
  5. validate=true なら form の validate() メソッド呼び出し
  6. 検証エラーあり → inputのパス/forward名へ戻る。未設定なら戻れずエラーになる
  7. エラーなし → Action クラスの execute() 実行
  8. execute() が ActionForward を返す(例: success)
  9. 返されたforwardのpathへ、forward/redirect設定に従って遷移する。遷移先はJSPとは限らない

Struts 1 vs Spring MVC(モダン)

項目Struts 1Spring MVC
設定XML 中心アノテーション中心
コントローラAction クラス@Controller / @RestController
フォームバインドActionForm 継承POJO + @ModelAttribute
バリデーションvalidate() メソッドBean Validation (@Valid)
テストForm/設定取得等はServletモックで単体検査可能。配備/JSPは統合検査が別途必要容易(POJO ベース)
DI限定的強力
サポート2013 終了アクティブ

レガシー保守の注意点

  • セキュリティパッチ: Struts 1 は提供されない。脆弱性報告(CVE)を確認
  • Java バージョン: Struts 1 は古い Java 向けで、Java 17+ では動作しない場合あり
  • 移行計画: 保守される環境への移行を計画。移行先はSpring MVC等に限定せず、URL/検証/認証/遷移を比較する
  • テスト不足: 単体テストが書きづらい設計、リファクタリング前にテスト追加

関連記事

設定の不一致を確認する順序

  1. 稼働しているWARとweb.xml、ActionServletの設定読込先、対象モジュールを確認する。ローカルで編集したXMLと稼働設定の一致を先に調べる。
  2. 対象pathのnameをform-beanへ、typeを配備済みのJavaクラスへ照合する。同じ/loginでもモジュールが違えば別設定になり得る。
  3. scope、reset、送信項目名、validate、inputForward、inputを確認する。成功時と入力エラー時の両方を検査する。
  4. findForwardで解決する名前と遷移先、redirectの有無を確認する。再起動や設定ファイル削除を先に行わない。

Struts 1.3.10の単体では同一要求のForm再利用、resetとバインド、検証エラー時のinput条件、local/global forwardの優先を確認しています。設定全体のDTD妥当性、旧IDE、Tomcat/JSPへの実配備やサービスのDB保存全体は未検証です。標準processorと独自processorの違いも確認してください。

一次資料: Apache Struts 1.3.10公式ソース(ActionMapping / RequestProcessor / RequestUtils)。フォームはActionForm、実行はAction、タグの表示はJSPタグで個別に確認できます。設定の子ページもページ下部の案内から参照してください。


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

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