「m_apache」の編集履歴(バックアップ)一覧に戻る

m_apache - (2010/01/30 (土) 01:55:25) のソース

MGWSIで Apache から GT.M を使えるようにしたときの作業メモです。
MGWSI導入については → [[こちら>P.011]]

- GT.M / MUMPS向けの通信プロセス は準備済みとします。
-- 仲介用デーモンプロセスは使わない設定にします
-- 使うようにもできるけど、使わない方がパフォーマンスでるらしいので

* 最初の一歩
- ~/mgwsi/bin/m_apache22.so を /usr/lib/apache2/modules/ 配下へコピー
- /etc/apache2/mods-avalable/ 配下へ以下の2ファイルを作成
mgwsi.load
 LoadModule m_apache_module /usr/lib/apache2/modules/m_apache22.so
mgwsi.conf
 SetEnv MGWSI_PORT 7041
- ここで a2enmod で mgwsi を有効にするのが流儀のようですが…
-- めんどうなので、手作業で mods-enable 配下にシンボリックリンクをはりました
- Apache を再起動
- 以下のような HTMLファィルを作成し
 <html>
 <head>
 <title>First Step</title>
 </head>
 <body>
 <form method="POST" action="test.mgwsi?xxx=yyy1&xxx=yyy2">
 <input type="text" name ="a" value="b" /> <br />
 <br />
 <input type="text" name ="c" value="d" /> <br />
 <br />
 <input type="submit" name="go" value="SUBMIT" />
 </form>
 </body>
 </html>
- SUBMIT ボタンをクリックすると送信した情報がブラウザに表示されます
-- 拡張子 .mgwsi をもつページをリクエストした場合は、内容が GT.M に送り出されます
-- GT.M の受け側は(省略されているので)WEB^%ZMGWSIS ルーチンが想定されます
--- ZMGWSI.RO を登録した時に作成される以下の部分が相当します
CGI … サーバの情報
DATA … GET なり POST なりで送った情報
 WEB(CGI,DATA)
  N REQ,X,Y
  S REQ=""
  S REQ=REQ_"HTTP/1.1 200 OK"_$C(13,10)
  S REQ=REQ_"Content-type: text/plain"_$C(13,10)
  S REQ=REQ_"Connection: close"_$C(13,10)
  S REQ=REQ_$C(13,10)
  W REQ
  W $G(CGI)
  S X="" F  S X=$O(CGI(X)) Q:X=""  W X_"="_$G(CGI(X))_$C(13,10)
  W $C(13,10)
  S X="" F  S X=$O(DATA(X)) Q:X=""  S Y="" F  S Y=$O(DATA(X,Y)) Q:Y=""  W X_":"_Y_"="_$G(DATA(X,Y))_$C(13,10)
  Q

* GT.M ルーチンを自作
- TESTDSP1.m を作成&コンパイル
※分かりやすいように、命令は省略せずに書きました。
 TESTDSP1(CGI,DATA)
  NEW REQ
  SET REQ=""
  SET REQ=REQ_"HTTP/1.1 200 OK"_$CHAR(13,10)
  SET REQ=REQ_"Content-type: text/plain"_$CHAR(13,10)
  SET REQ=REQ_"Connection: close"_$CHAR(13,10)
  SET REQ=REQ_$CHAR(13,10)
  WRITE REQ
  WRITE ^animal($GET(DATA("key",1)))_$CHAR(13,10)
  QUIT 
- mgwsi.conf を変更&Apache を再起動
 SetEnv MGWSI_PORT 7041
 SetEnv MGWSI_M_FUNCTION ^TESTDSP1
- 以下のような HTMLファィルを作成し、ブラウザから SUBMIT をクリックするとブラウザに鳴き声が表示されます
 <html>
 <head>
 <title>My Routine</title>
 </head>
 <body>
 <form method="POST" action="test.mgwsi">
 <select name="key">
 <option value="dog">DOG
 <option value="cat">CAT
 </select><br />
 <br />
 <input type="submit" name="go" value="SUBMIT" />
 </form>
 </body>
 </html>
- 拡張子が .mgwsi の場合は無条件に(指定された)GT.M ルーチンに渡されます
- 厳密にいうと .ewd も同様の動きとなります。
- もし拡張子以外の部分になにか意味を持たせたい場合は、GT.M ルーチンの方で実装することになります

* XMLHttpRequest を使う
- submit をかけずに、いわゆる Ajax っぽく使う場合の説明です。
- TESTDSP1.m を変更&コンパイル
※改行をつけなくしただけです
 TESTDSP1(CGI,DATA)
  NEW REQ
  SET REQ=""
  SET REQ=REQ_"HTTP/1.1 200 OK"_$CHAR(13,10)
  SET REQ=REQ_"Content-type: text/plain"_$CHAR(13,10)
  SET REQ=REQ_"Connection: close"_$CHAR(13,10)
  SET REQ=REQ_$CHAR(13,10)
  WRITE REQ
  WRITE ^animal($GET(DATA("key",1)))
  QUIT 
- ~/mgwsi/java/m_client.js をWEBディレクトリへコピー
-- 自前で書ける人は自作でもいいのですが、せっかくあるんで使ってみました
- 以下のような HTMLファィルを作成し、ブラウザから GET VOICE をクリックするとテキストボックスに鳴き声が表示されます
 <html>
 <head>
 <title>XMLHttpRequest</title>
 <script type="text/javascript" src="m_client.js"></script>
 <script type="text/javascript">
 <!--
 function get_val()
 {
   var k = document.myform.key;
   var r = document.myform.res;
   var d ='test.mgwsi?key=' + k.options[k.selectedIndex].value;
   var res = server_proc(d);
   r.value = res;
 }
 -->
 </script>
 </head>
 <body>
 <form name="myform">
 <select name="key">
 <option value="dog">DOG
 <option value="cat">CAT
 </select><br />
 <br />
 <input type="button" name="go" value="GET VOICE" onClick="get_val()" />
 </form>
 </body>
 </html>
※うまくとれない時は、Apache の再起動をするといいかもしれません。