1

状況:
ローカリゼーションをサポートする JCR ベースのブログ エンジンを実装しているとします。
コンテンツ構造は次のようになります/blogname/content/[ノード名]

問題:次の要件を満たすために 、コンテンツ ノード (/blogname/content/ [nodename] ) に名前を付ける最良の方法は何ですか?

  1. URL のような REST をサポートするには、ノード名を HTML で使用できる必要があります。つまり、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. については、答えは簡単です。ノード名に表示したい文字を使用するだけです。URIなどの制限された文字セットに対して、入力文字列 (ブログ投稿のタイトルなど) をエスケープします。

たとえば、スペース (JCR ノード名には許可されていますが%20、URL で醜いものを生成します) や、URL でエンコードする必要があるその他の文字を許可しないでください。これらの文字を削除するか、単純にアンダースコアに置き換えることができます。これはほとんどの場合、見栄えがよいためです。

一意の名前 (4.) については、現在時刻を含めることができます。ミリ秒単位で入力するか、衝突を明示的にチェックします。最初の例は少し見栄えが悪いかもしれませんが、ブログのシナリオではおそらく失敗することはありません。後者は、そのような名前のノードがすでに存在する場合にスローされた例外に反応し、eg. インクリメント カウンターを使用して再試行します (例: my_great_post1my_great_post2など)。親ノードをロックして、1 つのセッションだけが実際に同時にノードを追加できるようにすることもできます。

注: //content[@node_name=some-name]は有効な JCR Xpath クエリではありません。あなたはおそらく/jcr:root/content//some-nameそのために使いたいでしょう。

于 2009-08-31T17:53:43.990 に答える
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 に答える
0

項目 3 について。最近、xpath クエリでは項目を数字で開始できないことを知りました。ノード名が数字で始まる場合でも、名前の最初のバイトをエスケープすることでクエリを実行できますが、すべてのノード名を文字で始めると、クエリがより簡単になります。

(プロパティ名についてはよくわかりません。文字で始まらないものを見たことがありません。)

于 2009-05-28T05:12:14.220 に答える