✅ OGNL式 一覧＆条件分岐集（Struts2 実務向けリファレンス）

Struts2で `<s:if>` や `<s:elseif>`、`<s:else>` を使って表示制御を行う際によく使う ***OGNL式パターン*** をまとめました。
***セッション判定 / ログイン判定 / リストの有無 / 権限チェック など*** 、実務ですぐ使えるものを中心にしています。

### 🔸 基本：スコープ内の値を取得する

| 式                  | 説明              |
| ------------------ | --------------- |
| `#session.xxx`     | セッションスコープの変数    |
| `#request.xxx`     | リクエストスコープの変数    |
| `#application.xxx` | アプリケーションスコープの変数 |
| `#parameters.xxx`  | リクエストパラメータ      |


---
### 🔸 値の比較・一致チェック

| OGNL式                                             | 説明                   |
| ------------------------------------------------- | -------------------- |
| `#session.loggedInUser.user_id == 'admin'`        | ユーザーIDが "admin"      |
| `#session.role == 'manager'`                      | ロールが "manager" のユーザー |
| `thread.user_id == #session.loggedInUser.user_id` | スレッドの作成者か判定          |
| `flag == true`                                    | フラグがtrueの場合          |
| `status != 'deleted'`                             | 削除されていない状態か          |

---

### 🔸 null / 空チェック
| OGNL式                                   | 説明                   |
| --------------------------------------- | -------------------- |
| `#session.xxx != null`                  | セッションに値があるか          |
| `someList != null && someList.size > 0` | リストが存在し、空でない         |
| `str != null && !str.trim().isEmpty()`  | 文字列がnull・空白でない       |
| `str?.length > 0`                       | （簡易）nullセーフで文字列長チェック |


---

### 🔸 数値・サイズ判定

| OGNL式                     | 説明        |
| ------------------------- | --------- |
| `list.size > 0`           | リストが空でない  |
| `count >= 10`             | 件数が10件以上か |
| `user.age >= 18`          | 年齢が18歳以上か |
| `price * quantity > 1000` | 数値の演算も可能  |

---

### 🔸 日付・フォーマット（応用）
OGNL単体では複雑な日付計算は非推奨ですが、サーバー側で整形済みの値を比較するのがベスト。

```jsp
<s:if test="%{#session.today == item.expireDate}">
    本日が有効期限です
</s:if>
```

---

### 🔸 booleanフラグ判定

| OGNL式                    | 説明    |
| ------------------------ | ----- |
| `isEditable == true`     | 編集可能か |
| `hasPermission == false` | 権限がない |


---

### 🔸 ネスト＆論理式の活用

| OGNL式                                                    | 説明             |                            |           |
| -------------------------------------------------------- | -------------- | -------------------------- | --------- |
| `#session.user != null && #session.user.role == 'admin'` | ユーザーが存在し、かつ管理者 |                            |           |
| \`thread.user\_id == #session.loggedInUser.user\_id      |                | #session.role == 'admin'\` | 作成者または管理者 |

---

### 🔸 文字列の部分一致（contains）
```jsp
<s:if test="%{'admin' in #session.loggedInUser.role}">
```
---

### 🔸 三項演算的なOGNL式
```jsp
<s:property value="isAdmin ? '管理者' : '一般ユーザー'" />
```
---
### 🔸 リストの中に特定の値が含まれるかの判定
```jsp
<s:if test="%{#session.roles.contains('manager')}">
```

---
### 🔧 補足：デバッグ表示タグ
開発中にスコープの変数や値を確認したいときは以下を使います。
```jsp
<s:debug />
```
---

※ デバッグ表示は ***開発環境のみ*** に限定してください。
　本番環境で出すと機密情報が見えてしまいます！

---

### 🧩 組み合わせ例（実務向け）

```jsp
<!-- ログイン済みかつ、管理者だけがボタンを表示 -->
<s:if test="%{#session.loggedInUser != null && #session.loggedInUser.role == 'admin'}">
    <s:submit value="管理者設定" />
</s:if>
```
```jsp
<!-- スレッド作成者または管理者に編集ボタンを表示 -->
<s:if test="%{#session.loggedInUser.user_id == thread.user_id || #session.loggedInUser.role == 'admin'}">
    <s:form action="EditThread">
        <s:hidden name="thread_id" value="%{thread_id}" />
        <s:submit value="スレッド編集" />
    </s:form>
</s:if>
```


### 📘 この資料の使い方
- Qiita記事に「折りたたみボックス」や別ファイルでリンクして併用

- プロジェクト内の「OGNLパターン集」として共有化

- 新人向けの Struts2 研修資料などに活用

----