REST風サービスをJavaEEで構築する方法11(DAO層編2)
前回はDao層の基本的な実装方法を紹介した。
今回はSQLを使用したDB操作の方法を紹介する。
<前提条件>
下記の記事を読了していること。
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)
・REST風サービスをJavaEEで構築する方法09(DB接続設定編)
・REST風サービスをJavaEEで構築する方法10(DAO層編1)
<全体像から見た位置づけ>
EntityクラスとDao層の追加編集を行う。
<手順概要>
1.Entityクラスに使用するSQLを記述する
2.DAO層クラスにSQLを使用してDB操作するメソッドを追加する
3.Logic層・Api層・index.htmlを編集する
<手順詳細>
1.Entityクラスに使用するSQLを記述する
REST風サービスをJavaEEで構築する方法10(DAO層編1)で作成した「SampleEntity」を追加編集し、使用するSQL文を記述する。
package lab.moonmt.SampleRest.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.NamedNativeQuery; import javax.persistence.Table; @Entity @Table(name="SAMPLE_TBL") @NamedNativeQuery( //...(1) name="findByName", //...(2) query="select id, name from SAMPLE_TBL where name=?param", //...(3) resultClass=SampleEntity.class) //...(4) public class SampleEntity implements Serializable { @Id private String id; private String name; public SampleEntity(){} public SampleEntity(String id, String name){ this.setId(id); this.setName(name); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
ソースコード解説
番号 | 説明 |
---|---|
(1) | @NamedNativeQueryアノテーションでSQLを記述することを宣言している。 |
(2) | name要素を使用して、SQLにつける名前を設定している(ここでは「findByName」と名付けている)。この名前により後述するDao層から呼び出す。 |
(3) | query要素を使用して、SQL文を設定している。「?param」は実行時に設定する変数である。 |
(4) | resultClass要素を使用して、SQLを使用して取得した結果を格納するクラスを設定している。 |
2.DAO層クラスにSQLを使用してDB操作するメソッドを追加する
REST風サービスをJavaEEで構築する方法10(DAO層編1)で作成した「SampleDao」を追加編集し、Entityクラスに記述したSQL文を読み込み実行するメソッドを追加する。
package lab.moonmt.SampleRest.dao; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.criteria.CriteriaQuery; import lab.moonmt.SampleRest.entity.SampleEntity; @Stateless public class SampleDao { @PersistenceContext private EntityManager entityManager; //挿入 public void create(SampleEntity sampleEntity){ entityManager.persist(sampleEntity); } //更新(上書き) public void update(SampleEntity sampleEntity){ entityManager.merge(sampleEntity); } //削除 public void delete(SampleEntity sampleEntity){ entityManager.remove(entityManager.merge(sampleEntity)); } //検索(IDによる検索) public SampleEntity find(String id){ return entityManager.find(SampleEntity.class, id); } //全件取得 public List<SampleEntity> getAll(){ CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery(); cq.select(cq.from(SampleEntity.class)); return entityManager.createQuery(cq).getResultList(); } //名前による検索 public List<SampleEntity> findByName(String name){ Query query = entityManager.createNamedQuery("findByName"); //...(1) query.setParameter("param", name); //...(2) return query.getResultList(); //...(3) } }
ソースコード解説
番号 | 説明 |
---|---|
(1) | エンティティマネージャの「createNamedQuery」メソッドを使用して、Entityクラスに記述したSQL文を読み込む。引数はEntityクラスでSQL文につけた名前を指定する。 |
(2) | SQL文中の変数に対して値を設定している。 |
(3) | SQL文を実行し、結果を呼び出し元に返却している。 |
3.Logic層・Api層・index.htmlを編集する
手順2で追加したメソッドが呼び出される様に、Logic層・Api層クラスおよびindex.htmlファイルを編集する。
詳細は割愛する(前回の手順3,4,5を参照)。
Enjoy Programing!!
<関連記事>
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)
・REST風サービスをJavaEEで構築する方法09(DB接続設定編)
・REST風サービスをJavaEEで構築する方法10(DAO層編1)
・REST風サービスをJavaEEで構築する方法11(DAO層編2)[本記事]
・REST風サービスをJavaEEで構築する方法12(DAO層編3)
・REST風サービスをJavaEEで構築する方法13(SQLログ編)
<お勧め書籍>
REST風サービスをJavaEEで構築する方法10(DAO層編1)
前回はDBに接続するための設定方法を紹介した。
今回は、その接続設定を使用して、実際にDBのデータを読み書きする方法を紹介する。
<前提条件>
下記の記事を読了していること。
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)
・REST風サービスをJavaEEで構築する方法09(DB接続設定編)
接続するDB(MySQL)に下記のテーブルが作成されていること。
テーブル名:SAMPLE_TBL
No. | カラム名 | 型 | 桁 | 制約 | |
---|---|---|---|---|---|
1 | ID | CHAR | 4 | NOT NULL PRIMARY KEY | |
2 | NAME | VARCHAR | 128 | - |
Entityクラス、Dao層の実装を行う。また、Logic層・Api層・RESTクライアントの追加編集を行う。
<手順概要>
1.Entityクラスを作成する
2.DAO層のクラスを作成する
3.Logic層クラスを編集する
4.Api層のクラスを編集する
5.index.htmlを編集する
<手順詳細>
1.Entityクラスを作成する
読み書きの対象となるテーブルのカラム構成に対応したEntityクラスを作成する。
プロジェクトツリー上で右クリックし、[新規]>[Javaクラス]を選択する。
表示されたダイアログにのクラス名に「SampleEntity」(※)、パッケージに「lab.moonmt.SampleRest.entity」(※)と設定し、【終了(F)】ボタンを押下する。
(※)任意の名前をつけることができる。
作成されたクラスを下記の様に編集する。
package lab.moonmt.SampleRest.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity //...(1) @Table(name="SAMPLE_TBL") //...(2) public class SampleEntity implements Serializable { @Id private String id; //...(3) private String name; //...(3) public SampleEntity(){} public SampleEntity(String id, String name){ this.setId(id); this.setName(name); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
ソースコード解説
番号 | 説明 |
---|---|
(1) | @Entityアノテーションを使用して、Entityクラスであることを宣言している。 |
(2) | @Tableアノテーションを使用して、このクラスに対応するテーブル名が「SAMPLE_TBL」であることを宣言している。クラス名とテーブル名を一致させれば、本設定は不要である。 |
(3) | テーブルのカラム名に対応したプロパティを定義している。 |
2.DAO層のクラスを作成する
プロジェクトツリー上で右クリックし、[新規]>[Javaクラス]を選択する。
表示されたダイアログのクラス名に「SampleDao」(※)、パッケージに「lab.moonmt.SampleRest.dao」(※)と設定し、【終了(F)】ボタンを押下する。
(※)任意の名前をつけることができる。
作成されたクラスを下記の様に編集する。
package lab.moonmt.SampleRest.dao; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.criteria.CriteriaQuery; import lab.moonmt.SampleRest.entity.SampleEntity; @Stateless public class SampleDao { @PersistenceContext private EntityManager entityManager; //...(1) //挿入 public void create(SampleEntity sampleEntity){ entityManager.persist(sampleEntity); //...(2) } //更新(上書き) public void update(SampleEntity sampleEntity){ entityManager.merge(sampleEntity); //...(3) } //削除 public void delete(SampleEntity sampleEntity){ entityManager.remove(entityManager.merge(sampleEntity)); //...(4) } //検索(IDによる検索) public SampleEntity find(String id){ return entityManager.find(SampleEntity.class, id); //...(5) } //全件取得 public List<SampleEntity> getAll(){ //(6) CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery(); cq.select(cq.from(SampleEntity.class)); return entityManager.createQuery(cq).getResultList(); } }
ソースコード解説
番号 | 説明 |
---|---|
(1) | @PersistenceContextアノテーションで「エンティティマネージャ」をインジェクト(DI)している。この「エンティティマネージャ」に前回設定した接続情報が適用されている。 |
(2) | EntityManagerクラスの「persist」メソッドを使用して、テーブルに対して挿入処理を行っている。 |
(3) | EntityManagerクラスの「merge」メソッドを使用して、テーブルに対して更新処理を行っている。 |
(4) | EntityManagerクラスの「merge」メソッドと「remove」メソッドを使用して、テーブルに対して削除処理を行っている。 |
(5) | EntityManagerクラスの「find」メソッドを使用して、テーブルに対して検索処理を行っている。 |
(6) | 全件取得する際の定型処理を行っている。 |
3.Logic層クラスを編集する
REST風サービスをJavaEEで構築する方法08(Logic層編)で作成した「SampleLogic」を編集して、手順2で作成したDAO層クラスのメソッドを呼び出す。
package lab.moonmt.SampleRest.logic; import java.util.List; import javax.ejb.EJB; import javax.ejb.Stateless; import lab.moonmt.SampleRest.dao.SampleDao; import lab.moonmt.SampleRest.entity.SampleEntity; @Stateless public class SampleLogic { @EJB private SampleDao sampleDao; //...(1) public void postMethod(String id, String name){ SampleEntity se = new SampleEntity(id, name); sampleDao.create(se); //...(2) } public void putMethod(String id, String name){ SampleEntity se = new SampleEntity(id, name); sampleDao.update(se); //...(2) } public void deleteMethod(String id){ SampleEntity se = new SampleEntity(id, null); sampleDao.delete(se); //...(2) } public SampleEntity getMethod(String id){ return sampleDao.find(id); //...(2) } public List<SampleEntity> getAllMethod(){ return sampleDao.getAll(); //...(2) } }
4.Api層のクラスを編集する
REST風サービスをJavaEEで構築する方法08(Logic層編)で編集した「SampleApi」クラスを追加編集し、Logic層クラスのメソッドを呼び出す。
package lab.moonmt.SampleRest.api; import java.util.List; import javax.ejb.EJB; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import lab.moonmt.SampleRest.entity.SampleEntity; import lab.moonmt.SampleRest.logic.SampleLogic; import net.arnx.jsonic.JSON; @Path("sampleApi") public class SampleApi { @EJB private SampleLogic sampleLogic; @GET @Path("getSample") public String getSampleMethod( @QueryParam("id") String id ){ SampleEntity se = sampleLogic.getMethod(id); return JSON.encode(se); } @GET @Path("getAllSample") public String getAllSampleMethod(){ List<SampleEntity> seList = sampleLogic.getAllMethod(); return JSON.encode(seList); } @POST @Path("postSample") public String postSampleMethod( @FormParam("id") String id, @FormParam("name") String name ){ sampleLogic.postMethod(id, name); return "success"; } @PUT @Path("putSample") public String putSampleMethod( @FormParam("id") String id, @FormParam("name") String name ){ sampleLogic.putMethod(id, name); return "success"; } @DELETE @Path("deleteSample/{id}") public String deleteSampleMethod( @PathParam("id") String id ){ sampleLogic.deleteMethod(id); return "success"; } }
5.index.htmlを編集する
REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)で編集した、index.htmlファイルを追加編集する。
<!DOCTYPE html> <html> <head> <title>TODO supply a title</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- jQueryライブラリの読み込み --> <script src='js/libs/jquery-1.11.2.min.js'></script> <!-- RESTクライアントの記述 --> <script> $(function(){ $('#btnGet').on('click', function(){ $.ajax({ type: "GET", url: "http://localhost:8080/SampleRest/webresources/sampleApi/getSample", data: {"id":"0001"}, success: function(data){ alert(data); } }); }); $('#btnGetAll').on('click', function(){ $.ajax({ type: "GET", url: "http://localhost:8080/SampleRest/webresources/sampleApi/getAllSample", success: function(data){ alert(data); } }); }); $('#btnPost').on('click', function(){ $.ajax({ type: "POST", url: "http://localhost:8080/SampleRest/webresources/sampleApi/postSample", data: {"id":"8003","name":"bbbbbbbb"}, success: function(data){ alert(data); } }); }); $('#btnPut').on('click', function(){ $.ajax({ type: "PUT", url: "http://localhost:8080/SampleRest/webresources/sampleApi/putSample", data: {"id":"8003","name":"cccccccc"}, success: function(data){ alert(data); } }); }); $('#btnDelete').on('click', function(){ $.ajax({ type: "DELETE", url: "http://localhost:8080/SampleRest/webresources/sampleApi/deleteSample/8003", success: function(data){ alert(data); } }); }); }); </script> </head> <body> <input type="button" value="GETメソッド" id="btnGet" /><br> <input type="button" value="GET(all)メソッド" id="btnGetAll" /><br> <input type="button" value="POSTメソッド" id="btnPost" /><br> <input type="button" value="PUTメソッド" id="btnPut" /><br> <input type="button" value="DELETEメソッド" id="btnDelete" /> </body> </html>
<動作確認>
プロジェクトを実行し、ブラウザに表示されたボタンを押下し、DB操作が行われたことを確認する。
Enjoy Programing!!
<関連記事>
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)
・REST風サービスをJavaEEで構築する方法09(DB接続設定編)
・REST風サービスをJavaEEで構築する方法10(DAO層編1)[本記事]
・REST風サービスをJavaEEで構築する方法11(DAO層編2)
・REST風サービスをJavaEEで構築する方法12(DAO層編3)
・REST風サービスをJavaEEで構築する方法13(SQLログ編)
<お勧め書籍>
REST風サービスをJavaEEで構築する方法09(DB接続設定編)
今回はJavaEEからDataBase(MySQL)に接続する方法を紹介する。
<前提条件>
下記の記事を読了していること。
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)
ローカル環境または接続可能なサーバに、MySQLがインストールされ、下表の様な設定が行われていること。
<全体像から見た位置づけ>プログラムからDBに接続するための設定を行う。
<手順概要>
1.MySQLのJDBCドライバをダウンロードする
2.MySQLのJDBCドライバをGlassFishのフォルダに配置する
3.GlassFishサーバの接続プールを設定する
4.GlassFishサーバのJDBCリソースを設定する
5.永続性ユニットを作成する
<手順詳細>
1.MySQLのJDBCドライバをダウンロードする
下記サイトからMySQLのJDBCドライバをダウンロードする
http://dev.mysql.com/downloads/connector/j/
Select Platformで「Platform Independent」を選択し、「Platform Independent (Architecture Independent), ZIP Archive」をダウンロードする。
【ダウンロード】ボタンを押下すると、ログインを促す画面に遷移するが、画面下方の「No thanks, just start my download.」を押下すれば、ログインする事無くダウンロードが可能である。
2.MySQLのJDBCドライバをGlassFishのフォルダに配置する
手順1でダウンロードしたzipファイルを解凍し、その中にある「mysql-connector-java-X.X.XX-bin.jar」(Xはバージョン番号)を下記のフォルダに配置する
<GlassFishのインストールフォルダ>/glassfish/domains/<対象ドメイン>/lib/ext
筆者の環境だと下記のフォルダになる。
/Applications/NetBeans/glassfish-4.1/glassfish/domains/domain1/lib/ext
3.GlassFishサーバの接続プールを設定する
プロジェクトツリーの右側にある「サービス」のタブを選択し、[サーバ]>[GlassFish Server]を右クリックし、「起動」を押下する(既に起動している場合は不要)。
[サーバ]>[GlassFish Server]を右クリックし、「ドメイン管理コンソールの表示」を押下する。
Webブラウザ上に「GlassFish Console」が表示されたことを確認する。
画面左の[JDBC]>[JDBC Connection Pools]を選択し、【New】ボタンを押下する。
入力項目に下表の値を設定し、【Next】ボタンを押下する。
Additional Propertiesの下記項目に値を設定し、【Finish】ボタンを押下する。
項目名 | 設定値 |
---|---|
User | sample_user |
Password | 123456789 |
DatabaseName | SAMPLE_DB |
Port | 3306 |
URL | jdbc:mysql://localhost:3306/SAMPLE_DB |
作成したConnection PoolのPool Nameのリンクを押下し、表示された画面の【Ping】ボタンを押下することで、接続テストを行う。
「Ping Succeeded」の文字列が表示されたことを確認する。
4.GlassFishサーバのJDBCリソースを設定する
引き続き、Webブラウザ上の「GlassFish Console」で作業を行う。
画面左の[JDBC]>[JDBC Resources]を選択し、【New】ボタンを押下する。
入力項目に下表の値を設定し、【OK】ボタンを押下する。
項目名 | 設定値 | 備考 |
---|---|---|
JNDI Name | jdbc/sample_db | - |
Pool Name | sample_db_pool | 手順3で作成したConnection Pool |
JDBC Resourceが作成されたことを確認する。
5.永続性ユニットを作成する
ここからはNetBeans上で作業する。
プロジェクトツリー上のプロジェクト名を右クリックし、[新規]>[その他]を選択する。
表示されたダイアログで、カテゴリ「持続性」、ファイル・タイプ「持続性ユニット」を選択し、【次>】ボタンを押下する。
入力項目に下表の値を設定し、【終了(F)】ボタンを押下する。
項目名 | 設定値 | 備考 |
---|---|---|
持続性ユニット名 | SampleRestPU | 任意の名称 |
永続性プロバイダ | EclipseLink | - |
データ・ソース | jdbc/sample_db | 手順4で作成したJDBCリソース |
プロジェクトツリー上に「persistence.xml」が作成されたことを確認する。
以上でDBに接続するための前準備が終了となる。
次回は実際にプログラム上からDBのデータを読み書きする方法を紹介する。
Enjoy Programing!!
<関連記事>
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)
・REST風サービスをJavaEEで構築する方法09(DB接続設定編)[本記事]
・REST風サービスをJavaEEで構築する方法10(DAO層編1)
・REST風サービスをJavaEEで構築する方法11(DAO層編2)
・REST風サービスをJavaEEで構築する方法12(DAO層編3)
・REST風サービスをJavaEEで構築する方法13(SQLログ編)
<お勧め書籍>
REST風サービスをJavaEEで構築する方法08(Logic層編)
今回はLogic層の実装方法を紹介する。
前回までサーバ側の処理はApi層のクラスある「SampleApi」に記述してきた。
しかし、Api層はRESTクライアントからの処理要求を受け付ける役割を行うクラスであり、詳細な処理を記述するべきではない。
詳細な処理はLogic層に記述することになる。
<前提条件>
下記の記事を読了していること。
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
<全体像から見た位置づけ>
Logic層の実装を行う。また、Api層にLogic層の処理を呼び出す追加編集を行う。
<手順概要>
1.Logic層のクラスを作成する
2.Logic層のクラスを編集する
3.Api層からLogic層のメソッドを呼び出す
<手順詳細>
1.Logic層のクラスを作成する
プロジェクトツリー上の「ソース・パッケージ」を右クリックし、[新規]>[Javaクラス]を選択する。
表示されたダイアログのクラス名に「SampleLogic」(※)・パッケージ名に「lab.moonmt.SampleRest.logic」(※)を設定し、【終了(F)】ボタンを押下する。
(※)任意の名前をつけることができる。
2.Logic層のクラスを編集する
Logic層はEJB(Enterprise JavaBean)として実装する事になる。
EJBのセッションビーンには、「ステートレス」「ステートフル」「シングルトン」の3種類が存在し、どの種類を実装しているかをクラス名の上部に、アノテーションとして指定する必要がある。
種類 | アノテーション | 説明 |
---|---|---|
ステートレス | @Stateless | 内部の変数は毎回初期化される。1回の呼び出しで完結する処理に使用する。 |
ステートフル | @Stateful | 内部の変数は保持される。複数回の呼び出しで継続的な処理を行う時に使用する。 |
シングルトン | @Singleton | 1つのアプリケーションでオブジェクトを1つしか存在させたく無い時に使用する。 |
package lab.moonmt.SampleRest.logic; import javax.ejb.Stateless; @Stateless //...(1) public class SampleLogic { public String sampleMethod(String name){ return name + "_add_string"; } }3.Api層からLogic層のメソッドを呼び出す
REST風サービスをJavaEEで構築する方法07(JSON返却編2)で編集した「SampleApi」クラスを追加編集する。
package lab.moonmt.SampleRest.api; import javax.ejb.EJB; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import lab.moonmt.SampleRest.dto.SampleDto; import lab.moonmt.SampleRest.logic.SampleLogic; import net.arnx.jsonic.JSON; @Path("sampleApi") public class SampleApi { @EJB private SampleLogic sampleLogic; //...(1) @GET @Path("getSample") public String getSampleMethod( @QueryParam("id") String id, @QueryParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); SampleDto dto = new SampleDto(); dto.status = "success"; dto.id = id; dto.name = sampleLogic.sampleMethod(name); //...(2) return JSON.encode(dto); } @POST @Path("postSample") public String postSampleMethod( @FormParam("id") String id, @FormParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); SampleDto dto = new SampleDto(); dto.status = "success"; dto.id = id; dto.name = sampleLogic.sampleMethod(name); //...(2) return JSON.encode(dto); } @PUT @Path("putSample") public String putSampleMethod( @FormParam("id") String id, @FormParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); SampleDto dto = new SampleDto(); dto.status = "success"; dto.id = id; dto.name = sampleLogic.sampleMethod(name); //...(2) return JSON.encode(dto); } @DELETE @Path("deleteSample/{id}") public String deleteSampleMethod( @PathParam("id") String id ){ System.out.println("id:" + id); SampleDto dto = new SampleDto(); dto.status = "success"; dto.id = id; return JSON.encode(dto); } }
ソースコード解説
番号 | 説明 |
---|---|
(1) | ロジック層のクラスを「@EJB」を付与して宣言しておくと、フレームワークがインスタンスをインジェクションしてくれる。(newする必要がなくなる) |
(2) | (1)で宣言した変数を使用して、ロジック層クラスのメソッドを呼び出している。 |
プロジェクトを実行し、ブラウザに表示されたボタンを押下すると、ロジック層クラスのメソッドで固定文字列が付加されたJSON形式のデータがダイアログに表示されることを確認する。
Enjoy Programing!!
<関連記事>
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)[本記事]
・REST風サービスをJavaEEで構築する方法09(DB接続設定編)
・REST風サービスをJavaEEで構築する方法10(DAO層編1)
・REST風サービスをJavaEEで構築する方法11(DAO層編2)
・REST風サービスをJavaEEで構築する方法12(DAO層編3)
・REST風サービスをJavaEEで構築する方法13(SQLログ編)
<お勧め書籍>
REST風サービスをJavaEEで構築する方法07(JSON返却編2)
今回は前回に引き続き、REST風サービスからRESTクライアントへJSON形式を返却する方法を紹介する。
前回はJSON形式のデータを生成する前準備としてMapを利用したが、今回はより実践的なDTO(Data Transfer Object)を利用する方法を紹介する。
<前提条件>
下記の記事を読了していること。
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
<全体像から見た位置づけ>
DTOクラスを作成する。また、Api層の追加編集を行う。
<手順概要>
1.DTOクラスを作成する
2.Api層の追加編集を行う
<手順詳細>
1.DTOクラスを作成する
プロジェクトツリー上の「ソース・パッケージ」を右クリックし、[新規]>[Javaクラス]を選択する。
表示されたダイアログのクラス名に「SampleDto」(※)・パッケージ名に「lab.moonmt.SampleRest.dto」(※)を設定し、【終了(F)】ボタンを押下する。
(※)任意の名前をつけることができる。
作成されたクラスファイルを編集する。
JSON形式のデータとして返却したい、データ名に対応した変数名を定義する。変数の型は返却したいデータの型に対応させる。
package lab.moonmt.SampleRest.dto; public class SampleDto { public String status; public String id; public String name; }
2.Api層の追加編集を行う
REST風サービスをJavaEEで構築する方法06(JSON返却編1)で編集した「SampleApi」クラスを追加編集する。
package lab.moonmt.SampleRest.api; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import lab.moonmt.SampleRest.dto.SampleDto; import net.arnx.jsonic.JSON; @Path("sampleApi") public class SampleApi { @GET @Path("getSample") public String getSampleMethod( @QueryParam("id") String id, @QueryParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); SampleDto dto = new SampleDto(); //...(1) dto.status = "success"; dto.id = id; dto.name = name; return JSON.encode(dto); //...(2) } @POST @Path("postSample") public String postSampleMethod( @FormParam("id") String id, @FormParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); SampleDto dto = new SampleDto(); //...(1) dto.status = "success"; dto.id = id; dto.name = name; return JSON.encode(dto); //...(2) } @PUT @Path("putSample") public String putSampleMethod( @FormParam("id") String id, @FormParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); SampleDto dto = new SampleDto(); //...(1) dto.status = "success"; dto.id = id; dto.name = name; return JSON.encode(dto); //...(2) } @DELETE @Path("deleteSample/{id}") public String deleteSampleMethod( @PathParam("id") String id ){ System.out.println("id:" + id); SampleDto dto = new SampleDto(); //...(1) dto.status = "success"; dto.id = id; return JSON.encode(dto); //...(2) } }
ソースコード解説
番号 | 説明 |
---|---|
(1) | DTOクラスをインスタンス化し、DTOの要素に返却したい値を格納する。 |
(2) | JSONICライブラリの「JSON」クラスの「encode」メソッドを使用して、DTOをJSON形式に変換し返却する。 |
<動作確認>
プロジェクトを実行し、ブラウザに表示されたボタンを押下すると、JSON形式のデータがダイアログに表示されることを確認する。
※【POSTメソッド】ボタンを押下した場合の表示例
<捕捉説明>
今回作成したDTOクラスは単純なものであったが、入れ子構造やリスト構造を持ったDTOであっても、JSONICライブラリを使用すればJSON形式に変換することが可能である。
Enjoy Programing!!
<関連記事>
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)[本記事]
・REST風サービスをJavaEEで構築する方法08(Logic層編)
・REST風サービスをJavaEEで構築する方法09(DB接続設定編)
・REST風サービスをJavaEEで構築する方法10(DAO層編1)
・REST風サービスをJavaEEで構築する方法11(DAO層編2)
・REST風サービスをJavaEEで構築する方法12(DAO層編3)
・REST風サービスをJavaEEで構築する方法13(SQLログ編)
<お勧め書籍>
REST風サービスをJavaEEで構築する方法06(JSON返却編1)
今回はREST風サービスからRESTクライアントへ、JSON形式のデータを返却する方法を紹介する。
前回まで作成したREST風サービスは、処理結果として単純な文字列を返却するものであった。
REST風サービスの場合、処理結果をJSON形式で返却することが多いので、今回はその方法を紹介する。
<前提条件>
下記の記事を読了していること。
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
<全体像から見た位置づけ>
Api層の追加編集を行う。
<手順概要>
1.JSONICライブラリをダウンロードする
2.JSONICライブラリをプロジェクトに追加する
3.Api層の追加実装を行う
<手順詳細>
1.JSONICライブラリをダウンロードする
下記サイトから、JSONICライブラリをダウンロードする。
http://jsonic.sourceforge.jp/index.html
ダウンロードしたzipファイルには、複数のファイルが含まれているが、使用するのは「jsonic-x.y.z.jar」(x,y,zはバージョン番号)である。
2.JSONICライブラリをプロジェクトに追加する
プロジェクトフォルダをFinderで開き、右クリックし表示されたメニューで「新規フォルダ」を選択する。
「libs」という名前のフォルダを作成し、その配下に手順1でダウンロードした、JSONICライブラリのjarファイルを格納する。
NetBeansに戻り、プロジェクトツリー上の「ライブラリ」を右クリックし、[JAR/フォルダの追加]を選択する。
表示されたダイアログ上で、上記手順で「libs」フォルダに格納した、JSONICライブラリのjarファイルを選択し、【Choose】ボタンを押下する。
プロジェクトツリー上のライブラリ配下に、JSONICライブラリが追加された事を確認する。
3.Api層の追加実装を行う
REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)で編集した「SampleApi」クラスを追加編集する。
package lab.moonmt.SampleRest.api; import java.util.HashMap; import java.util.Map; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import net.arnx.jsonic.JSON; @Path("sampleApi") public class SampleApi { @GET @Path("getSample") public String getSampleMethod( @QueryParam("id") String id, @QueryParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); Map<String,String> map = new HashMap<>(); //...(1) map.put("status", "success"); map.put("id", id); map.put("name", name); return JSON.encode(map); //...(2) } @POST @Path("postSample") public String postSampleMethod( @FormParam("id") String id, @FormParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); Map<String,String> map = new HashMap<>(); //...(1) map.put("status", "success"); map.put("id", id); map.put("name", name); return JSON.encode(map); //...(2) } @PUT @Path("putSample") public String putSampleMethod( @FormParam("id") String id, @FormParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); Map<String,String> map = new HashMap<>(); //...(1) map.put("status", "success"); map.put("id", id); map.put("name", name); return JSON.encode(map); //...(2) } @DELETE @Path("deleteSample/{id}") public String deleteSampleMethod( @PathParam("id") String id ){ System.out.println("id:" + id); Map<String,String> map = new HashMap<>(); //...(1) map.put("status", "success"); map.put("id", id); return JSON.encode(map); //...(2) } }
ソースコード解説
番号 | 説明 |
---|---|
(1) | JSON形式のデータとして返却したい内容を、Mapに格納する。 |
(2) | JSONICライブラリの「JSON」クラスの「encode」メソッドを使用して、MapデータをJSON形式に変換し返却する。 |
<動作確認>
プロジェクトを実行し、ブラウザに表示されたボタンを押下すると、JSON形式のデータがダイアログに表示されることを確認する。
※【GETメソッド】ボタンを押下した場合の表示例
Enjoy Programing!!
<関連記事>
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)[本記事]
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)
・REST風サービスをJavaEEで構築する方法09(DB接続設定編)
・REST風サービスをJavaEEで構築する方法10(DAO層編1)
・REST風サービスをJavaEEで構築する方法11(DAO層編2)
・REST風サービスをJavaEEで構築する方法12(DAO層編3)
・REST風サービスをJavaEEで構築する方法13(SQLログ編)
<お勧め書籍>
REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)
今回はRESTクライアントからREST風サービスへパラメータを送信する方法を紹介する。
具体的には「@QueryParam」「@FormParam」「@PathParam」を使用し、受け取るパラメータを定義する。
<前提条件>
下記の記事を読了していること。
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
<全体像から見た位置づけ>
主にApi層の追加編集を行う。機能確認のためにRESTクライアントの追加編集も行う。
<手順概要>
1.Api層の追加実装を行う
2.index.htmlファイルの追加実装を行う
<手順詳細>
1.Api層の追加実装を行う
REST風サービスをJavaEEで構築する方法04(各メソッド編)で編集した「SampleApi」クラスを追加編集し、「@QueryParam」「@FormParam」「@PathParam」を使用して、受け取るパラメータを定義する。
package lab.moonmt.SampleRest.api; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; @Path("sampleApi") public class SampleApi { @GET @Path("getSample") public String getSampleMethod( @QueryParam("id") String id, //...(1) @QueryParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); return "Hello REST world(GET)" + id + name; } @POST @Path("postSample") public String postSampleMethod( @FormParam("id") String id, //...(2) @FormParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); return "Hello REST world(POST)" + id + name; } @PUT @Path("putSample") public String putSampleMethod( @FormParam("id") String id, //...(3) @FormParam("name") String name ){ System.out.println("id:" + id + ", name:" + name); return "Hello REST world(PUT)" + id + name; } @DELETE @Path("deleteSample/{id}") //...(4) public String deleteSampleMethod( @PathParam("id") String id //...(5) ){ System.out.println("id:" + id); return "Hello REST world(DELETE)" + id; } }
ソースコード解説
番号 | 説明 |
---|---|
(1) | GETメソッドでパラメータを受け取る場合は「@QueryParam」を使用して定義する。 |
(2) | POSTメソッドでパラメータを受け取る場合は「@FormParam」を使用して定義する。 |
(3) | PUTメソッドでパラメータを受け取る場合は「@FormParam」を使用して定義する。 |
(4) | DELETメソッドでパラメータを受け取る場合は、前準備として「@Path」に{}でパラメータ名を定義する。 |
(5) | DELETメソッドでパラメータを受け取る場合は、「@Path」で定義したパラメータ名を「@PathParam」を使用して定義する。 |
2.index.htmlファイルの追加実装を行う
REST風サービスをJavaEEで構築する方法04(各メソッド編)で編集した、index.htmlファイルを追加編集する。
<!DOCTYPE html> <html> <head> <title>TODO supply a title</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- jQueryライブラリの読み込み --> <script src='js/libs/jquery-1.11.2.min.js'></script> <!-- RESTクライアントの記述 --> <script> $(function(){ $('#btnGet').on('click', function(){ $.ajax({ type: "GET", url: "http://localhost:8080/SampleRest/webresources/sampleApi/getSample", data: {"id":"0001","name":"GET_param"}, //...(1) success: function(data){ alert(data); } }); }); $('#btnPost').on('click', function(){ $.ajax({ type: "POST", url: "http://localhost:8080/SampleRest/webresources/sampleApi/postSample", data: {"id":"0002","name":"POST_param"}, //...(2) success: function(data){ alert(data); } }); }); $('#btnPut').on('click', function(){ $.ajax({ type: "PUT", url: "http://localhost:8080/SampleRest/webresources/sampleApi/putSample", data: {"id":"0003","name":"PUT_param"}, //...(3) success: function(data){ alert(data); } }); }); $('#btnDelete').on('click', function(){ $.ajax({ type: "DELETE", url: "http://localhost:8080/SampleRest/webresources/sampleApi/deleteSample/0004", //...(4) success: function(data){ alert(data); } }); }); }); </script> </head> <body> <input type="button" value="GETメソッド" id="btnGet" /><br> <input type="button" value="POSTメソッド" id="btnPost" /><br> <input type="button" value="PUTメソッド" id="btnPut" /><br> <input type="button" value="DELETEメソッド" id="btnDelete" /> </body> </html>
ソースコード解説
番号 | 説明 |
---|---|
(1) | 送信するパラメータを「名前」「値」の組み合わせで指定している |
(2) | 送信するパラメータを「名前」「値」の組み合わせで指定している |
(3) | 送信するパラメータを「名前」「値」の組み合わせで指定している |
(4) | 送信するパラメータをURLの末尾に指定している |
<動作確認>
プロジェクトを実行し、ブラウザに表示されたボタンを押下すると、送信したパラメータ値を含むメッセージがダイアログに表示される事を確認する。
※【POSTメソッド】ボタンを押下した場合の表示例
Enjoy Programing!!
<関連記事>
・REST風サービスをJavaEEで構築する方法01(導入編)
・REST風サービスをJavaEEで構築する方法02(雛形プロジェクト編)
・REST風サービスをJavaEEで構築する方法03(RESTクライアント編)
・REST風サービスをJavaEEで構築する方法04(各メソッド編)
・REST風サービスをJavaEEで構築する方法05(パラメータの受け取り編)[本記事]
・REST風サービスをJavaEEで構築する方法06(JSON返却編1)
・REST風サービスをJavaEEで構築する方法07(JSON返却編2)
・REST風サービスをJavaEEで構築する方法08(Logic層編)
・REST風サービスをJavaEEで構築する方法09(DB接続設定編)
・REST風サービスをJavaEEで構築する方法10(DAO層編1)
・REST風サービスをJavaEEで構築する方法11(DAO層編2)
・REST風サービスをJavaEEで構築する方法12(DAO層編3)
・REST風サービスをJavaEEで構築する方法13(SQLログ編)
<お勧め書籍>