2022年10月31日月曜日

Cozy Web/HelloOperation

フォーム処理ではサーバーサイドでアプリケーション・ロジックを実行する必要があります。

Cozyではアプリケーション・ロジックを記述する方式としてKaleidoxの関数を使用することが可能です。

今回はKaleidoxの組込み関数「+」をCozy Webから使用する方法について見ていきます。

HelloOperation

フォームから使用できるアプリケーション・ロジックはオペレーションとして提供されています。

Kaleidoxの組込み関数はオペレーションとして登録されているので、そのまま使用することができます。

フォームを用いたWebアプリケーションHelloOperationを作成します。

HelloOperationでは、Kaleidoxの「+」関数をCozyのオペレーションとして実行することでフォームで入力した数値の加算を行います。

準備

cozyを起動するディレクトリのwebappsディレクトリに、アプリケーションのホームディレクトリとなるHelloOperationを作成します。

Formページ

フォームを使った入力画面として以下のページをindex.jadeとしてホームディレクトリに配置します。

  1. -@val form: ViewForm  
  2. html  
  3.   head  
  4.     title HelloForm  
  5.   body  
  6.     form(method="POST" action={form.action})  
  7.       input(hidden="true" name="$scenario" value={form.scenario})  
  8.       input(name="arg1" value={form.arg1})  
  9.       input(name="arg2" value={form.arg2})  
  10.       button(type="submit" id="submitbutton" name="$submit" value="ok") Submit  
  11.       button(type="submit" id="cancelbutton" name="$submit" value="cancel") Cancel  

ViewFormオブジェクト

以下の宣言でフォームの設定に必要なViewFormを参照可能にします。

  1. -@val form: ViewForm  

Form/action

actionにViewFormオブジェクトのaction属性を設定します。

  1. form(method="POST" action={form.action})  

今回の場合は空文字が設定されます。入力と同じページにフォームのPOSTが行われるということですね。

POST処理に必要な情報は後述する「$scenario」に設定されています。

Input/Hidden

Hidden属性のInputで入力する「$scenario」プロパティにViewFormオブジェクトのscenario属性を設定します。

  1. input(hidden="true" name="$scenario" value={form.scenario})  

今回の場合は「{"name":"invoke-operation","state":"input","data":{}}」が設定されています。URLエンコーディングを解除した値は「{"name":"invoke-operation","state":"input","data":{}}」です。

Cozy Webがフォーム処理を行うために必要な情報が設定されています。

Inputデータ

Hidden属性のないInputでデータ入力を行います。

今回は以下の2行が対象です。

  1. input(name="arg1" value={form.arg1})  
  2. input(name="arg2" value={form.arg2})  

nameにarg1とarg2を指定しているので、arg1プロパティとarg2プロパティの2つのプロパティの入力ということになります。値のデフォルト値としてViewFormオブジェクトのarg1属性とarg2属性の値を設定しています。今回のケースでは空文字が設定されます。

Input/Ok

OK用のサブミットボタンとして以下のButtonを設定しました。

  1. button(type="submit" id="submitbutton" name="$submit" value="ok") Submit  

name属性に「$submit」、value属性に「ok」を指定しています。

Input/Cancel

キャンセル用のサブミットボタンとして以下のButtonを設定しました。

  1. button(type="submit" id="cancelbutton" name="$submit" value="cancel") Cancel  

name属性に「$submit」、value属性に「cancel」を指定しています。

コントローラ

WEB-INF/controllersにindex.jade用のコントローラである以下のindex.jsonを配置します。

  1. {  
  2.   "action""invoke-operation-scenario",  
  3.   "operation""+",  
  4.   "method""POST",  
  5.   "successView""index_complete",  
  6.   "errorView""index_error",  
  7.   "parameters": [{  
  8.     "arg1""int",  
  9.     "arg2""int"  
  10.   }]  
  11. }  

action

コントローラのアクションとしてinvoke-operation-scenarioを指定しています。

  1. "action""invoke-operation-scenario",  

invoke-operation-scenarioは、フォームでパラメタ入力し、このパラメタを使ってオペレーションを呼び出し、その結果をビューに渡すモデルとして生成する処理を行うシナリオです。

フォーム入力にまつわるWebブラウザとサーバ間のインタラクションをシナリオに従って実現します。

operation

実行するオペレーションとして+を指定しています。

  1. "operation""+",  

+オペレーションはKaleidoxが定義している関数で、数値の加算をおこないます。

