| この記事の要点 |
|
タグのURI解決、参照するBean、生成されるHTMLの安全性は別々の確認対象です。Struts 1の既存システム保守と他方式への比較向けで、保守終了したライブラリの新規導入は勧めません。
Struts JSP タグの概要
Struts はカスタムタグライブラリを提供し、JSP 側で <% %> スクリプトレットを書かずに HTML フォームや繰り返し処理を表現できます。Struts 1 と Struts 2 でタグ体系が大きく異なるため、それぞれ把握する必要があります。
Struts 1 のタグ体系
| 接頭辞 | TLD URI | 用途 |
|---|---|---|
html | http://struts.apache.org/tags-html | HTML フォーム要素 |
bean | http://struts.apache.org/tags-bean | Bean / メッセージ表示 |
logic | http://struts.apache.org/tags-logic | 条件分岐・繰り返し |
nested | http://struts.apache.org/tags-nested | ネストプロパティ |
tiles | http://struts.apache.org/tags-tiles | Tiles レイアウト |
Struts 1 タグ使用例
下のlogic:equalはiterateの終了後にuserを参照していますが、反復タグが公開するuserの有効範囲と初期状態に依存します。管理者メニューを表示するだけの条件と、サーバーでの操作権限の判定は別です。見た目の条件分岐を認可として使わないでください。
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<html:form action="/login">
ユーザー ID: <html:text property="userId"/>
パスワード: <html:password property="password"/>
<html:submit value="ログイン"/>
</html:form>
<%-- メッセージ表示 --%>
<logic:messagesPresent>
<ul>
<html:messages id="msg">
<li><bean:write name="msg"/></li>
</html:messages>
</ul>
</logic:messagesPresent>
<%-- 繰り返し --%>
<logic:iterate id="user" name="userList">
<bean:write name="user" property="name"/>
</logic:iterate>
<%-- 条件分岐 --%>
<logic:equal name="user" property="role" value="admin">
管理者メニュー
</logic:equal>
Struts 2 のタグ体系
Struts 2 では <s:> 接頭辞に統一され、OGNL で Action のプロパティに直接アクセスできます。
<%@ taglib prefix="s" uri="/struts-tags" %>
<%-- フォーム --%>
<s:form action="login" method="post">
<s:textfield name="userId" label="ユーザー ID"/>
<s:password name="password" label="パスワード"/>
<s:select name="role" label="ロール"
list="{'admin','user','guest'}"/>
<s:submit value="ログイン"/>
</s:form>
<%-- 条件 --%>
<s:if test="hasActionErrors()">
<s:actionerror/>
</s:if>
<s:elseif test="loggedIn">
ようこそ <s:property value="userName"/>
</s:elseif>
<%-- 繰り返し --%>
<s:iterator value="userList" var="u" status="st">
<s:property value="#st.index"/>: <s:property value="#u.name"/>
</s:iterator>
<%-- URL 生成 --%>
<s:url action="logout" var="logoutUrl"/>
<a href="${logoutUrl}">ログアウト</a>
<%-- 国際化 --%>
<s:text name="welcome.message"/>
Struts 1 タグ ⇔ Struts 2 タグ対応表
これは用途の対照表で、タグ名だけを置き換える移行手順ではありません。Struts 1のBean名/scope、Struts 2のValue Stack/OGNL、SpringのmodelAttribute/pathは異なります。prefixはJSPで選ぶ別名で、sという文字そのものがフレームワークを判別する鍵ではありません。表の${var}もHTMLエスケープを保証せず、HTML本文表示ならc:out等の適切な出力処理を使います。
| 用途 | Struts 1 | Struts 2 | JSTL/Spring MVC |
|---|---|---|---|
| フォーム | <html:form> | <s:form> | <form:form> (Spring) |
| テキスト入力 | <html:text> | <s:textfield> | <form:input> |
| パスワード | <html:password> | <s:password> | <form:password> |
| セレクト | <html:select> | <s:select> | <form:select> |
| サブミット | <html:submit> | <s:submit> | <button type="submit"> |
| 値出力 | <bean:write> | <s:property> | ${var} / <c:out> |
| 繰り返し | <logic:iterate> | <s:iterator> | <c:forEach> |
| 条件 (=) | <logic:equal> | <s:if test=""> | <c:if test=""> |
| エラー表示 | <html:errors> | <s:fielderror> | <form:errors> |
TLD (Tag Library Descriptor) とは
uriはライブラリを識別する名前で、JSPがそのURLへHTTP取得するという意味ではありません。配備済みJARのTLD、明示的なtaglib設定、スキャン設定を照合します。次の抜粋は説明用に加工されており、完全なTLDとして保存する例ではありません。実際の対象版のTLDでタグごとの属性・必須条件・本体制約を確認してください。
カスタムタグの定義ファイルです。JAR 内の META-INF/*.tld に同梱され、JSP コンテナがタグ名とハンドラクラスを対応付けるのに使います:
<!-- struts-html.tld の抜粋 -->
<taglib>
<tlib-version>1.3</tlib-version>
<short-name>html</short-name>
<uri>http://struts.apache.org/tags-html</uri>
<tag>
<name>text</name>
<tag-class>org.apache.struts.taglib.html.TextTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>property</name>
<required>true</required>
</attribute>
</tag>
</taglib>
よくあるエラー
1. Unable to find taglib uri
org.apache.jasper.JasperException: /WEB-INF/views/login.jsp(2,1)
PWC6188: The absolute uri: http://struts.apache.org/tags-html cannot be
resolved in either web.xml or the jar files deployed with this application
原因と対処:
- struts-taglib.jar (Struts 1) または struts2-core.jar (Struts 2) が
WEB-INF/lib/にない → 追加 - uri の綴り間違い → 公式の URI に合わせる
- JAR バージョン違い (1.3 系で 1.2 系の uri 等) → JAR と uri を一致させる
2. property を見つけられない (No getter method for property)
javax.servlet.jsp.JspException: No getter method for property userId
of bean org.apache.struts.taglib.html.BEAN
値の読出しでは、実際に参照するBeanに読み取り可能なuserIdがあるかを確認します。getter未検出をsetter不足と同一視しません。書込みのバインドではsetterを別に照合します。Beanの名前・scope・綴り・型が誤っている場合もあるため、メソッド追加を先に決めないでください。
Spring MVC への移行例
下のSpring例は表示側の断片です。ControllerがloginFormとBindingResultを同じModelへ用意し、送信先のマッピング・HTTPメソッド・入力検証・エラー時の再表示を整える必要があります。action="login"は相対URLなので実際の生成先も確認します。既存URLとCSRF/認証・認可はタグ置換とは別に維持します。
Struts 1 のフォームを Spring MVC へ書き換えるパターン:
<%-- Struts 1 --%>
<html:form action="/login">
<html:text property="userId"/>
<html:password property="password"/>
<html:submit value="ログイン"/>
<html:errors/>
</html:form>
<%-- Spring MVC --%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form action="login" modelAttribute="loginForm">
<form:input path="userId"/>
<form:password path="password"/>
<button type="submit">ログイン</button>
<form:errors path="*" cssClass="error"/>
</form:form>
JSTL のみで Struts タグを置き換える
下の旧例をそのまま安全な代替フォームとして使わないでください。 value内の${param.userId}は入力を直接式展開しており、引用符やマークアップをHTMLエスケープしていません。ELの展開だけではXSS対策になりません。またerrorsを誰が用意するか、送信先・検証・CSRF・認証は別の実装です。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<form action="${pageContext.request.contextPath}/login" method="post">
<input type="text" name="userId" value="${param.userId}"/>
<input type="password" name="password"/>
<button type="submit">ログイン</button>
</form>
<c:if test="${not empty errors}">
<ul class="error">
<c:forEach var="e" items="${errors}">
<li><c:out value="${e}"/></li>
</c:forEach>
</ul>
</c:if>
FAQ
Q: Struts 1 と Struts 2 のタグを同じ JSP に混在できる?
A: タグURIを分けるだけで、両フレームワークの要求処理や参照するModelまで一致するわけではありません。両方のServlet/Filter/依存/値公開の前提が必要です。接頭辞が違うだけでハンドラが必ず競合するとも断定せず、移行範囲と要求経路を分けて検査してください。
Q: TLD ファイルは web.xml に書く必要がある?
A: 自動検出されるJAR内TLDなら明示設定を省略できますが、すべての宣言が不要という意味ではありません。独自TLD/URIの対応や対象コンテナのスキャン設定を確認し、既存web.xmlの宣言を一律削除しないでください。
Q: カスタムタグを自作したい
A: JSP 2.0 以降は .tag ファイル (WEB-INF/tags/ に配置) で簡単に作成可能。Java クラス + TLD を書く必要はない。
関連項目
入力値の再表示を安全にする
旧javax系JSTLでのHTMLの引用符付き属性への再表示例は次のとおりです。c:outのXMLエスケープを有効にし、HTMLの引用符や特殊文字をデータとして出力します。これはJavaScript・CSS・任意URLへ埋め込む汎用対策ではありません。パスワードを再表示する用途には使いません。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<input type="text" name="userId" value="<c:out value='${param.userId}' escapeXml='true'/>">上のURIは旧javax系JSTL向けです。Jakarta Tags 3.0のcore URIはjakarta.tags.coreで、古いStruts 1のjavax依存と現行Jakarta依存を無造作に混ぜないでください。使用中のJSP/Servlet/JSTLの版を先に確認します。
表示を直した後の確認
- 初回表示と入力エラー再表示で、同じBeanとプロパティを参照するか。
- 引用符・山括弧・アンパサンドを含む値が文字として表示され、生成HTMLの属性やタグを壊さないか。
- 生成されたinputのname、formのaction/method、実送信される値と検証結果が既存と一致するか。
- 画面の表示条件とは別に、送信時の認証・認可・CSRF検査が維持されるか。
Struts 1.3.10のタグ補助処理で、Bean参照とgetter未検出、送信項目名、filterによる特殊文字の変換を単体確認しました。JSTL例は公式の出力エスケープ規則を照合したもので、JSPコンパイル・コンテナ上の実送信・Struts 2/Springへの移行全体は未検証です。
一次資料: Struts 1.3.10タグ実装/TLD、Apache Struts 2タグ構文、Spring公式JSPフォーム連携、Jakarta Tags 3.0仕様(coreと出力エスケープ)。設定はstruts-config.xml、BeanはActionFormも参照してください。
- JSTL — JSP 標準タグライブラリ
- EL (Expression Language) — JSP/Servlet 標準の式言語
- Spring MVC form タグ — 移行先の標準
- Thymeleaf — タグライブラリ不要の HTML テンプレート
人気ページ
- 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