6.

Struts「TLD によると、タグ form の属性 id は無効です」原因と対処

編集
この記事の要点
  • Struts JSP で を書くと「TLD によると、タグ form の属性 id は無効です
  • 原因: Struts の HTML タグライブラリは標準 HTML 属性をそのまま受け付けない
  • 対処: idstyleIdclassstyleClass に書き換える
  • CSS / JavaScript からの参照は変わらず id / class として出力される(属性名のリネームだけが必要)
  • Struts 2 では話が変わる — id 属性はサポートされる

エラー内容

Struts 1.x の JSP で以下のように書くとコンパイル時に怒られます:

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>



    
TLDによると、タグ form の属性 id は無効です
According to TLD, attribute id is not valid for tag form.

原因

Struts 1.x の HTML タグライブラリ( 等)は標準 HTML 属性をそのまま受け取れない仕様になっています。これは Struts が独自属性で値を上書き/管理する都合上、ぶつかる可能性のある名前を別名にしているためです。

主に名前がぶつかる属性は以下で、それぞれ別名が用意されています:

標準 HTML 属性Struts での書き方出力される HTML 属性
idstyleIdid
classstyleClassclass
stylestyle (そのまま)style
namepropertyname
valuevalue または ActionForm の値value

対処: styleId / styleClass に書き換える



    
    
    ログイン

出力される HTML は通常通りで、ブラウザ側は id="loginForm" として認識します:

CSS / JavaScript からの参照

変更不要。出力される属性名は id / class のままなので、CSS セレクタや document.getElementById()、jQuery セレクタ $('#loginForm') はそのまま動作します。

// styleId を使っても JS からは id として参照可能
$('#loginForm').on('submit', function(e) {
    if ($('#usernameInput').val() === '') {
        alert('ユーザー名を入力してください');
        e.preventDefault();
    }
});

その他の Struts 1 タグでも同じパターン

同じ属性名のリネームは、 / / / 等すべての HTML 系タグで共通です:


    食品
    飲料


Struts 2 の場合は異なる

Struts 2 では設計が刷新されており、id / cssClass という属性名になっています:


<%@ taglib prefix="s" uri="/struts-tags" %>


    
Struts 1Struts 2
idstyleIdid(そのまま)
classstyleClasscssClass
stylestylecssStyle

関連エラー

  • 「タグ form の属性 class は無効です」 — 同じパターン。styleClass に変更
  • 「タグ ... の属性 name は無効です」 — Struts は ActionForm のフィールド名を property で受ける
  • 「タグ ... の属性 onclick は無効です」 — Struts 1 では一部のイベント属性も別名が必要(バージョン依存)

まとめ

Struts 1 のタグライブラリは標準 HTML とは別の独自仕様。以下を覚えておけば大体の TLD エラーは解決:

  1. id → styleId
  2. class → styleClass
  3. name → property(フィールド連携の場合)
  4. その他は Struts HTML Tag Library Reference を確認
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. createActionFormにてNullPointerException
  2. java.lang.NullPointerException: Module 'null' not found
  3. javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope
  4. Description Resource Path Location Type cvc-complex-type.2.4.a: Invalid content was found starting with element 'X'
  5. パス ... に対するアクションのインスタンスがありません
  6. TLDによると、タグ form の属性 id は無効です