jruby で firefox を起動させ、webrickで作成したローカルページを開く

さて、jruby から出来るだけ簡単に デスクトップGUIアプリケーションめいたものを作るには、どうしたものかという話の続きです。

(swing(開発停止中) にしろ SWT にしろシンドイし、swing後継の javafx2.0 はまだよく分からない状態だし、そもそも ruby の世界の話じゃなくて java の世界の話に迷い込むようなものだし)

まあ、とにかく前回の続き。

前回、jruby から java api でデフォルト・ブラウザを起動させ 指定の webpage を開くことは出来たものの、どうもwebrick で作成したローカルページはエラーで開けない。なんでなのかな。

しょうがないので、firefox 決め打ちで起動させ、指定のwebrick で作成したローカルページを開いてみるスクリプト
(途中で system("firefox", "http://localhost:10080/index") と、システムコマンドを使っているので、Linux オンリーですねぇ。クロスプラットフォームにするには、os ごと場合分けのコードにしないと)

うーん。いまいち納得いかないが、しょうがないのかな…


動作環境
jruby1.6.0 
ubuntu10.04


require "webrick"
require "webrick/httputils"
include WEBrick

class MakeHTML

private_class_method :new

def initialize(req_query)

req_query.each{|key, value|
req_query[key] = HTMLUtils.escape(value)
}

@req_query = req_query
end

def self.show(req_query)
new(req_query).build
end

def build

if @req_query == {}
str = <<-EOF
<html>
<head><title>testpage1</title></head>
<body>
<p>あなたの名前は?</p>
<form action="/index" method="get">

<input type="type" name="username">

<button type="submit" name="name" value="submit1">ok</button>

</body>
</html>
EOF
else
str = <<-EOF
<html>
<head><title>testpage2</title></head>
<body>hello, #{@req_query["username"]} </body>
</html>
EOF
end

end
end

server = HTTPServer.new(:Port => 10080)

# URIリクエストを元に出力を動的に生成して応答
server.mount_proc("/index") do |req, res|
res.content_type = "text/html"
res.body = MakeHTML.show(req.query)

end

trap("INT"){ server.shutdown }

# このthread は server.start の直前に置く。タイミングを合わせるため。
Thread.new do
sleep 3
system("firefox", "http://localhost:10080/index") # 注 これはシステムコマンド!
end

server.start


=begin

まず
http://localhost:10080/index
が、firefox で自動的に開かれる。

名前をテキスト・フィールドに入力して ok ボタンを押すと、
新しいページが開かれ、hello,(入力した名前) が表示される。

なお、system("firefox", "http://localhost:10080/index")
というシステム・コマンドが使われている。

=end