现,这可以提高我们的生产效率。 当然,有些情况下我们要面对已存在的数据库,或者我们只是想自己来管理数据库。 Grails 也支持这种方式,你只要很简单地删除dbCreate 这个属性,Grails 就不会去动 数据库定义了。 6 声明约束属性 Grails 的约束属性(constraints)声明了我们对领域类属性的期望值。我们可以用约束 属性来声明一个特定属性不能超过某个长度;限制一个列表的元素数目;要求一个保存邮件 地址的属性必须遵循有效的 E-mail 地址语法结构等等。我们用 Groovy 闭包来在领域类里 定义这些约束。闭包所用的 Builder 语法简单而清晰。 我们从 Race 领域类开始吧,在 Race.groovy 里添加如下所示的闭包。 class Race { //... static constraints = {//一些约束条件 name(maxLength:50,blank:false) startDateTime(min:new Date()) city(maxLength:30,blank:false) state(inList:['GA', 'NC', 'SC', 'VA'],blank:false) distance(min:3.1f,max:100f) cost(min:0f,max:999.99f) } } 7 一个异常 在.grails 下删除自己的那个项目文件重新来 原来是自己的一个 cost(min:0f,max:999.99f)中的 999,99 了使用逗号了应该为.点号 8 在写控制器的时候注意 输 入 控 制 器 的 名 字 的 时 候 : race 不 用 写 成 raceController 否 则 会 变 成 raceControllerController 9 自 定 义错 误信 息 ,需 要在 racetrack/grailsapp/i18n/messages.properties 里 面添 加 race.name.blank=please enter a name for this race 10 端口 使用-Dserver.port 来制定端口
Grails –Dserver.port-8090 run-app
11
搜索部分有错误 验证部分没有像
文档上面的一样 12 一些知识点 控制器主要用来完成对
web 请求的处理 修改控制器的内容能够在页面显示出来 def world ={render”hello”} 控制器完成后,使用 run-app 命令来启动内置的 j
etty 服务器 默认是在 8080 端口 在浏览器中刚进入的简介页面是由 web-app/index.gsp 显示的, 在上面可以看见创建的控制 器,点击后显示 helloworld!字样---------------并未实现,404 错误 解决办法---先开始写成这样的,有 index def world={render "Hello World!" } def index = { } 应该把 index 删掉 def world={render "Hello World!"} 13 脚手架---生成整个应用程序的骨架,通过使用 generate-*命令完成 使用 generate-all 命令根据领域模型生成控制器及其相应的视图 Generate-all book Conf /confi.groovy 配置文件用来完成一半的通常配置,非常类似 java 属性 properties 文件 在写 domain-class 的时候是不必写; (分号)的,写了也可以不错 一旦你有一个 domain 类 可通过 shell 和 console 操纵它 grails console 这将会为你载入 一个可以输入 groovy 命令的交互式图形界面 14 CRUD 操作 create read update delete 创建 Def save={ Def race=new Race() Race.properties=params If(race.save()) { Redirect(action:show,id:race.id) } Else { Render(view:’create’,model:[race:race]) } } 读取
Def p=Person.get(1) Assert 1=p.id 更新 Def update={ Def race=Race.get(params.id) If(race){ Race.properties=params If(race.save()) { Flash.message=”${params.name}updated.” Redirect(action:show,id:race.id) } Else{ Render(view:’edit’,model:[race:race]) } } Else { Flash.message=”Race not found with id ${params.id}” Redirect(action:edit,id:params.id) } } 删除 Def p=Person.get(1) p.delete() 每个属性映射到数据库中的一个列,列名的规则命名规则是全部小写并用下划线分隔 如 releaseDate-------release—Date
15 关联 一对一 Class face{ nose nose} class nose{} 单向关联 Class face{nose nose } class nose {face face} 双向关联---不能级联更新 Class face{nose nose } class nose {static belongsTo=[face:face]}—双向关联—级联 更新 new face(