情况:
假设我们正在实现一个基于 JCR 并支持本地化的博客引擎。
内容结构看起来像这样 /blogname/content/[节点名称]
问题: 命名内容节点 (/blogname/content/[nodename]) 以满足以下要求的最佳方式是什么:
- 节点名称必须可在 HTML 中使用,以支持类似 REST 的 URL,即:blogname.com/content/nodename 应指向单个内容项。
- 上述要求不得产生丑陋的网址,即:/content/node_name 是好的,/content/node%20name 是坏的。
- 给定节点名称,编程检索应该很容易,即://content[@node_name=some-name]
- 命名方案必须保证节点名称的唯一性。
PS:使用的 JCR 实现是 JackRabbit
最佳答案
对于 1. 到 3.,答案很简单:只需使用您希望在节点名称中看到的字符,即。针对受限字符集(例如 the one for URIs)转义您拥有的任何输入字符串(例如博客文章标题)。 .
例如,不允许使用空格(JCR 节点名称允许使用空格,但会在 URL 中产生难看的 %20
)和其他必须在 URL 中编码的字符。您可以删除这些字符或简单地将它们替换为下划线,因为在大多数情况下这看起来不错。
关于唯一名称 (4.),您可以包含当前时间(包括时间)。毫秒或您显式检查碰撞。第一个可能看起来有点难看,但对于博客场景来说可能永远不会失败。后者可以通过对抛出的异常使用react(如果具有此类名称的节点已存在)并添加例如来完成。递增计数器并重试(例如 my_great_post1
、my_great_post2
等)。您还可以锁定父节点,以便只有一个 session 可以同时实际添加节点,这避免了尝试循环,但代价是阻塞。
注意: //content[@node_name=some-name]
不是有效的 JCR Xpath 查询。您可能想使用 /jcr:root/content//some-name
来实现此目的。
关于java - JCR 170 数据建模 : Node names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/672551/