Простой эксперимент позволит нам увидеть разницу между корневым и некорневыми Application Modules (AM).
Eсть страница PagePG, связанная с RootAM. На странице есть регион RegionRN, связанный с ChildAM. С RegionRN мы переходим на страницу RegPagePG и хотим сохранить состояние ChildAM.
Часть кода контроллера RegionRN. Перед переходом на страницу RegPagePG мы создаем запись в ExampleVO (метод createPersonSingleRecord), чтобы удостовериться, что состояние AM сохраняется.
Почему?
Дело в том, что retainAM сохраняет состояние корневого AM. В нашем примере это RootAM. Корневой AM принципиально отличается от некорневых; при его инициализации выполняется масса внутренней работы, как то: инициализация ID транзакции, инициализация контекста страницы, ряд других внутренних переменных. Некорневые модули этого не делают и по сути служат контейнерами для VO и VL.
Выход - использовать параметры.
Eсть страница PagePG, связанная с RootAM. На странице есть регион RegionRN, связанный с ChildAM. С RegionRN мы переходим на страницу RegPagePG и хотим сохранить состояние ChildAM.
Часть кода контроллера RegionRN. Перед переходом на страницу RegPagePG мы создаем запись в ExampleVO (метод createPersonSingleRecord), чтобы удостовериться, что состояние AM сохраняется.
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
super.processFormRequest(pageContext, webBean);
if (pageContext.getParameter("btnAdd") != null){
OAApplicationModule am = pageContext.getApplicationModule(webBean);
am.invokeMethod("createPersonSingleRecord");
pageContext.setForwardURL("OA.jsp?page=/oracle/.../RegPagePG",
null,
OAWebBeanConstants.KEEP_MENU_CONTEXT,
null,
null,
true, // Retain AM
OAWebBeanConstants.ADD_BREAD_CRUMB_YES,
OAWebBeanConstants.IGNORE_MESSAGES);
}
}
Часть кода контроллера RegPagePG. checkCnt возвращает количество записей в ExampleVO.public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{
super.processRequest(pageContext, webBean);
OAApplicationModule am = pageContext.getApplicationModule(webBean);
Number c = new Number((Number)am.invokeMethod("checkCnt"));
}
Получим с = 0.Почему?
Дело в том, что retainAM сохраняет состояние корневого AM. В нашем примере это RootAM. Корневой AM принципиально отличается от некорневых; при его инициализации выполняется масса внутренней работы, как то: инициализация ID транзакции, инициализация контекста страницы, ряд других внутренних переменных. Некорневые модули этого не делают и по сути служат контейнерами для VO и VL.
Выход - использовать параметры.
Комментариев нет :
Отправить комментарий