| この記事の要点 |
|
エラー内容
Struts 1.x の JSP で以下のように書くとコンパイル時に怒られます:
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<!-- ❌ NG: TLD によると、タグ form の属性 id は無効です -->
<html:form action="/login" id="loginForm" class="form-horizontal">
<html:text property="username" id="usernameInput" />
</html:form>TLDによると、タグ form の属性 id は無効です
According to TLD, attribute id is not valid for tag form.
これはJSPタグの属性宣言に関するエラーです。Struts 1の保守向けに、タグの属性と生成HTMLを分けて確認します。Struts 1は保守終了しており、新規導入は勧めません。
原因
Struts 1.x の HTML タグライブラリ(<html:form>、<html:text> 等)は標準 HTML 属性をそのまま受け取れない仕様になっています。JSPカスタムタグの属性は、そのタグを定義するTLDで決まります。Struts 1.3.10のhtml:formにはidとclassが宣言されず、styleIdとstyleClassが宣言されています。標準HTMLのformと、JSPで実行されるhtml:formは別のものとして確認してください。
主に名前がぶつかる属性は以下で、それぞれ別名が用意されています:
| 標準 HTML 属性 | Struts での書き方 | 出力される HTML 属性 |
|---|---|---|
id | styleId | id |
class | styleClass | class |
style | style (そのまま) | style |
name(通常の非indexed入力項目名) | property(html:text等) | name。JSPタグのname属性はBean参照名であり別の用途 |
value | value または ActionForm の値 | value |
対処: styleId / styleClass に書き換える
<!-- ✅ OK -->
<html:form action="/login" styleId="loginForm" styleClass="form-horizontal">
<html:text property="username" styleId="usernameInput" styleClass="form-control" />
<html:password property="password" styleId="passwordInput" styleClass="form-control" />
<html:submit styleClass="btn btn-primary">ログイン</html:submit>
</html:form>
出力される HTML は通常通りで、ブラウザ側は id="loginForm" として認識します:
<form action="/login.do" name="loginForm" method="post"
id="loginForm" class="form-horizontal">
<input type="text" name="username" value=""
id="usernameInput" class="form-control">
<input type="password" name="password" value=""
id="passwordInput" class="form-control">
<input type="submit" value="ログイン" class="btn btn-primary">
</form>
CSS / JavaScript からの参照
生成されたidとclassの値を維持するなら、対応するCSSセレクタやdocument.getElementById()、jQueryセレクタ$('#loginForm')は同じ値を参照できます。ただし、ページ内のid重複、JavaScriptの実行タイミング、生成HTMLを確認してください。属性名の訂正だけで、入力検証や送信処理まで正しく動くとは限りません。
// styleId を使っても JS からは id として参照可能
$('#loginForm').on('submit', function(e) {
if ($('#usernameInput').val() === '') {
alert('ユーザー名を入力してください');
e.preventDefault();
}
});
その他の Struts 1 タグでも同じパターン
同じ属性名のリネームは、<html:text> / <html:select> / <html:checkbox> / <html:radio> などでもstyleId/styleClassを使います。ただし、すべてのタグが同じ属性一覧を持つわけではありません。対象タグのTLDを確認します:
<html:select property="category" styleId="categorySelect" styleClass="form-select">
<html:option value="1">食品</html:option>
<html:option value="2">飲料</html:option>
</html:select>
<html:checkbox property="agree" styleId="agreeCheck" styleClass="form-check-input" />
Struts 2 の場合は異なる
Struts 2 では設計が刷新されており、id / cssClass という属性名になっています:
<!-- Struts 2 -->
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:form action="login" id="loginForm" cssClass="form-horizontal">
<s:textfield name="username" id="usernameInput" cssClass="form-control" />
</s:form>
| Struts 1 | Struts 2 | |
|---|---|---|
| id | styleId | id(そのまま) |
| class | styleClass | cssClass |
| style | style | cssStyle |
関連エラー
- 「タグ form の属性 class は無効です」 — 同じパターン。
styleClassに変更 - 「タグ ... の属性 name は無効です」 — タグ名を確認します。1.3.10のhtml:formはnameもpropertyも宣言せず、html:textは両方を宣言します。nameを一律にpropertyへ置換しないでください。
- 「タグ ... の属性 onclick は無効です」 — 別名へ推測で変更せず、対象タグの宣言を確認します。1.3.10のhtml:textはonclickを宣言しますが、html:formはonclickを宣言せずonsubmit/onresetを宣言します。必要なイベントと付ける要素が正しいか確認してください。
まとめ
Struts 1 のタグライブラリは標準 HTML とは別の独自仕様。以下を覚えておけば大体の TLD エラーは解決:
- id → styleId
- class → styleClass
- 入力部品のpropertyはフォームプロパティ、nameは読込み用Bean参照名。タグ別の意味と許可属性を確認する
- その他は Struts HTML Tag Library Reference を確認
修正しても同じTLDエラーが出るとき
- スタックトレースのJSP名・タグ名・属性名を確認します。formの訂正後にtextのidが別途指摘される場合もあります。
- taglibディレクティブのprefixとuri、web.xmlのタグライブラリ設定、配備したJAR内のMETA-INF/tldを照合します。prefixがhtmlという名前でも、読み込むタグライブラリが必ずStrutsとは限りません。
- 実際に配備した版のTLDで、そのタグのattribute/nameを確認します。IDEに登録された別の版の定義だけを見て判断しません。
- JSPと配備物の反映を確認し、生成HTMLでid/classが期待値になっているか調べます。生成idが重複しないことも確認します。Tomcatのwork削除やライブラリの一括交換を初手にしません。
掲載の生成HTMLは例示
上の/login.doという出力は、アプリのコンテキストやサーブレットのマッピングなどが対応している場合の説明例です。実際のAction URL、formのname、入力値は設定や状態に依存します。styleIdを付けるだけでそのHTML全文が必ず生成されるという意味ではありません。
Struts 1とStruts 2を混ぜない
Struts 2のform/textfield公式資料ではid、cssClass、cssStyleが確認できます。ただし既存のStruts 1 JSPで属性名やtaglibだけをStruts 2へ変更しても移行は完了しません。Action、フォームのモデル、設定、検証、ビュー、認証を含む移行設計が必要です。旧ActionFormのnameとStruts 2の入力nameも同じ仕様と扱いません。
確認した範囲と一次資料
Struts 1.3.10の配布JAR内TLDを解析し、formのstyleId/styleClassとid/class/name/propertyの非宣言、textのname/property/onclick、optionのvalueとpropertyの非宣言を単体検証しました。JSPコンパイラやTomcatでのページ生成全体、すべてのStruts版・タグの動作保証ではありません。
一次資料(2026年10月確認):Struts 1.3.10公式ソースとTLD(sources JAR)、Struts 2 formタグ、Struts 2 textfieldタグ。
子ページはありません
- createActionFormにてNullPointerException
- java.lang.NullPointerException: Module 'null' not found
- javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope
- Description Resource Path Location Type cvc-complex-type.2.4.a: Invalid content was found starting with element 'X'
- パス ... に対するアクションのインスタンスがありません
- TLDによると、タグ form の属性 id は無効です
人気ページ
- 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