вівторок, 24 листопада 2009 р.

Spring Portlet MVC

при работе со Spring MVC в портально-портлетном окружении следует учитывать еще и таки не очевидные и нигде отдельно не задокументированные вещи
жизненный цикл портлетных обращений к серверу состоит из одной или двух фаз, в зависимости от того, произошли какие-то действия или нет.

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