📘 Vol.8.9：【Struts2】条件分岐でUIを自在に制御！〜 <s:if> / <s:else> / OGNL式の実践活用 〜

🔗 **「Vol.8.9〜：Struts2 タグライブラリ応用編（実務／初級応用）」シリーズのはじまりです！**
💡「Vol.8.0〜8.8：Struts2 タグライブラリ入門編（基本操作・最低限の知識）」は前回で完結しています。

---

### ✅ 今回のテーマ
Struts2のUIタグライブラリの中でも、
「ユーザーやデータの状態に応じて、ボタンや入力欄などの表示を切り替える」
といった **「表示制御」** の技術は、実務でもよく登場します。

そこで今回は以下のポイントを扱います。

- <s:if> / <s:else> を使った条件分岐

- OGNL式による柔軟な判定ロジック

- 実プロジェクトでの活用例（「編集ボタン」の表示制御など）

---

### 1. `<s:if> / <s:else>` の基本構文

```jsp
<s:if test="%{ 条件式 }">
    <!-- 条件が true の場合に表示 -->
</s:if>

<s:else>
    <!-- 条件が false の場合に表示 -->
</s:else>
```

たとえば、セッション内のユーザーIDが「admin」の場合にだけ表示する例：

```jsp
<s:if test="%{#session.loggedInUser.user_id == 'admin'}">
    <p>管理者専用メニューです</p>
</s:if>
```
---

### 2. OGNL式での条件判定例
Struts2タグの `test` 属性には OGNL (Object-Graph Navigation Language) 式が使われます。
以下は使用頻度の高い判定ロジック例です。

| 条件            | testの中身                                              | 補足           |
| ------------- | ---------------------------------------------------- | ------------ |
| セッションに値があるか   | `%{#session.xxx != null}`                            | セッション存在チェック  |
| ログインユーザーのID一致 | `%{#session.loggedInUser.user_id == thread.user_id}` | 編集者確認など      |
| リストが空かどうか     | `%{myList.size > 0}`                                 | データ存在チェック    |
| フラグによる制御      | `%{flag == true}`                                    | サーバー側で制御しやすい |

---

### 💡補足：OGNL式でのデバッグ方法
表示がうまくいかないときは、以下のタグでスコープ内の情報を確認できます。

```jsp
<s:debug />
```

デバッグ情報がHTMLとして出力され、変数やスコープの中身が確認できます。
※ ***本番環境では絶対に出力しないでください！***（セキュリティ上のリスクがあります）

---
### 3. 実践例：ログインユーザーのみ「編集ボタン」を表示する
以下は、***スレッドの作成者だけに「編集ボタン」を表示する***実装例です。

（本プロジェクトの `threadDetailScreen.jsp` より抜粋）

```jsp
<!-- 「スレッド編集」ボタン表示＆非表示の判定処理 -->
<!-- ログインユーザーと、スレッド作成者が一致した場合にボタンを表示する -->
<!-- スレッド作成者の情報はThreadDetailActionクラスにて、スレッドの作成者IDをセッションに保存している -->
<div>
    <s:if test="%{#session.loggedInUser.user_id == #session.thread_user_id}">
        <s:form action="EditThread" method="post">
            <s:hidden name="thread_id" value="%{thread_id}" />
            <s:submit value="スレッド編集" />
        </s:form>
    </s:if>
</div>
```

🔗 [該当コード（GitHub）: ](https://github.com/juehara-crypto/Portfolio_Bulletinboard/blob/master/03.%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/Bulletinboard/WebContent/view/threadDetailScreen.jsp)

---
### ✅ まとめ：Vol.8 タグライブラリ「入門編」から「応用編」へ

| Vol          | タイトル        | 内容                                             |
| ------------ | ----------- | ---------------------------------------------- |
| [8.0](https://qiita.com/juehara-crypto/items/9b9558d46dfa5ac75224)          | OGNL入門      | Struts2タグの基礎を支える技術                             |
| 8.1〜8.7      | 各UIタグ       | `input`, `form`, `submit`, `fielderror` などの使い方 |
| [8.8](https://qiita.com/juehara-crypto/items/b3c42f90a7281adeca77)          | 総まとめ        | 入門編の振り返りと全体像の整理                                |
| **8.9（本記事）** | **条件表示の応用** | **表示制御（if / else）とOGNLの実践活用** ← 応用編のスタート！      |


---

### ▶ 次回予告：[Vol.8.10（仮）〜 カスタムタグを使ってもっと自由なUI制御へ！](https://qiita.com/juehara-crypto/items/10f85829a2e56e889cb3)
次回はさらに一歩進んで、カスタムタグや共通コンポーネントの工夫など、
現場で役立つStruts2タグの応用テクニックをご紹介予定です。お楽しみに！

---

### 🚀 公開中のシリーズ記事一覧
👉 📚 [まとめページはこちら](https://qiita.com/juehara-crypto/items/e2837f5bbaa50d7aefdd)