Простой эксперимент позволит нам увидеть разницу между корневым и некорневыми 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.
Выход - использовать параметры.
Комментариев нет :
Отправить комментарий