SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Groovy+GrailsでRailsなWeb開発

Grailsの基本を知ろう

Groovy+GrailsでRailsなWeb開発 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

Javaのクラスを使って出力させる

 この変数表示のための${}は、変数以外にも「何らかの結果を出力させる」ものであれば使うことができます。例えば、

<p>${Calendar.getInstance().getTime()}</p>

 このようにGSPのコード内に記述しておけば、現在の日時を出力させることができます。GroovyではJavaのクラスライブラリがそのまま使えますから、それを利用すればさまざまな出力が行えるのです。

${Calendar.getInstance().getTime()}をビューに埋め込むと今の日時が出力される。
${Calendar.getInstance().getTime()}をビューに埋め込むと今の日時が出力される。

 ただし、この${}内に処理を書くことはできません。記述できるのは、あくまで「何らかの値の出力」のためのものだけです。ここで、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属性)のキーの値を取り出せばよいだけです。非常に単純です。

テキストのサニタイズ

 ここでは、送信された値をそのまま使ってテキストを表示させていましたが、実際の利用ではこのようなことは行わないはずです。送信されたテキストに悪意あるスクリプトなどが含まれていては問題ですから、テキストはサニタイズしてから表示に使う必要がありますね。

フォームから簡単な<script>タグを送信すると、そのままスクリプトが実行されてしまうことが分かる。
フォームから簡単な<script>タグを送信すると、そのままスクリプトが実行されてしまうことが分かる。

 Grailsでは、テキストのサニタイズは非常に単純です。先ほどのindex.gspに記述した${msg}の行を、次のように修正するだけでよいのです。

<p>${msg.encodeAsHTML()}</p>

 Grailsでは、テキストにはencodeAsHTMLというメソッドが用意されており、これを呼び出すことでHTML出力のためにタグ記号などをエンコードされた状態のテキストを得ることができます。表示の際にこれを利用すれば、悪意あるスクリプトも無効化できます。<script>タグなどを実際に送信して表示を確かめてみてください。

スクリプトを送信すると、そのまま表示され実行されなくなった。
スクリプトを送信すると、そのまま表示され実行されなくなった。

次のページ
タグライブラリによるフォームの生成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Groovy+GrailsでRailsなWeb開発連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3809 2009/04/17 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング