JDK付属のHTTPサーバはそのままでは非常に貧弱である。クライアントから送信されるデータをInputStreamで受け取り、出力はOutputStreamで書き出すだけ。
出力はかまわないが、入力は何とかならないのか。リクエストパラメータが簡単に取得できないのはきつすぎる。
かといってサーブレットコンテナだとTomcatでも大量のjarファイル等がありヘビーすぎる。もっと簡単にHTTPをさばけないのか。
ある。簡単で超強力なのが。
まずはこちらからファイルをダウンロード。
- http://download.java.net/maven/2/com/sun/jersey/jersey-bundle/1.3/jersey-bundle-1.3.jar
- http://download.java.net/maven/2/javax/ws/rs/jsr311-api/1.1/jsr311-api-1.1.jar
- http://repo1.maven.org/maven2/asm/asm/3.1/asm-3.1.jar
これらをクラスパスに加える。
Mainクラスは以下のとおり。
import com.sun.jersey.api.container.httpserver.HttpServerFactory; import com.sun.net.httpserver.HttpServer; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { HttpServer server = HttpServerFactory.create("http://localhost:8080/"); server.start(); } }
すごいシンプルになった。これでサーバーが立ち上がる。ファクトリのメソッドの戻り値が前回利用したHttpServer。stratメソッドで起動、stopメソッドで停止する。
でもレスポンスを返すコードはここにはないぞ?
別のクラスを用意する(別に同じクラスに書いても良いけど)。
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; @Path("/query") public class QueryParamTest { @GET @Produces("text/plain") public String response(@QueryParam("a") int a,@QueryParam("b")int b){ return String.format("%d + %d = %d",a,b,a+b); } }
実行!
http://localhost:8080/query?a=1&b=2
とブラウザのURLにいれると
1 + 2 = 3
と表示される。アノテーションの意味はすぐにわかるでしょう。
ほかにも
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Path("/path") public class PathParamTest { @GET @Produces("text/plain") @Path("/{a}/{b}") public String response(@PathParam("a")int a,@PathParam("b")int b){ return String.format("%d + %d = %d",a,b,a+b); } }
とかくとパスからパラメータがわたされる。
http://localhost:8080/path/3/4
これで以下のような結果が表示される。
3 + 4 = 7
2つのクラスの2つのパラメータはint型にしているので、int型に変換できない場合このメソッド自体呼ばれない。コレが便利。よくあるSpringMVCのようなフレームワークだとバリデーションやコンバージョンで失敗をしてその結果が別のエラー用の引数に返ってくることがほとんど。手間である。Ajaxやサービス用ならばこのメソッド自体が呼ばれない仕組みのほうが便利だと感じるはず。
別クラスを何もせずに使えるということは、何も設定せずにクラスパスを検索して自動で登録されるということ。便利。
…って、これフルのJAX-RSなんですけどね。つまりこのmainのコードを取り除くとJavaEEなコンテナ上でそのまま動く。Servlet書いてライブラリを用意すればTomcat上でも動く。依存ファイルも上記のようにあんまりない。便利ですよ。
Springとの連携もある。