Javaのクラスを使って出力させる
この変数表示のための${}は、変数以外にも「何らかの結果を出力させる」ものであれば使うことができます。例えば、
<p>${Calendar.getInstance().getTime()}</p>
このようにGSPのコード内に記述しておけば、現在の日時を出力させることができます。GroovyではJavaのクラスライブラリがそのまま使えますから、それを利用すればさまざまな出力が行えるのです。
ただし、この${}内に処理を書くことはできません。記述できるのは、あくまで「何らかの値の出力」のためのものだけです。ここで、GSP内にさまざまな処理を記述してしまうと、結局、JSPの二の舞になってしまいます。あくまで「処理はコントローラー、出力はビュー」という役割分担を重視して考えましょう。
フォームからの送信
さて、次はフォームから値を送信し、それを処理して表示させる、ということを行ってみましょう。まずは、index.gspにフォームを用意します。
<body> <h1>Grails Helo</h1> <h2>This is Index Action Page.</h2> <p>${msg}</p> <form method="post" action="/gapp/helo/index"> <input type="text" name="txt"> <input type="submit"> </form> </body>
例によってボディだけ掲載しておきます。ここでは、helo/indexにPOST送信するフォームを用意しました。これで、コントローラーのindexアクションに、フォームを送信されたときの処理を用意すればいいわけです。
def index = { def msg = 'テキストを入力してください。' if (params['txt'] != null){ msg = params['txt'] + ' と書きました。' } ['msg': msg] }
フォームにテキストを書いて送信すると、「~と書きました」とメッセージが表示されます。実際に試して動作を確認してみてください。
フォームから送信された情報は、コントローラー側でparamsという連想配列としてまとめられます。ここから、送信した情報の名前(name
属性)のキーの値を取り出せばよいだけです。非常に単純です。
テキストのサニタイズ
ここでは、送信された値をそのまま使ってテキストを表示させていましたが、実際の利用ではこのようなことは行わないはずです。送信されたテキストに悪意あるスクリプトなどが含まれていては問題ですから、テキストはサニタイズしてから表示に使う必要がありますね。
Grailsでは、テキストのサニタイズは非常に単純です。先ほどのindex.gspに記述した${msg}の行を、次のように修正するだけでよいのです。
<p>${msg.encodeAsHTML()}</p>
Grailsでは、テキストにはencodeAsHTMLというメソッドが用意されており、これを呼び出すことでHTML出力のためにタグ記号などをエンコードされた状態のテキストを得ることができます。表示の際にこれを利用すれば、悪意あるスクリプトも無効化できます。<script>
タグなどを実際に送信して表示を確かめてみてください。