CozyではKaleidoxの関数をinvoke-operation-scenarioで呼び出すことができるオペレーションとして使用できるようになっています。

method

メソッドはPOSTを指定しています。

  1. "method""POST",  

FormのメソッドがPOSTのものを受け付けます。

successView

successViewにはindex_completeを指定しています。

  1. "successView""index_complete",  

コントローラの処理が成功するとこのページに遷移します。

errorView

errorViewにはindex_errorを指定しています。

  1. "errorView""index_error",  

コントローラの処理が失敗するとこのページに遷移します。

parameters

フォームから入力されるパラメタとして、パラメタ名とデータ型を指定しています。

  1. "parameters": [{  
  2.   "arg1""int",  
  3.   "arg2""int"  
  4. }]  

パラメタは、パラメタ名arg1でデータ型intとパラメタ名arg2でデータ型intの2つです。

成功ページ

成功ページとして以下のindex_complete.htmlを用意します。コントローラのsuccessViewで指定したページです。

  1. <html>  
  2.     <head>  
  3.     <title>Operation Success</title>  
  4.     </head>  
  5.     <body>  
  6.     <h1>Operation Success</h1>  
  7.     <c:model/>  
  8.     </body>  
  9. </html>  

このページ内の以下のタグはコントローラの実行結果のモデルの内容を表形式で表示するものです。

  1. <c:model/>  

今回の場合は、+オペレーションの結果が出力されます。

エラーページ

成功ページとして以下のindex_error.htmlを用意します。コントローラのerrorViewで指定したページです。

  1. <html>  
  2.     <head>  
  3.     <title>Operation Error</title>  
  4.     </head>  
  5.     <body>  
  6.     <h1>Operation Error</h1>  
  7.     <c:error/>  
  8.     </body>  
  9. </html>  

このページ内の以下のタグはコントローラの実行時にエラーが発生した場合、そのエラーを表形式で表示するものです。

  1. <c:error/>  

今回の場合は、loopbackオペレーションがエラーとなる場合に出力されます。

実行

Formページ

curlコマンドによってローカルホストの8080ポート上の/web/HelloOperation を取得します。

  1. $ curl http://localhost:8080/web/HelloOperation/  

以下のHTML文書が返されます。

  1. <!DOCTYPE html>  
  2. <html>  
  3.   <head>  
  4.     <title>HelloForm</title>  
  5.   </head>  
  6.   <body>  
  7.     <form action="" method="POST">  
  8.       <input value="{&quot;name&quot;:&quot;invoke-operation&quot;,&quot;state&quot;:&quot;input&quot;,&quot;data&quot;:{}}" name="$scenario" hidden="true" />  
  9.       <input value="" name="arg1" />  
  10.       <input value="" name="arg2" />  
  11.       <button value="ok" name="$submit" id="submitbutton" type="submit">Submit</button>  
  12.       <button value="cancel" name="$submit" id="cancelbutton" type="submit">Cancel</button>  
  13.     </form>  
  14.   </body>  
  15. </html>  

OK

OKボタンの押下は以下のcurlに相当します。

  1. $ curl http://localhost:8080/web/HelloOperation/ -X POST \  
  2. --data-urlencode '$submit=ok' \  
  3. --data-urlencode 'arg1=3' \  
  4. --data-urlencode 'arg2=8' \  
  5. --data-urlencode '$scenario={"name":"invoke-operation","state":"input","data":{}}'  

OKボタン押下と同等の上記curlの結果、以下のHTMLが出力されました。

  1. <!DOCTYPE html>  
  2. <html><head>  
  3.     <title>Operation Success</title>  
  4.     </head><body>  
  5.     <h1>Operation Success</h1>  
  6.     11  
  7.       
  8. </body></html>  

c:modelタグの場所に、「+ 3 8」の計算結果である11が出力されています。

まとめ

今回はCozy WebでHTMLフォームの処理にKaleidoxの組込み関数を使用する方法について説明しました。

Cozy WebではHTMLフォームを使った処理はコントローラに宣言的な定義をするだけで、Webとサーバー間のインタラクションを伴う状態遷移の管理を行ってくれます。さらにオペレーションとして登録された各種処理も実行してくれるので、オペレーションを実装すれば後はWeb画面のデザインをするだけでHTMLフォーム処理を実現することができるわけです。

今回はKaleidoxの組込み関数を使用しましたが、次回はKaleidoxのスクリプト機能を使用してHTMLフォームによる処理を実現する方法を説明します。

諸元

Cozy
0.0.8