1

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

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

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

PS:使用的JCR实现是JackRabbit

4

3 回答 3

1

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

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

关于唯一名称 (4.),您可以包括当前时间,包括。毫秒或您明确检查冲突。第一个可能看起来有点难看,但对于博客场景来说可能永远不会失败。后者可以通过在已经存在具有此类名称的节点时对引发的异常做出反应并添加例如。一个递增的计数器,然后重试(例如my_great_post1,,my_great_post2等)。您还可以锁定父节点,这样实际上只有一个会话可以同时添加一个节点,这样可以避免循环试验,但会以阻塞为代价。

注意: //content[@node_name=some-name]不是有效的 JCR Xpath 查询。你可能想用/jcr:root/content//some-name它。

于 2009-08-31T17:53:43.990 回答
0

关于项目 3。我最近了解到 xpath 查询不允许项目以数字开头。如果您的节点名称以数字开头,仍然可以通过转义名称的第一个字节来查询它,但是如果您以字母开头所有节点名称,您的查询将更加直接。

(我不确定属性名称。从未见过不是以字母开头的。)

于 2009-05-28T05:12:14.220 回答
0

唯一名称:要从标题的第一个字符加上随机数(以解决冲突)快速生成唯一名称,您可以使用以下算法:

String title = "JCR 170 Data modeling: Node names";
String name = title.substring(0, Math.min(title.length(), 10)).trim().replace(' ', '_');
if (name is not unique) {
    name += "_";
    Random r = new Random();
    while (name is not unqiue) {
        name += Integer.toString(r.nextInt(10));
    }
}

使用随机数的好处是:即使你有很多相似的名字,这也能很快解决冲突。

于 2010-10-28T19:49:00.180 回答