※ 本章は「データ一覧表示の最適化」シリーズとなります
■ はじめに:カスタムタグの応用が“実務の質”を変える
Struts2のカスタムタグは単なるテンプレート記述の省力化にとどまらず、
**「共通UI部品」**として設計することで、保守性・再利用性・チーム開発効率が大きく向上します。
本記事では、Struts2のタグライブラリ機能を活用した実務向け拡張パターンをご紹介します。
■ カスタムタグの構成復習(最低限ここだけ押さえる)
要素 | 役割 |
---|---|
.tag ファイル |
実際に出力されるUI部品のテンプレート |
TLDファイル | カスタムタグの定義情報(属性・名前空間など) |
TagSupport 拡張クラス(必要に応じて) |
高度な動的ロジックを扱う場合に使用 |
※
.tag
のみでも多くの共通化は実現可能です
✅ パターン①:よく使う「ラベル+入力欄」UIの共通タグ化
📌 目的
- 同じような入力UIが各画面に散在している
- 必須マークや幅・エラー対応がバラバラ
✅ 例:labelInput.tag
<div class="form-group">
<label for="${id}">
${label}<s:if test="required"> <span class="required">*</span></s:if>
</label>
<s:textfield name="${name}" id="${id}" cssClass="form-control"/>
</div>
✅ 使用例(JSP側)
<my:labelInput name="username" label="ユーザー名" required="true"/>
✅ パターン②:エラー付きフォーム部品の共通タグ化
📌 目的
-
入力欄に対して個別に
<s:fielderror>
を毎回書くのが面倒 -
スタイリングやマークアップが統一されていない
✅ 例:errorInput.tag
<div class="form-group <s:if test="hasFieldErrors('${name}')">has-error</s:if>">
<label for="${name}">${label}</label>
<s:textfield name="${name}" id="${name}" cssClass="form-control"/>
<s:fielderror fieldName="${name}" />
</div>
✅ パターン③:繰り返しUI部品(リストアイテムのタグ化)
📌 目的
-
<s:iterator>
で表示するリスト内の構造が毎回複雑 -
投稿一覧、コメント、通知など、見た目とロジックが類似している
✅ 例:postItem.tag
<div class="post">
<div class="post-header">${post.userName} さん</div>
<div class="post-body">${post.content}</div>
<div class="post-footer">${post.timestamp}</div>
</div>
✅ 使用例(JSP側)
<s:iterator value="postList" var="post">
<my:postItem post="%{#post}" />
</s:iterator>
💡 共通タグ設計のポイント&落とし穴
-
🔹 属性数が多すぎると逆に使いにくくなる
-
🔹 ロジックと表示の責務を分ける(カスタムタグはUI専用に)
-
🔹 JSPで読みやすさ・書きやすさを両立する命名規則を持つ
📝 まとめ:業務効率に直結する「共通UI部品化」のすすめ
-
フォームや表示UIの「見た目」や「構造」をタグ化することで、
保守性・再利用性・チーム開発効率が劇的に改善されます。 -
UIの仕様変更にも強く、プロジェクト全体の品質向上にもつながります。