java - JCR 170 数据建模 : Node names

标签 java data-modeling jackrabbit jcr

情况:
假设我们正在实现一个基于 JCR 并支持本地化的博客引擎。
内容结构看起来像这样 /blogname/content/[节点名称]

问题: 命名内容节点 (/blogname/content/[nodename]) 以满足以下要求的最佳方式是什么:

  1. 节点名称必须可在 HTML 中使用,以支持类似 REST 的 URL,即:blogname.com/content/nodename 应指向单个内容项。
  2. 上述要求不得产生丑陋的网址,即:/content/node_name 是好的,/content/node%20name 是坏的。
  3. 给定节点名称,编程检索应该很容易,即://content[@node_name=some-name]
  4. 命名方案必须保证节点名称的唯一性。

PS:使用的 JCR 实现是 JackRabbit

最佳答案

对于 1. 到 3.,答案很简单:只需使用您希望在节点名称中看到的字符,即。针对受限字符集(例如 the one for URIs)转义您拥有的任何输入字符串(例如博客文章标题)。 .

例如,不允许使用空格(JCR 节点名称允许使用空格,但会在 URL 中产生难看的 %20)和其他必须在 URL 中编码的字符。您可以删除这些字符或简单地将它们替换为下划线,因为在大多数情况下这看起来不错。

关于唯一名称 (4.),您可以包含当前时间(包括时间)。毫秒或您显式检查碰撞。第一个可能看起来有点难看,但对于博客场景来说可能永远不会失败。后者可以通过对抛出的异常使用react(如果具有此类名称的节点已存在)并添加例如来完成。递增计数器并重试(例如 my_great_post1my_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/

相关文章:

sql - 设计1 :1 and 1:m relationships in SQL Server

sql - 将广告添加到 mysql 数据库;请指出我正确的方向

如果列中的预期字符数约为 150K,则为 Mysql 数据类型

derby - 如何动态更改 Jackrabbit 持久性管理器?

java - Grails 应用程序 : Unable to locate Spring NamespaceHandler for XML schema namespace [http://cxf. apache.org/jaxrs]

regex - 这些特殊字符在 Java 中是什么意思?

java - Spring服务空指针异常

java - 如何学习使用内容存储库和 Apache JackRabbit?

java - Apache 长耳大野兔 : Error while retrieving repository using JNDI

用于 JSON 或 XML 或其他的 Java 内置数据解析器