前提知識として、JAX-RS をさらっと認識しておくと良い。
何故 REST なのか、REST の何がうれしいかを見ておく。
JAX-RS 1 について : http://www.coppermine.jp/docs/programming/2012/12/jaxrs1.html
JAX-RS 2 について : http://www.coppermine.jp/docs/programming/2012/12/jaxrs2.html
JAX-RS 2 を見るにあたっては、CDI も見ておくと良い。
CDI :: https://blogs.oracle.com/nishigaya/entry/javaee6_understanding_cdi_part_1
1 と 2 どちらを用いるかは、作成するアプリケーションの API の複雑性・多様性によって決めると良い。
テキストのみを扱うシンプルな API に JAX-RS 2 の仕様を実装するのもどうかと思う。
Jersey1
ここでは、JAX-RS 1 の実装である、Jersey 1系 を使って、Servlet 環境を作成する。
Jersey 1系の最新 1.18 を以下からダウンロードできる。
https://jersey.java.net/download.html
ダウンロードしたファイルを解凍して、以下を Tomcat プロジェクトのライブラリとして登録する。
- asm-3.1.jar
- jersey-client-1.18.jar
- jersey-core-1.18.jar
- jersey-json-1.18.jar
- jersey-server-1.18.jar
- jersey-servlet-1.19.jar
- jsr311-api-1.1.1.jar
次に、web.xml を準備する。WEB-INF/web.xml を以下の様に作成する。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<web-app xmlns="http://java.sun.com/xml/ns/javaee" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" | |
version="3.0" | |
metadata-complete="true"> | |
<servlet> | |
<servlet-name>SC Recognize Your Issue Service</servlet-name> | |
<servlet-class> | |
com.sun.jersey.spi.container.servlet.ServletContainer | |
</servlet-class> | |
<init-param> | |
<param-name>com.sun.jersey.config.property.packages</param-name> | |
<param-value>jp.masazdream.scryi.server.api</param-value> | |
</init-param> | |
<load-on-startup>1</load-on-startup> | |
</servlet> | |
<servlet-mapping> | |
<servlet-name>SC Recognize Your Issue Service</servlet-name> | |
<url-pattern>/api/*</url-pattern> | |
</servlet-mapping> | |
</web-app> |
servlet タグには、servlet-name と対応する servlet-class を記載する。
これは、jerseyのクラスを設定する。init-paramには、jerseyを使うパッケージを設定する。
ここでは「jp.masazdream.scryi.server.api」である。
load-on-startup で、アプリケーションがコンテナにロードされるときに、初期化するよう設定する。
servlet-mapping では、servlet-name が一致した servlet にアクセスする url-patternを設定する。
ここでは、<アプリケーションコンテキスト名>/api/~ でアクセスする。
~ は、Jerseyによってアノテーションで記述する。
次に、jp.masazdream.scryi.server.api パッケージにクラスを記述する。
アノテーション「@Path」に続けて書いたのが、~部分である。
また、Doma を使った DAO 部分の記述をテストとして記述しているが、適当な文字列を返すほうがはじめの一歩の検証に良いだろう。
アプリケーションコンテキスト名は、Eclipse で作成したプロジェクトの場合、通常プロジェクト名がデフォルトで設定されるが、以下の手順で変更が可能である。
[プロジェクトプロパティ]-[Tomcat]-[全般タブ]-コンテキスト名
である。例えば、「test」と設定したとする。
Tomcatプロジェクト全般の設定については、以下が参考になる。
http://seesaawiki.jp/salyu/d/Eclipse%A4%CB%A4%AA%A4%B1%A4%EBTomcat%A4%CE%C0%DF%C4%EA
以上で、以下のURLからAPIをたたくことが可能である。
ここでは「jp.masazdream.scryi.server.api」である。
load-on-startup で、アプリケーションがコンテナにロードされるときに、初期化するよう設定する。
servlet-mapping では、servlet-name が一致した servlet にアクセスする url-patternを設定する。
ここでは、<アプリケーションコンテキスト名>/api/~ でアクセスする。
~ は、Jerseyによってアノテーションで記述する。
次に、jp.masazdream.scryi.server.api パッケージにクラスを記述する。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Path("/communication") | |
public class HelloSCRYServer { | |
@GET | |
@Produces(MediaType.TEXT_PLAIN) | |
public String sayHello() { | |
String result = null; | |
LocalTransaction tx = AppConfig.getLocalTransaction(); | |
try { | |
tx.begin(); | |
MCategoryDao dao = new MCategoryDaoImpl(); | |
MCategory mcategory = dao.selectById(1); | |
result = mcategory.getCategoryCode(); | |
tx.commit(); | |
} finally { | |
// トランザクション | |
tx.rollback(); | |
} | |
return result; | |
} | |
} |
アノテーション「@Path」に続けて書いたのが、~部分である。
また、Doma を使った DAO 部分の記述をテストとして記述しているが、適当な文字列を返すほうがはじめの一歩の検証に良いだろう。
アプリケーションコンテキスト名は、Eclipse で作成したプロジェクトの場合、通常プロジェクト名がデフォルトで設定されるが、以下の手順で変更が可能である。
[プロジェクトプロパティ]-[Tomcat]-[全般タブ]-コンテキスト名
である。例えば、「test」と設定したとする。
Tomcatプロジェクト全般の設定については、以下が参考になる。
http://seesaawiki.jp/salyu/d/Eclipse%A4%CB%A4%AA%A4%B1%A4%EBTomcat%A4%CE%C0%DF%C4%EA
以上で、以下のURLからAPIをたたくことが可能である。
http://localhost:8080/test/api/communication