Board logo

标题: GORM - 有趣的名称,严肃的技术(2) [打印本页]

作者: look_w    时间: 2018-8-8 10:09     标题: GORM - 有趣的名称,严肃的技术(2)

裸对象前面刚刚了解了在 Airline POGO 上添加提示(静态的        hasMany)如何影响表在幕后的创建方式以及前端生成的视图。这种使用裸对象 修饰域对象的模式(请参阅 )在 Grails 中应用得非常广泛。将这条信息直接添加到 POGO 内,就消除了对外部 XML 配置文件的需求。所有信息都在一个位置内,可以显著提高生产率。
例如,如果想消除显示在组合框中的主键的泄漏,只要在        Airline 类中添加 toString 方法就可以,如清单 6 所示:
清单 6. 在 Airline 中添加 toString 方法               
1
2
3
4
5
6
7
8
9
10
11
12
class Airline {
  static hasMany = [trip:Trip]

  String name
  String url
  String frequentFlyer
  String notes
     
  String toString(){
    return name
  }
}




从现在开始,在组合框中显示的值就是航线的名称。这里真正酷的地方在于:如果 Grail 依然在运行,那么只要保存 Airline.groovy,修改就会生效。请在浏览器中新建一个 Trip,看看这样做的效果。因为视图是动态生成的,所以能够迅速地在文本编辑器和浏览器之间来回切换,直到看到合适的视图 — 不需要重新启动服务器。
现在我们来解决字段按字母顺序排序的问题。要解决这个问题,需要向 POGO 添加另一个配置:static constraints 块。请按清单 7 所示的顺序将字段添加到这个块(这些约束不影响列在表中的顺序 — 只影响在视图中的顺序)。
清单 7. 修改 Airline 中的字段顺序               
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Airline {
  static constraints = {
    name()
    url()
    frequentFlyer()
    notes()  
  }

  static hasMany = [trip:Trip]
     
  String name
  String url
  String frequentFlyer
  String notes
   
  String toString(){
    return name
  }
}




将修改保存到 Airline.groovy 文件,在浏览器中新建一个航线。现在里面的字段应该按照在清单 7 中指定的顺序出现,如图 3 所示:
图 3. 自定义的字段顺序在您准备责备我没有必要在 POGO 中输入两次字段名称而违背 DRY 原则(不要重复你自己)时(请参阅 ),请稍等一下,因为将它们放在独立的块内有很好的理由。清单 7 的 static constraints 块内的大括号不会总是空白。
数据验证除了指定字段顺序,        static constraints 块还允许在里面放置一些验证规则。例如,可以在        String 字段上施加长度限制(默认是 255 个字符)。这样就能确保 String 值与指定的模式(例如电子邮件地址或 URL)匹配。甚至还能将字段设置为可选或必需的。关于可用的验证规则的完整列表,请参阅 Grails 的联机文档(请参阅 )。
清单 8 显示的 Airline 类中在约束块内添加了验证规则:
清单 8. 将数据验证添加到 Airline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Airline {
  static constraints = {
    name(blank:false, maxSize:100)
    url(url:true)
    frequentFlyer(blank:true)
    notes(maxSize:1500)  
  }

  static hasMany = [trip:Trip]
     
  String name
  String url
  String frequentFlyer
  String notes

  String toString(){
    return name
  }
}




保存修改后的 Airline.groovy 文件,在浏览器中新建一条航线。如果违反了验证规则,会收到警告,如图 4 所示:
图 4. 验证警告可以在         grails-app/i18n 目录的 messages.properties 文件中对警告消息进行自定义。请注意,默认的消息已经用多种语言进行了本地化(请参阅 Grail 联机文档中的验证一节,了解如何在每个类、每个字段的基础上创建自定义消息)。
中的多数约束只影响视图层,但是有两个约束也会影响持久层。例如,数据库中的        name 列现在是 100 个字符长。notes 字段除了从输入字段转为视图的文本区域之外(对于大于 255 个字符的字段会进行这个转换),还从 VARCHAR 列转为        TEXT、CLOB 或        BLOB 列。这些转变取决于在后台使用的数据库类型和它的 Hibernate 方言 — 当然,这些也是可以修改的。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0