1

コンテナーに複数回追加できる JSR-168 ポートレットを作成しています。各コンテナ (Liferay、JBoss など) には、同じポートレットの複数のインスタンスを区別する独自の内部方法があります。

doView()ただし、ポートレット インスタンスをメソッド内で一意に識別したいと考えています。

ポートレットのインスタンスごとに異なる一意の識別子を取得する標準の JSR-168 メカニズムはありますか? 私は、人々が一意の ID をランダムに 生成してセッションに保存するさまざまなソリューションを見てきましたが、標準的なメカニズムが存在する場合はそれを好みます。

4

3 に答える 3

3

ポートレット1.0(168)は、RenderResponse.getNamespace()メソッドを提供します。このメソッドは、ポートレットインスタンスごとに一意である必要があります。

仕様から:PLT.12.3.4名前空間エンコーディング

getNamespaceメソッドは、ポータルページ全体で返された文字列の一意性を保証するメカニズムをポートレットに提供する必要があります。たとえば、getNamespaceメソッドは、ポートレットによって生成されたコンテンツ内のJavaScript変数名の前に付けることができる一意の文字列を返し、ページ全体で5つの一意性を確保します。getNamespaceメソッドは、レンダリングリクエスト内で複数回呼び出された場合、同じ値を返す必要があります。

processActionでアクセスする場合は、セッションに保存するか、actionURLパラメーターとして保存することをお勧めします。

アップグレードがオプションの場合、Portlet 2.0(286)は、基礎となるPortletResponseインターフェイスを変更してgetNamespace()メソッドを提供し、 PortletRequest.getWindowID()メソッドも追加します。

于 2008-12-23T12:52:26.297 に答える
0

いいえ、インスタンスの共通 ID はありません。私は自分でポートレット コンテナーを実装しました。パブリック API にはインスタンスごとの ID はありません。原因は、コンテナーに 1 つあるからです。ポートレット セッション ( javax.portlet.PortletRequest#getPortletSession()) は、1 つのポートレット ( のタグによる定義portlet.xml) と 1 人のユーザー ( javax.servlet.http.HttpSession) に対して一意であり、これでは十分ではありません。

したがって、id を生成し (portletl クラスの単純な (同期) カウンターにすることもできます)、ポートレット セッションに格納することが唯一の移植可能な方法です。通常、ポートレット クラス自体はインスタンス間で共有されるため、java.lang.System#identityHashCode(Object x)も役に立ちません。

なぜあなたはそれが必要なのですか?

于 2008-12-23T08:41:38.160 に答える
0

Ame のようにこの一意の ID が存在しないようで驚きました。インスタンス ID は、コンテナーが提供するものではなく、独自のデータベースにすべてのポートレット設定を格納するために使用できます。これを独自に保存する必要がある理由の 1 つは、コンテナーによって提供される設定がロケール固有の設定をサポートしていないことです。

つまり、1 つのポートレット インスタンスがロケールごとに異なるプリファレンスを持つ場合があります。

ニーズに合わせてLiferayを使用しようとしています。

于 2010-11-12T17:55:20.020 に答える