2008年もあと1週間ほど。1年が早く感じます。
前回使ったHTTPFileHandlerが継承している、AbstractServletで簡単なサーブレットを作ってみようと思います。
※実行環境は1.8ですが、今後は参照するリファレンスはRuby1.9にしました(見やすいので。。)
まず、頭の中を整理。。
- 自作するサーブレットMyServletクラスはAbstractServletを継承。
- MyServletクラスには、HTTPメソッドに対応するメソッド(do_GET、do_POST...など)を定義
- HTTPServer#mount("/my_servlet", MyServlet)でディレクトリとサーブレットを対応させる。
- HTTPServerオブジェクトは"/my_servlet"にアクセスがあると、、
- MyServletオブジェクトを生成。
- AbstractServlet#service(req,res)を実行。
- POSTの場合:do_POSTを実行
- GETの場合: do_GETを実行
- do_***(req,res)メソッドには、reqにWEBrick::HTTPRequestオブジェクト、resにWEBrick::HTTPResponseオブジェクトが渡される。
さて、今回作成するサーブレットにはPOSTメソッドのみ実装します。
(実装されていないHTTPメソッドが送られてくると例外を発生するようです)
サーブレットに送られるHTTPリクエストのBodyには、JPEGファイルが1つだけ添付されます。
サーブレットは、リクエストBodyからJPEGデータを抽出し、HTTPレスポンスのBodyに付けて返します。
まとめると、「フォームからPOSTで画像ファイルを送ると、サーブレットがその画像を返す」という単純なものです。
index.html(フォームページ)
<html>
<body>
<form action="/my_servlet" method="post" enctype="multipart/form-data">
<input type="file" name="img1">
<input type="submit">
</form>
</body>
</html>
server.rb(サーバー用スクリプト)
1 #!/usr/local/bin/ruby
2
3 require 'webrick'
4 include WEBrick
5
6 class MyServlet < HTTPServlet::AbstractServlet
7
8 def do_POST(req, res)
9 p req.query["img1"]
10 res.content_type = "image/jpeg"
11 res.body = req.query["img1"]
12 end
13
14 end
15
16 server = HTTPServer.new(
17 :DocumentRoot => "/var2/www/html",
18 :Port => 20080,
19 :BindAddress => "192.168.207.128")
20
21 server.mount("/my_servlet", MyServlet)
22
23 trap("INT"){server.stop}
24
25 server.start
9行目:HTTPリクエストBodyから画像を抽出して標準出力してます。やる意味はありませんが試しにいれました。
10行目:HTTPレスポンスヘッダのContent-Typeを指定。
11行目:HTTPレスポンスのBodyに画像データを代入。
では、ブラウザから"/my_servlet"へJPEGファイルをPOSTしてみます。
画像が表示されました。
9行目の標準出力の結果です。
文字列に変換するとつぎのようになります。
10行目のContent-Typeを適切に指定しないと、ブラウザ側はJPEGとして認識してくれません。
このデータをFile.open("foo.jpg", "w"){|file| file.write(req.query["img1"])}とかでサーバーに保存できるようです。