Grails面试试题:验证篇

Tomás Lin在其博客中公布了一套面试Grails开发人员的题目,本站将陆续公布问题的答案。今天公布的是验证部分的试题回答。

验证篇

  • Grails中的约束是什么意思?请给出3个示例。
  • 跟数据库中的约束类似,在保存前,Grails会先使用它来验证Domain Class的各个属性,若不能通过,则无法保存或修改,例如:

    static constraints = {
        login(size:5..15,blank:false,unique:true)
        password(size:5..15,blank:false)
        email(email:true,blank:false)
        age(min:new Date(),nullable:false)
    }
    

    详情可参考本站的《Grails 1.2参考文档速读(15):验证》。

  • 请给出两个影响视图脚手架显示的约束。
  • display:如果true(缺省值),属性将显示;
    editable:如果false,相关表单字段只读。

  • 请给出两个影响数据库生成的约束。
  • maxSize(minSize):限制属性值大小,对应列大小;
    size:限定属性值大小范围。

  • 如果验证失败,我希望Domain对象抛出异常,该怎么做?
  • Grails提供了配置项:grails.gorm.failOnError,如果设置成true,验证失败时,save()就会抛出grails.validation.ValidationException异常。

  •  什么是Grails命令对象?在验证中如何使用?
  • 对于不想直接暴露Domain Class的场合,可以使用Command Object来代替。Grails的Command Object跟Spring MVC中的没什么区别,是一个View Object。

    class LoginController {
        def login = { LoginCommand cmd -<
            if(cmd.hasErrors()) {
                redirect(action:'loginForm')
            }else {
            // do something else
            }
        }
    }
    class LoginCommand {
        String username
        String password
        static constraints = {
            username(blank:false, minSize:6)
            2011-2-9·password(blank:false, minSize:6)
        }
    }
    

    详情可参考本站的《Grails 1.2参考文档速读(10):Controller》。

  • validate()和save()的区别?
  • validate用于验证;save()用于保存。在进行实际的保存前,save会调用validate,失败则不保存;反之,保存。

  • 有一个类存于src/groovy下,我想为其加入验证,该怎么做?
  • 方法1:

    1. 将类用@Validateable注解
    2. 在类中定义constraints静态属性
    3. import org.codehaus.groovy.grails.validation.Validateable
      @Validateable
      class User {
      ...
          static constraints = {
              login(size:5..15, blank:false, unique:true)
              password(size:5..15, blank:false)
              email(email:true, blank:false)
              age(min:18, nullable:false)
          }
      }
    4. 在Config.groovy中定义要查找@Validateable的包名:grails.validateable.packages
    5. grails.validateable.packages = ['com.mycompany.dto', 'com.mycompany.util']

    方法2:

    1. 在类中定义constraints静态属性
      class User {
      ...
          static constraints = {
              login(size:5..15, blank:false, unique:true)
              password(size:5..15, blank:false)
              email(email:true, blank:false)
              age(min:18, nullable:false)
          }
      }
    2. 在Config.groovy中注册类名: grails.validateable.classes
      grails.validateable.classes = [com.mycompany.myapp.User , com.mycompany.dto.Account]

      详情可参考本站的《Grails 1.2参考文档速读(15):验证》。

By huwh - Posted on 10 二月 2011