今回は移行ではあるあるの状態になりそうな
Javaのクラスを利用しつつCeylonで書こうってことをやってみようと思います。
何を作ろうかなーと考えてたところ
JavaでHttpServerを手軽に起動する方法が
こちらの記事 に書かれているのを見つけたので
これを参考にJavaのHttpServerのクラスを利用してCeylon上で書いてみます。
#まず設定
プロジェクトを右クリックして
Properties > Ceylon Compiler
にある
Enable java classes
にチェックを付けます。
(これをチェックするとおそらくJavaScriptエンジンでは利用出来なくなります)
#今回使うライブラリをモジュール設定に足す
作成したモジュールで生成された
module.ceylonに
利用するパッケージの設定を追記します。
モジュールの作成などの基本的な方法は こちら
module com.hello.jserver "1.0.0" {
import ceylon.interop.java "1.0.0";
import java.base "7";
import oracle.jdk.httpserver "7";
}
今回はcom.sun.netなoracleから提供されているjavaライブラリを使うので
import oracle.jdk.httpserver "7"
が一番重要な追記ポイントです。
#コード
という訳で、早速コードをどーん!
import com.sun.net.httpserver {
HttpServer,
HttpExchange,
HttpHandler
}
import java.io {
OutputStream
}
import java.net {
InetSocketAddress
}
import java.util.concurrent {
Executors,
ExecutorService
}
void runServer(){
HttpServer httpServer = HttpServer.create(InetSocketAddress("localhost" ,8080),8080);
ExecutorService httpThreadPool = Executors.newFixedThreadPool(1);
httpServer.executor = httpThreadPool;
object httpHander satisfies HttpHandler {
shared actual void handle(HttpExchange exc) {
String response = "Hello HTTP Server" ;
exc.sendResponseHeaders(200, response.size);
OutputStream os = exc.responseBody;
for ( Character i in response.characters) {
os.write(i.integer);
}
os.close();
}
}
httpServer.createContext( "/" , httpHander);
httpServer.start();
}
元のJavaの記事のコード と見比べてもあまり変わらずさらっと読めるかなと思いますー。
少し違うのはoverrideのアノテーションが消えてactualがついていること。
意図的に変えた部分はテストじゃないのでサーバのシャットダウンはしないようにしてあります。
それとHttpHandlerのインスタンス生成とhttpServer.createContextで渡すときに
変数に1度代入してるとこくらいです。
それ以外の部分はクラスもそのまま使っていますし、
メソッドもそのままです。
Javaからやってもすぐ出来そうですよね!
という訳で実行してブラウザで
localhost:8080にアクセスすると
Hello HTTP Server
と表示されました!
今回は以上ー。
次回はJavaのライブラリではなくCeylonのライブラリを使って
HTTPサーバを書いてみようと思います。