(ruby)(WEBrick)(ブラウザ を インターフェイス にする rubyアプリケーションを 割と真面目に考えてみる)

この記事の続き → http://d.hatena.ne.jp/morakana/20100820/1282285693


 以前ちょこっとだけ さわりの部分だけを書いて放置してましたが
あれを「少し」発展させて 「少し」具体的なものにしてみました
まぁ それなりに 複雑にはなっているので
「現物を見るのが一番」ということで
まずは今回のプロジェクトを 一つに圧縮したファイルをアップします
こちらからダウンロードできます → ダウンロード
これを展開してから見比べながらご覧になってください

 トップフォルダに 6つのファイル と ディレクトリが2つ ありますね
どうしても 後々ファイル数が多くなりそうなものは フォルダに追いやった方がいいと思うので
画像は imgフォルダに
他の方が作ったJavaScriptは そのライブラリ名でフォルダを作っています
今回は とりあえず動的なページを実現するために手っ取り早い 上に 拡張性の高い
jQuery を 利用させてもらっています

 では トップフォルダ上にあるファイルを見ていきます

 「base.css」これは言うまでも無く 全ページに共通する スタイルシートですね
特に必要が無い限り スタイルシートの設定は ここに集約させます
必然的に html出力をする 各サーブレットは この cssを参照することとします

 「httpSrv.rb」が実体ファイルになります
これを実行すれば サーバ機能をスタートできます
スクリプトを実行したPC内から ブラウザを使ってトップページにアクセスする場合は
http://127.0.0.1:1234/top_page」でもアクセス可能です
スクリプトを実行したPC以外の LAN内PCからアクセスする場合は
ループバックアドレス127.0.0.1)ではなくきちんとローカルIPアドレスで指定してください
(理屈上ではポートフォワーディングすれば外部からでもアクセス可能です)
現状は 一応 Linuxでも Windowsでも 即座に実行する事が出来ると思います
Linuxの場合は環境によってはrubyへのパスを変更する必要があるかもしれません)

 このファイル内のポイントは
「LISTENING_PORT = 」でポート番号を指定するのと
ファイルの中盤にある requireで 「servlet_****.rb」 を読み込んでいる所です

 ポート番号は 都合のいい待ち受けポート番号を指定するだけです
requireの方は 別途用意した rbファイルを読み込んでいるわけですが
それらの rbファイルには サーブレット用の クラス定義のみが書かれています
定義されたサーブレットのクラスは 次の行の 「@srv.mount('/****', ****)」 で
webサーバのフォルダにマウントされます
この要領で プラグイン的に ページを表示する機能を追加していきます

 それでは 各「servlet_****.rb」ファィルの概要です
中でも 「servlet__Interface.rb」は特殊なサーブレット
テキストのみを返す サーブレットです
その他の「servlet_****.rb」は 基本的には htmlのページを返します

 では サンプル的な実例です
servlet_TopPage.rb」の中に
「#{get_('_', 'cmd=system_version')}」というのがあると思います
「get_()関数」は 「httpSrv.rb」の中で定義されているものですが
サーブレットが実行されている途中で 別のサーブレットを呼び出す時に使います
つまり 「『servlet_TopPage.rb』でhtmlを出力している最中に 他のサーブレットを呼び出して結果を得る」
事が出来ます

 では 「get_('_', 'cmd=system_version')」の詳細な意味です
「'_'」は「@srv.mount('/_', Interface)」の部分から分るとおり
servlet__Interface.rb」のマウントポジションになっています
よって 「servlet_TopPage.rb」から
servlet__Interface.rb」の機能を呼び出しているという事になります
第二引数は「'cmd=system_version'」となっていますが
それは HTTPでGETした時の「?」以降の部分になります
つまり「cmd」という要素名に「system_version」という値をセットして GETしている という事になります
アドレスで書けば 「http://127.0.0.1:1234/_?cmd=system_version」にアクセスする事に相当します
先ほど書いたとおり 「_」は「servlet__Interface.rb」へのアクセスを意味し
servlet__Interface.rb」はテキストでデータを返してくるという事を思い出してもらえれば
「get_('_', 'cmd=system_version')」の値は
このツールのシステムのバージョンをテキストで受信するという意味になるんだなという事が
なんとなくイメージできるかと思います
その値を ヒアドキュメント内で「#{}」を使って埋め込んでますので
「#{get_('_', 'cmd=system_version')}」の部分は このツールのシステムバージョンの文字列に
置き換わって出力される事が理解できるかと思います

 「servlet_URIEncodePage.rb」は これまでの理解 と これらを少し発展させてみた
簡単なサンプルです
「/top_page」から 「URIエンコード」というリンクをクリックするか
直接マウントポジョンの 「/uri_encode_page」にアクセスすると
URIエンコードするためのインターフェイスとなる ページが表示されます
この「servlet_URIEncodePage.rb」は rubyの力を利用して 文字列をURIエンコード
その結果を表示させます
今回は 2バージョンのサンプルを書いてます

 2バージョンのうちの上のほうのサンプルは「これまでの理解」の部分で
今回は formタグを使って GETで サーブレットにアクセスします
submitボタンが押されると
「cmd」要素に「uriencode」をセットし
「str」要素にはテキストボックス内の値がセットされ
「'./_'」つまり「servlet__Interface.rb」が呼び出されます

 前回は 「cmd」要素の値は「system_version」だったのに対して
今回は 「uriencode」になっているので
「str」要素の値を取得して URIエンコードして その値を テキストデータとして返しています
その事は スクリプトを見てもらうとなんとなく分るでしょう
つまり 「servlet__Interface.rb」を GETで呼び出せば
何らかの値をテキストで受けるような事が出来るわけですね
ただし このサンプルでは formタグの仕様上 いちいちページが更新されてしまいますし
しかも 今回の場合だと テキストだけが表示されるそっけないページに
リダイレクトされてしまうわけですね

 そこで 下の方のサンプルです
jQuery」という強力な JavaScriptを利用する事で
今表示されているページに直接 動的に表示させてしまおうというのが
「発展」の部分ですね

 「jQuery」を使って 表示を変更させてる部分が 「servlet_URIEncodePage.js」ですね
拡張子から分るとおり JavaScriptで書かれています
もう一度 「servlet_URIEncodePage.rb」を見てもらうと分ると思いますが
jQuery」と「このスクリプト」を読み込んでいるのが分ると思います
スクリプトのトリガーは 「エンコードする」のリンクをクリックした時に
他のページにリンクするのではなく
servlet_URIEncodePage.js」の「do_URIEncode()」関数を呼び出すようになってます
この関数が、 テキストボックス内の文字列を読み取り
rubyに値を渡し処理させ URIエンコードされた値を受けたり
その値を 動的にページ内に表示させます

 ここまでがざっと 基本的な概念ですね
まだまだ 仕様が煮詰まっていないし
ruby」+「HTML(JavaScript)(CSS)(HTML5)(jQuery)」と複数の知識も要しますし
ちょっと分り難い部分が多いと思いますが
rubyのパワー」や「jQueryの表現力」の上に
rubyを使うことでOSを超えた使い回しが比較的簡単になる」
FirefoxOperaChromeなどのブラウザをGUIに出来るので比較的環境を選ばない」
「httpでアクセスできる範囲なら何処からでもアクセスできるアプリケーションが出来る」
などというのが 魅力になるんじゃないかなと思います

 また いろいろと煮詰まってきたら またこの話題で書いてみようと思います