| この記事の要点 |
|---|
|
保守では、XMLの綴りだけでなく、実際に読み込まれた設定・対象モジュール・フォームと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) |
type | Actionクラスの完全修飾名(FQCN)。ホスト名のFQDNではない |
name | 使用する form-bean 名 |
scope | request / session |
validate | 標準処理でFormがある場合に入力検証を有効化。キャンセル等の分岐も確認 |
input | 入力検証エラー時の戻り先。inputForward設定によりパスまたはforward名 |
parameter | DispatchActionでは処理名を読む要求パラメータの名前。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} さん
典型的なリクエストの流れ
- ユーザが
/login.doにアクセス - ActionServlet がリクエストを受信
- struts-config.xml の action-mappings から
/loginを検索 - 対応するform-bean
loginFormを取得または生成し、resetを呼んでから送信値をバインド validate=trueなら form の validate() メソッド呼び出し- 検証エラーあり → inputのパス/forward名へ戻る。未設定なら戻れずエラーになる
- エラーなし → Action クラスの
execute()実行 - execute() が ActionForward を返す(例: success)
- 返されたforwardのpathへ、forward/redirect設定に従って遷移する。遷移先はJSPとは限らない
Struts 1 vs Spring MVC(モダン)
| 項目 | Struts 1 | Spring 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/検証/認証/遷移を比較する
- テスト不足: 単体テストが書きづらい設計、リファクタリング前にテスト追加
関連記事
設定の不一致を確認する順序
- 稼働しているWARとweb.xml、ActionServletの設定読込先、対象モジュールを確認する。ローカルで編集したXMLと稼働設定の一致を先に調べる。
- 対象pathのnameをform-beanへ、typeを配備済みのJavaクラスへ照合する。同じ/loginでもモジュールが違えば別設定になり得る。
- scope、reset、送信項目名、validate、inputForward、inputを確認する。成功時と入力エラー時の両方を検査する。
- 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)
- 導入方法
- struts-config.xmlの説明
- ActionForm
- Action
- エラー一覧
- JSP タグ
- カスタムタグ(tablib)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15