Grails2.1 サンプル作成 其の一

今回作成したサンプル

・テキストボックスに入力した名前に挨拶文を付け加えて画面表示する。

・名前の入力必須チェックを行う。

・エラー時・正常時ともにテキストボックスの入力値をそのまま表示する。

 

コード抜粋 ( GitHub )

■ GreetingController.groovy
    def greet(GreetingCommand cmd) {

        if (cmd.hasErrors()) {
            render(view: "/greeting/index", model: ['cmd':cmd])
            return
        }

        def name = cmd['name']
        def message = "Hello ${name} !!"

        // return new ModelAndView("/greeting/index", [ 'message' : message, 'cmd' : cmd ])
        render(view: "/greeting/index", model: [ 'message' : message, 'cmd' : cmd ])
    }

    @grails.validation.Validateable
    static class GreetingCommand {

        String name

        static constraints = {
            name(blank: false, maxSize: 12)
        }
    }
  • フォームの値をDomainではなく、Commad クラスを用意して受け取る。Domainパッケージ下のクラスは永続化対象となってしまうため、今回はControllerのインナークラスとして定義している。
  • 遷移先の指定方法はreturn・renderのどちらでもOK。
    遷移先 を記載しない場合、メソッド名.gsp or .jsp のファイルに飛ばされる。
 
■ /greeting/index.gsp
<g:hasErrors bean="${cmd}">
    <ul>
        <g:eachError bean="${cmd}">
            <li><g:message error="${it}" /></li>
        </g:eachError>
    </ul>
</g:hasErrors>
<g:form action="greet"method="get">
    <g:textField name="name"size="12"value="${fieldValue(bean: cmd, field: 'name')}"/>
    <g:submitButton name="submit"value="say" />
    <p>${message}</p>
</g:form>
  • <g:message>タグを使用しないと、プロパティファイルのメッセージは表示されない。
  • Beanの値を参照する場合、#fieldValue を使用しなければならない。
    ※ ${cmd.name}ではNPEが発生。 Cannot get property 'name' on null object というメッセージが表示される。