📘 Vol.8.0：【Struts2】OGNL入門　〜タグライブラリを支える最重要基礎技術〜

本記事は、Struts2でJSPを書く際に頻出するタグの基本を網羅する  
**📘「Vol.8.0〜8.7：Struts2 タグライブラリ入門編（基本操作・最低限の知識）」**　シリーズの一部です。


## ✅ はじめに

Struts2のJSP開発で頻繁に登場する `<s:〜>` タグたち。その中で欠かせない「共通言語」が **OGNL（Object Graph Navigation Language）** です。

本記事は、Struts2タグライブラリ徹底解説シリーズ「Vol.8」の基礎として、タグを深く理解するための **OGNL入門ガイド** となっています。

---

## 🔍 OGNLとは？

- **Object Graph Navigation Language** の略。
- Javaオブジェクトの **プロパティを文字列ベースで辿るための式言語**。
- Struts2では、ほぼすべての `<s:〜>` タグの中で使われています。

```jsp
<s:property value="user.name" />
```

この user.name の部分が **OGNL式** です。

---

### 🧠 どう使われるのか？
Struts2のタグライブラリでは、主に次の用途でOGNLが使われます：

| 用途       | 例                  | 説明                 |
| -------- | ------------------ | ------------------ |
| プロパティ参照  | `user.name`        | JavaBeanのプロパティ呼び出し |
| 条件分岐     | `user.age > 18`    | 比較や論理式にも使える        |
| メソッド呼び出し | `user.getName()`   | Javaメソッドも呼び出せる     |
| リストアクセス  | `users[0].name`    | 配列やListの要素参照       |
| マップアクセス  | `settings['lang']` | Mapのキーアクセス         |

---

### 📘 ValueStackとの関係
Struts2では、アクションやモデルのオブジェクトは **ValueStack（値スタック）** という構造で管理されます。

OGNL式はこのValueStackの中にあるオブジェクトに対して評価されるため、 **直接セッターやゲッターを書かなくてもアクセス可能** になります。

```java
public class User {
    private String name;
    public String getName() { return name; }
}

public class SomeAction extends ActionSupport {
    private User user = new User();
    public User getUser() { return user; }
}
```

```jsp
<!-- user.getName() と等価 -->
<s:property value="user.name" />
```

---

### 🔑 よく使うOGNL式（チートシート）

```jsp
<s:property value="user.name" />         <!-- プロパティ表示 -->
<s:if test="user.age >= 18">OK</s:if>    <!-- 条件式 -->
<s:property value="items[0].title" />    <!-- 配列/List要素 -->
<s:property value="map['key']" />        <!-- Mapキーアクセス -->
<s:property value="user.getName()" />    <!-- メソッド呼び出し -->
<s:property value="name?.toUpperCase()" /> <!-- nullセーフ演算子（OGNL 3.x） -->
```

---

### 🚫 よくあるエラー


| エラー                         | 原因                             |
| --------------------------- | ------------------------------ |
| `No property found for xxx` | プロパティ名のスペルミス、もしくはgetter未定義     |
| `Cannot invoke method`      | publicメソッドでない or 引数ありのメソッド呼び出し |
| 空白ページになる                    | OGNL式評価に失敗して出力されない（null）       |


---

### 💡 実務Tips
- フォーム送信時にもOGNLが裏で使われており、name="user.name" のようなバインディングが可能。

- 条件式に文字列比較や複雑なロジックを入れるときは、タグではなくJava側で処理した方が可読性が高まる。

- OGNL式はテンプレートに埋め込めるが、過度なロジックは避けるのが実務流儀。

---



### 🧩 本シリーズとの位置づけ
このOGNL入門は、以下のStruts2タグを理解するための 「**基礎体力**」 です。

- s:property, s:if, s:iterator, s:select

- s:set, s:push, s:include, s:action

- s:form, s:textfield, s:token など

→ **Vol.8.1以降の記事を読む前にぜひ抑えておきたい内容！**

---

### 📝 まとめ

| ポイント        | 内容                                |
| ----------- | --------------------------------- |
| OGNLとは      | Javaオブジェクトを式で参照する仕組み              |
| Struts2との関係 | ValueStack上のデータをタグで操作するために使う      |
| 書き方         | `user.name` や `items[0].title` など |
| 実務Tips      | わかりやすく、使いすぎないのがポイント               |


### ▶️ 次回予告
次は改めて「[📘 Vol.8.1]()」として、Struts2タグライブラリの全体像と種類を解説します！

---

## 📚 関連記事（Vol.8シリーズ）

- [📘 Vol.8.1：【Struts2】タグライブラリの全体像と種類を把握する 〜JSP開発で使えるタグ一覧と役割まとめ〜](https://qiita.com/juehara-crypto/items/9635c8746d362496aef3)

- [📘 Vol.8.2：【Struts2】JSPタグライブラリ実践テンプレート集 〜現場で即使える！フォーム・URL・セッション活用まとめ〜](https://qiita.com/juehara-crypto/items/f57e473a85b2c9845730)

- [📘 Vol.8.3：Struts2で作る共通レイアウトJSP 〜header/footerを使った再利用設計〜](https://qiita.com/juehara-crypto/items/96cee6c986e13bbacd8c)

- [📘 Vol.8.4：【Struts2】「s:action」「s:token」タグ徹底解説！〜アクション呼び出しと二重送信防止の最前線〜](https://qiita.com/juehara-crypto/items/6e54c3be0c35aa464724)

- [📘 Vol.8.5：【Struts2】条件分岐タグ（s:if / s:else）徹底解説！ 〜表示制御と実務応用の決定版〜](https://qiita.com/juehara-crypto/items/d9883eae6585aa62b93e)

- [📘 Vol.8.6：【Struts2】画面部品の共通化！ s:include / s:component 徹底解説 〜JSPヘッダー/フッターの再利用でメンテ効率UP〜](https://qiita.com/juehara-crypto/items/b36801f70830d2c056aa)

- [📘 Vol.8.7：【Struts2】バリデーションUIの味方！ `<s:fielderror>` / `<s:actionerror>` / `<s:actionmessage>` 徹底ガイド 〜エラーメッセージの表示とフォーム連携の基本〜](https://qiita.com/juehara-crypto/items/b5bacb915f8baea2f2ec)


---