ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
ActionMapping とは
org.apache.struts.action.ActionMapping は Struts1 のコアクラスで、struts-config.xml に書かれた <action> 要素 1 件分の情報を保持します。フレームワークはリクエスト URL に対応する ActionMapping を見つけ、それを Action#execute() の第 1 引数として渡します。
struts-config.xml の典型例
<?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>
<!-- フォーム Bean 定義 -->
<form-beans>
<form-bean name="loginForm" type="com.example.form.LoginForm" />
</form-beans>
<!-- グローバル遷移先 -->
<global-forwards>
<forward name="error" path="/error.jsp" />
<forward name="sessionTimeout" path="/login.jsp" redirect="true" />
</global-forwards>
<!-- アクション定義 -->
<action-mappings>
<action path="/login"
type="com.example.action.LoginAction"
name="loginForm"
scope="request"
input="/login.jsp"
validate="true">
<forward name="success" path="/home.jsp" redirect="true" />
<forward name="failure" path="/login.jsp" />
</action>
</action-mappings>
</struts-config>
属性の意味
| 属性 | 意味 | 備考 |
|---|---|---|
path | リクエスト URL の論理名(拡張子前) | /login なら /login.do が来る |
type | 実行する Action クラス FQDN | 必須 |
name | 使用する ActionForm の論理名 | form-beans 内の name と対応 |
scope | フォームのスコープ | request / session |
input | 検証失敗時の戻り先 JSP | validate="true" 時に必須 |
validate | フォーム検証を行うか | true で validate() が呼ばれる |
parameter | サブメソッド指定(DispatchAction 用) | method 等 |
Action#execute() での使い方
package com.example.action;
import org.apache.struts.action.*;
import javax.servlet.http.*;
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
LoginForm lf = (LoginForm) form;
// ビジネスロジック
boolean ok = AuthService.login(lf.getUserId(), lf.getPassword());
if (ok) {
// <forward name="success" path="/home.jsp"/> へ
return mapping.findForward("success");
} else {
// ActionErrors を積んで戻る
ActionMessages errors = new ActionMessages();
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("error.login.failed"));
saveErrors(request, errors);
// <forward name="failure" path="/login.jsp"/> へ
return mapping.findForward("failure");
}
}
}
findForward() の動作順
mapping.findForward("success") は次の順で ActionForward を探します:
- その
<action>配下の<forward name="success"> - 見つからなければ
<global-forwards>配下の<forward name="success"> - それも無ければ
nullを返す(白画面 / NPE の元)
入力検証失敗時のフロー(input 属性)
validate="true" の場合、ActionForm#validate() が execute() より先に呼ばれます。ActionErrors が空でなければ execute() はスキップされ、input 属性の JSP に戻ります:
public class LoginForm extends ActionForm {
private String userId;
private String password;
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (userId == null || userId.isEmpty()) {
errors.add("userId", new ActionMessage("error.userId.required"));
}
if (password == null || password.length() < 8) {
errors.add("password", new ActionMessage("error.password.length"));
}
return errors; // 空でなければ input 属性の JSP へ
}
// getter/setter ...
}
modules による分割
大規模アプリでは機能単位に config を分けられます:
<!-- web.xml -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/order</param-name>
<param-value>/WEB-INF/struts-config-order.xml</param-value>
</init-param>
<init-param>
<param-name>config/admin</param-name>
<param-value>/WEB-INF/struts-config-admin.xml</param-value>
</init-param>
</servlet>
URL は /order/list.do, /admin/users.do のように module 名が prefix になります。
Spring MVC への移行
Struts1 は Apache 公式 2013 年 12 月 EOL。新規開発はもちろん、既存も計画的に Spring MVC / Spring Boot に移行すべきです。対応関係:
| Struts1 | Spring MVC |
|---|---|
<action path="/login"> | @RequestMapping("/login") |
ActionForm | @ModelAttribute の DTO |
ActionForward | return "home" (View 名) |
findForward("success") | 同上 / ModelAndView |
validate() | @Valid + Bean Validation |
struts-config.xml | Java Config / @Configuration |
FAQ
Q: findForward() が null を返す
A: <forward name="..."> のスペルミスが多い。<global-forwards> にも無いか確認。
Q: input 属性が無いと?
A: validate="true" で検証失敗時に java.lang.IllegalStateException: No input attribute。input は必須。
Q: redirect="true" の意味
A: RequestDispatcher.forward() ではなく sendRedirect() を使う。request 属性は失われるので注意。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
同階層のページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?