※ 本章は「UI制御編(実務向け UI 出し分け・エラー表示制御・再利用設計)」シリーズとなります
Struts2での開発が進む中で、「同じようなフォームUI を複数の画面で使い回したい…!」と思ったことはありませんか?
本記事では、フォームの共通化・再利用をテーマに、<s:form>
や <%@ include %>
を使った保守性の高い実務的な構成方法を紹介します!
✅ 本記事の対象者
- フォーム構造を複数画面で使い回したい
-
<s:form>
の設計を見直したい - JSPの共通化設計に迷っている
- 画面ごとの保守をラクにしたい
🏗 共通フォーム構造の必要性
以下のようなケース、よくあります。
- 「ユーザー登録」画面と「ユーザー編集」画面で同じフォーム構造を使いたい
- 「検索条件フォーム」や「投稿フォーム」などを複数画面で再利用したい
💡 ポイント: 同じUI構造をコピペして管理すると、保守コストがどんどん上がってしまいます!
📦 解決策:共通JSPとしてフォーム部品を切り出す!
共通フォームは別ファイル(JSP)として分離し、呼び出し元で <%@ include %>
を使って読み込むのが基本です。
📁 構成例
/view/
├── UserCreateScreen.jsp
├── UserEditScreen.jsp
└── common/
└── userForm.jsp ← 共通フォーム部品!
💻 実装例:ユーザー情報入力フォームを共通化
🔹 共通部品(common/userForm.jsp)
<%@ taglib prefix="s" uri="/struts-tags" %>
<tr>
<th>ユーザー名</th>
<td><s:textfield name="user.username" /></td>
</tr>
<tr>
<th>メールアドレス</th>
<td><s:textfield name="user.email" /></td>
</tr>
🔹 呼び出し元(UserCreateScreen.jsp)
<%@ include file="/view/common/userForm.jsp" %>
✅ 複数画面から同じUI部品を使えるように!
🧩 応用編:条件による分岐も可能!
たとえば「編集画面ではIDは表示のみ」といった制御もできます。
<%-- 共通フォーム部品の中で条件分岐 --%>
<% boolean isEdit = request.getRequestURI().contains("Edit"); %>
<tr>
<th>ユーザーID</th>
<td>
<% if (isEdit) { %>
<s:property value="user.id" />
<% } else { %>
<s:textfield name="user.id" />
<% } %>
</td>
</tr>
※上記は JSTLやOGNLを活用してもっと柔軟に設計可能です!
📌 注意点とベストプラクティス
注意点 | 対処法・ベストプラクティス |
---|---|
フォーム内のタグ名が競合する | name属性をプレフィックス付きに設計しておくなど工夫を |
共通部品が肥大化する | 用途ごとに userForm_search.jsp などに分離 |
リクエスト属性に依存しすぎる |
model-driven を使ってActionからしっかり渡す |
✨ まとめ
-
✅ 同じ構造のフォームはJSPファイルとして共通化しよう
-
✅ <%@ include %> を使って画面側に組み込む
-
✅ 柔軟な制御が必要なら条件分岐やOGNLも活用
-
✅ 保守性・再利用性が劇的に向上!
🔗 次回予告:Vol.8.15【状態に応じた表示制御】へ!
次回は「ボタンの表示/非表示の切り替え」や「ログインユーザーに応じたUI制御」など、状態管理と連動したUI制御Tipsをお届けします!