2

IBM WCS でスクリプトレットを使用して jsp でセッションを設定し、ここで値を設定していますが、ページをリロードするとセッション値が失われます。

これがセッション属性の設定方法です

<%
session.setAttribute("testMap", testValue);
%>

ただし、私のローカルツールキットでは正常に動作しますが、この問題が発生しているサーバーに展開すると

これに関する解決策を提案してください

ありがとうアンキット

4

2 に答える 2

2

Websphere Commerce のセッション状態は、ユーザーの ActivityToken に関連付けられているビジネス コンテキストに保存されます。

セッション状態はデータベースにシリアル化され、ユーザー セッションがクラスター内の別のサーバーに移動した場合に使用できます。

次のように、WC\xml\config\BusinessContext.xml の BusinessContext.xml に新しいコンテキスト要素を登録することで、独自のセッション状態を追加できます。

 <BusinessContext ctxId="MyContext"
               factoryClassname="com.ibm.commerce.context.factory.SimpleBusinessContextFactory" >
<parameter name="spiClassname" value="com.myorg.commerce.context.contentimpl.MyContextImpl" />

次に、コンテキストが存在するセッションの種類を伝える必要があります

<!-- web site store front configuration -->
<InitialBusinessContextSet ctxSetId="Store" >
    ...
  <InitialBusinessContext ctxId="MyContext" createOrder="0" />

コンテキストは、他のすべてのコンテキストとともに作成され、CTXDATA データベース テーブル (既知のユーザーの場合) と、匿名ユーザーのブラウザー Cookie のいずれかにシリアル化されます。

コンテキスト クラスは次のようになります。

インターフェース クラス com.myorg.commerce.context.mycontextimpl.MyContext

public abstract interface MyContext extends Context
{
   public static final String CONTEXT_NAME =     "com.myorg.commerce.context.mycontextimpl.MyContext";
   public abstract String getSomeValue();
   public abstract void setSomeValue(String v);
}

そして実装 public class MyContextImpl extends AbstractContextImpl implement MyContext { }

新しい値を設定した後、「this.setDirty(true)」を使用して永続化の変更にフラグを立てます。

シリアル化する必要があるコンテキストの値を返すように getContextAttributes をオーバーライドし、値を再確立するために setContextAttributes もオーバーライドする必要があります。

ポイントは、コンテキストが単に値を格納する以上のことを行うということです。不変条件をコンテキストに配置します。これは、ユーザーとサイトとのやり取りのすべての側面に当てはまります。最良の例は EntitlementContext です。これは、購入する契約を保持しますが、計算がかなり複雑になる可能性があります。

とにかく、コマンドからコンテキストにアクセスするには、次を使用します

this.getCommandContext().getContext(MyContext.CONTEXT_NAME);

そしてjspから

if (request.getAttribute("myContext") == null) {
    request.setAttribute("myContext", ((CommandContext) request.getAttribute("CommandContext")).getContext(MyContext.CONTEXT_NAME));
}

その後、 ${myContext.someValue} として使用できます

于 2015-05-06T20:51:17.647 に答える