在 “改变 Grails 应用程序的外观” 一文中,我们看到了如何使用层叠样式表(CSS)对一个 Grails 应用程序 — Blogito blog 站点 — 进行外观更改。这次,我将向您展示如何影响 Web 应用程 序的命脉: 用于导航的 URI。这对于像 Blogito 这样的 weblog 极其重要。指向单个条目的那些永久链 接(permalink)被像名片一样在 Internet 上传递;描述性越好,就越有效。
要获得描述性更好的 URI,需要定制控制器代码以支持个性化的 URI。还需要处理 UrlMappings.groovy 文件来创建新的路径。最后,您将创建一个定制的 codec 来更为轻松地生成定制 URI。
了解 URI
URI 中的 U 在正式的场合下代表的是 Uniform,但是也可以表示 Unique。如果 URI http://www.ibm.com/developerworks 不能确切标识您目前所处于的 Web 站点,它就没什么用处了。它 还能使资源 的标识符 更容易让人记住。通过键入 http://129.42.56.216 虽然可以进入该站点,但是很 少有人愿意去记忆这个 Web 站点的用圆点分隔的数字形式的 IP 地址。
所以,URI 至少必须是惟一的。理想情况下,它还应该容易被人记住。Grails 绝对能够满足第一个要 求。它综合使用了控制器名称、闭包名称以及数据库记录的主键以确保 URI 的惟一性。比如,如果想要 向用户显示数据库内的第一个 Entry,就让他们在其浏览器内键入 http://localhost:9090/blogito/entry/show/1。
虽然在 URI 内包含主键的默认设置十分合理,但我认为它还是在两个方面违背了美学标准。首先,实 现牵涉的内容较多。这个附带的数据库工件贯穿了整个 Web 站点。Google、Amazon 和 eBay 都在后台使 用了数据库,但是很难在它们的 URI 内找到任何数据库的迹象。其次,从 URI 删除主键是出于语义的要 求。Jane Smith 的 blog 的读者更愿意用 jsmith 作为她的标识,而不是一个数字 12。同样地,按标题 而不是主键列出 blog 条目更能满足可记忆 URI 的要求。
创建 User 类
Blogito 虽然已经支持条目,但它尚不支持用户。因此,必须先创建一个新的 User 类。
围绕模糊 URI 的争论
所有人都同意一个 URI 必须能够惟一识别一种资源,但是,围绕它是否应该为了可读性而提供额外元 数据的争论仍然十分激烈。有些人认为加重 URI 的负担,使其既具有惟一性又具描述性十分危险。他们 认为描述性好的 URI 太长且太脆弱,而且还不必要地将资源标识符与底层技术连接起来。
上述这些担心都很合理,但是我却对 URI 不透明性的公认不敢苟同。我认为可读的 URI 对用户更为 友好,而且利远远大于弊。清晰的 URI 容易记,若遇到问题,也容易调试,而且如果它们遵循了透明约 定,还能使 Web 站点的自描述更好而且更易于被发现。
Grails 争取透明性的第一步是在 URI 内公布对象名和控制器方法。在本文中,我将通过用更为友好 的文本标识符代替主键来继续这场有关其合理性的争论。但是为了证明我能看到问题的两个方面的优点, 在需要简明 URI 而不是描述性更好的 URI 时,我衷心赞同使用类似 tinyurl.com 这样的 Web 站点。
首先,在命令行提示符键入 grails create-domain-class User。接下来,将清单 1 内的代码添加到 grails-app/domain/User.groovy:
清单 1. User 类
class User {
static constraints = {
login(unique:true)
password(password:true)
name()
}
static hasMany = [entries:Entry]
String login
String password
String name
String toString(){
name
}
}