Состояние сеанса в Websphere Commerce сохраняется в бизнес-контексте, который привязан к пользовательскому ActivityToken.
Состояние сеанса сериализуется в базе данных и будет доступно, если сеанс пользователя переходит на другой сервер в кластере.
Вы можете добавить свое собственное состояние сеанса, зарегистрировав новый элемент контекста в BusinessContext.xml в файле WC\xml\config\BusinessContext.xml, например:
<BusinessContext ctxId="MyContext"
factoryClassname="com.ibm.commerce.context.factory.SimpleBusinessContextFactory" >
<parameter name="spiClassname" value="com.myorg.commerce.context.contentimpl.MyContextImpl" />
Then you need to tell which kinds of sessions your Context will be present in
<!-- 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);
}
И открытый класс реализации MyContextImpl расширяет AbstractContextImpl, реализует 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}
person
Soraz
schedule
06.05.2015