📗 Vol.8.10：独自タグの自作入門 〜 JSP カスタムタグライブラリの基礎 〜

🔗 本章は「Vol.8.9〜：Struts2 タグライブラリ応用編（実務／初級応用）」シリーズです。

---

Struts2の `<s:*>` タグに慣れてきたら、次のステップとして「**独自のカスタムタグ（JSPタグライブラリ）**」の作成を覚えましょう！

本記事では以下の構成で解説します：

- ✅ TLDファイル（タグ定義XML）の作り方
- ✅ カスタムタグクラス（Java）の作成方法
- ✅ JSPからの使い方
- ✅ よく使う実務パターンの紹介

---

## ✅ 想定読者

- Struts2のUIタグにはある程度慣れてきた
- JSPファイルに記述が散らかってきたので整理したい
- 再利用可能なUIパーツを部品化したい

---

## ✅ 本記事で学べること

| 項目 | 内容 |
|------|------|
| TLDファイルの構造 | タグライブラリ定義の基本 |
| タグクラスの作成 | `TagSupport` を継承したタグ実装 |
| JSPでの使い方 | `<%@ taglib ... %>` による呼び出し |
| 実務活用 | UI共通化・メッセージ表示・再利用部品の実装 |

---

## 🛠 Step 1：TLDファイルの作成

`/WEB-INF/custom.tld` に以下の内容で定義します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
            http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">
  <tlib-version>1.0</tlib-version>
  <short-name>custom</short-name>
  <uri>http://example.com/custom</uri>

  <tag>
    <name>messageBox</name>
    <tag-class>com.example.tags.MessageBoxTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
      <name>type</name>
      <required>false</required>
    </attribute>
    <attribute>
      <name>message</name>
      <required>true</required>
    </attribute>
  </tag>
</taglib>
```
### 🛠 Step 2：Javaのタグクラスを作成

```java
package com.example.tags;

import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.JspWriter;

public class MessageBoxTag extends TagSupport {
    private String type;
    private String message;

    public void setType(String type) {
        this.type = type;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public int doStartTag() {
        try {
            JspWriter out = pageContext.getOut();
            String cssClass = "info".equals(type) ? "box-info" : "box-default";
            out.write("<div class='" + cssClass + "'>" + message + "</div>");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return SKIP_BODY;
    }
}
```
---

### 🛠 Step 3：JSPから呼び出す

```jsp
<%@ taglib prefix="c" uri="http://example.com/custom" %>

<html>
  <body>
    <c:messageBox type="info" message="保存が完了しました。" />
  </body>
</html>
```

---
### 💡 実務での応用例

| カスタムタグ名            | 用途例                  |
| ------------------ | -------------------- |
| `<c:messageBox>`   | エラーメッセージや通知の共通化      |
| `<c:formGroup>`    | Bootstrap対応フォーム入力部品化 |
| `<c:submitButton>` | アイコン付きボタンの共通利用       |


----
### 📝 補足：TagSupportを使う理由
JavaEEの `TagSupport` を使うことで、JSPレベルで再利用可能な部品をJavaで表現できます。
Spring Bootでは「Thymeleaf + フラグメント」などの手段が主流ですが、***古典的なJSP構成のStruts2プロジェクトでは今も有効です。***

---
### 🔖 次回予告
📗 [Vol.8.11：タグの出力をスタイリッシュに！UI統一Tips](https://qiita.com/juehara-crypto/items/4793c85e0900a6fea4c8)
→ Struts2タグ（例：`<s:form>` や `<s:fielderror>`）の出力HTMLを読み解き、
BootstrapやCSSフレームワークと連携させる方法を紹介します！

---

### 🧭 Vol.8 応用編シリーズ（進捗一覧）



| Vol | タイトル | 内容のポイント |
|-----|----------|----------------|
| [📘 Vol.8.9](https://qiita.com/juehara-crypto/items/0d1e09c5241a2a1c9f60) | UIを条件で自在に制御！〜 `<s:if>` / `<s:else>` / OGNL活用 〜 | 状態や権限による動的出し分け、見やすい条件分岐 |
| [📗 Vol.8.10](https://qiita.com/juehara-crypto/items/10f85829a2e56e889cb3) | タグの自作入門 〜 カスタムJSPタグライブラリ基礎 〜 | 再利用可能な部品化でUI開発の効率を劇的改善 |
| [📗 Vol.8.11](https://qiita.com/juehara-crypto/items/4793c85e0900a6fea4c8) | 見た目を整えろ！〜 タグ構造のパターン化Tips 〜 | タグの入れ子・定型化でスタイリッシュなJSPに |
| [📗 Vol.8.12](https://qiita.com/juehara-crypto/items/bbe57cc81a3834704c4c) | 共通レイアウト設計術 〜 `<%@ include %>` 活用と部品化 〜 | ヘッダー・メニュー・フッターの共通化と構造整理術 |



----

### 🙏 最後に
Struts2でのUI開発を効率化するには、タグの理解と部品化が鍵になります。
本記事が皆さんの現場開発の一助になれば幸いです！

🌟 「いいね」や「ストック」で応援いただけると励みになります！


---