жизненный цикл портлетных обращений к серверу состоит из одной или двух фаз, в зависимости от того, произошли какие-то действия или нет.
a) в простейшем случае это просто RenderRequest, который на стороне контроллера обрабатывается методом processRenderRequest
б) в случае, если произошел сабмит формы или просто был вызван ActionRequest, то сначала отработает метод onSubmitAction, а потом будет сформирован RenderRequest и выполненн метод processRenderRequest
казалось бы все просто и довольно прозрачно, и Spring предоставляет возможность указывать, какие именно параметры сохранять в конце onSubmitAction, для их использования в RenderRequest. но тут нас поджидает ряд сюпризов
- параметры, перечисленные в свойстве контроллера setRenderParameters из ActionRequest не копируются. во всяком случае базовое поведение контроллера именно таково
- метод формирования объекта команды fromBackingObject вызывается только в двух случаях -- при сабмите формы и при начальном открытии формы, если указано свойство bindOnNewForm=true. в случае RenderRequest данный метод игнорируется полностью
- с сабмитом формы тоже не все просто. по мере вызова методов от processActionRequest до showForm параметры запроса несколько раз валидируются, сравниваются с существующими и перекладываются из одного формата в другой. если по мере выполнения функционала окажется, что параметры запроса совпадают с сохраненными в контроллере, метод onSubmitRender может быть проигнорирован. равно как будет проигнорирован вызов метода formBackingObject в случае принудительного программного редиректа с одного контроллера на другой
- в том случае, если необходимо сделать принудительный программный редирект к начальному состоянию портлета, единственный способ это сделать -- установить параметр action RenderRequest в пустое значение или значение, соотвествующее начальному состоянию портлета. определить параметры successView и redirectAction контроллера не достаточно -- в этом случае сохраняется состояние портлета, в котором он находился на момент сабмита ActionRequest
- в портлетной инкарнации Spring MVC объект сессионной формы всегда удаляется из сессии после второго обращения к нему. иначе говоря
а) объект попадает в сессию после создания и заполнения параметрами
б) контроллер проверяет, имеет ли место быть сохраненный объект и если да, то считывает и удаляет
в) если зарегистрованно еще одно обращение к объекту формы, то конроллер положит обновленный объект обратно
таким образом не стоит переживать насчет заполнения сессии мертвыми объектами или фиксации их состояния