Struts2でのDTO(JavaBeans)の正しい扱い方・設計思想を解説!
命名規則、フィールド設計、そしてJSPからDTOへアクセスできる“仕組み”まで、実務で役立つ知識を整理します。
✅ DTOとは? ― ViewとActionをつなぐ“輸送係”
DTO(Data Transfer Object)は、画面とサーバー側(Actionクラス)とのデータのやり取りを行うための中継役です。
Struts2におけるDTOの主な役割は:
-
📥 JSPから入力された値をActionクラスに渡す
-
📤 Actionクラスで加工・取得したデータをJSPで表示する
つまり、「データの入れ物」としての純粋なJavaBeansであり、ビジネスロジックは持ちません。
✅ JavaBeansとしての設計ルール(命名規則)
DTOは、JavaBeans仕様に従って設計される必要があります。
そのため、次のルールに従うのがベストプラクティスです。
要素 | 命名例 | 補足 |
---|---|---|
DTO名 |
User , Post , Thread
|
エンティティ名と同一/単数形 |
フィールド |
username , email
|
camelCase が推奨 |
getter/setter |
getUsername() , setUsername(String username)
|
必須(JavaBeans仕様) |
✅ Actionクラスとの連携(Struts2との接続点)
Struts2では、DTOをActionクラスのプロパティとして保持し、getter/setterを定義することで、自動的にJSPとのデータ連携が成立します。
public class UserEditAction extends ActionSupport {
private User user;
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
public String execute() {
// 初期化、DB取得など
return SUCCESS;
}
}
この構造があることで、Struts2はOGNL(Object-Graph Navigation Language) を使って、JSPからこのDTOにアクセスできます。
※ OGNL(Object-Graph Navigation Language) とは、Struts2で使用される式言語で、
DTOなどのJavaBeansのプロパティにアクセスするための表現方法です。
✅ 📘 【重要】JSPからDTOにアクセスできる仕組みの正体!
たとえば、以下のようなJSPのコードを見たことがあるでしょう。
<s:textfield name="user.username" />
この意味は、次のように読み解けます:
-
1.user → Actionクラスにある getUser() を呼び出して DTO を取得
-
2.username → DTOの getUsername() / setUsername() にアクセス
✅ Struts2は、JSPのname="user.username"を 「Actionクラスにある User user の username プロパティにアクセスする」と解釈します。
つまり、ActionクラスにDTOをプロパティとして持ち、そのgetter/setterがあれば、Struts2は自動でバインドしてくれるのです!
✅ DTO設計の注意点とベストプラクティス
ポイント | 内容 |
---|---|
DTOにはロジックを入れない | DTOは「データの器」専用。計算や処理はActionやServiceで行う。 |
フィールドは原則private | 外部から直接アクセスさせず、getter/setterを通じて扱う。 |
フィールド名はcamelCase |
userId , postContent などが一般的。 |
再利用を意識 | ユーザ一覧、詳細、編集など共通化できるDTOは統一する。 |
✅ 次回予告
次回の Vol.10.2「DAOのインタフェース設計と実装パターン」 では、DTOと密接に連携するDAO層の設計について、以下を解説します。
-
DAOインタフェースと実装の分離(
UserDao
/UserDaoImpl
) -
DAOの責務と粒度
-
DAO→DTOへのデータマッピングのベストプラクティス
✅ まとめ
項目 | 内容 |
---|---|
DTOとは? | データ輸送専用のJavaBeans(getter/setter付き) |
Struts2との連携 | Actionのプロパティ+getter/setterで成立 |
JSPからのアクセス | OGNLにより user.username → getUser().getUsername() に変換される |
設計方針 | 単機能・命名ルール遵守・ロジック非搭載が基本 |
📝 補足:DTOはStruts2の独自機能ではありません
DTO(Data Transfer Object)という用語は、Struts2固有の機能と思われがちですが、実際にはJavaの標準機能ではなく、「設計パターン」のひとつです。
✅ 正確な位置づけ
用語 | 説明 |
---|---|
JavaBeans | getter/setterとデフォルトコンストラクタを持つJavaの標準的なクラス仕様。Struts2に限らず広く使われます。 |
DTO | JavaBeansを「データ輸送用オブジェクト」として利用するアーキテクチャ的な設計パターン。Struts2でも使われていますが、特定のフレームワーク専用ではありません。 |
Struts2のOGNL機能 | DTOのプロパティを user.username のような式で参照・操作できるStruts2のバインディング機構。DTOの構造を理解していれば自然に使えます。 |
✅ 実務的な意味
つまり、Struts2はJavaBeansに準拠したDTOを介して、JSPとActionクラス間のデータをバインドしているという仕組みです。
// Actionクラス
public class UserEditAction extends ActionSupport {
private User user; // ← DTO(JavaBeans)
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
public String execute() {
// DAOなどからuserを取得してJSPに渡す
return SUCCESS;
}
}
🎯 実装・設計に役立つ理解ポイント
✅ この補足を理解すると...
- DTOの位置づけがはっきりする
- Struts2がJavaBeansのgetter/setterをどう扱うかが分かる
「DTOとは何か」だけでなく、「なぜJSPからプロパティにアクセスできるのか?」という疑問も、これでスッキリ解消できたかと思います!
📘 この記事は、「Struts2 実務設計シリーズ Vol.10:DTO/DAO/JavaBeans編」の一部です。
Vol.10.2 ではさらに DAO 実装の詳細に踏み込んでいきます。どうぞお楽しみに!