суббота, 21 сентября 2013 г.

Как работает внутри Spring Web Portlet

Перед нашими контроллерами происходит следующее:
0. Первое с чего все начинается это идет вызов одного из методов FrameworkPortlet (обращение вообщето идет в DispatcherPortlet, который расширяет первый, но реализация методов находится в его родителе), в зависимости от фазы портлетного запроса.
// Delegate action requests to processRequest/doActionService.
void processAction(ActionRequest req, ActionResponse resp){..}
// Delegate render requests to processRequest/doRenderService.
void doDispatch(RenderRequest req, RenderResponse resp){...}
void serveResource(ResourceRequest request, ResourceResponse response){...}
void processEvent(EventRequest request, EventResponse response){...}

но все они делают в нутри одно и тоже
{
   processRequest(req, resp);

}

1. org.springframework.web.portlet.DispatcherPortlet extends FrameworkPortlet
  void processRequest(req, resp) //in FrameworkPortlet

         //Получается фаза жизненного цикла портлетного запроса
         String phase = (String) req.getAttribute(PortletRequest.LIFECYCLE_PHASE);

         //на основании фазы выбирается в условиях подходящий обработчик,
         //что является немного странным для меня - зачем все перенаправлять в один
         // метод, чтобы потом снова разделять? - например
         if (PortletRequest.ACTION_PHASE.equals(phase)) {
   doActionService((ActionRequest) request, (ActionResponse) response);
}


        // в конце метода не зависимо от успеха, запускается событие что портлетный запрос обработан
        this.portletApplicationContext.publishEvent(
new PortletRequestHandledEvent(this,
getPortletConfig().getPortletName(),
                                                                request.getPortletMode().toString(),
(request instanceof ActionRequest ? "action" : "render"),
request.getRequestedSessionId(),
                                                                getUsernameForRequest(request),
processingTime, failureCause));   


2. org.springframework.web.portlet.DispatcherPortlet
    void doActionService(req, resp)
            HandlerExecutionChain mappedHandler; //получает инстанцию НашКлассКонтроллера
            mappedHandler = getHandler(req);

            //определяет что за обработчик у нас, выбирая из двух типов либо контроллер у нас расширяет спринговый контроллер, либо помечен аннотациями
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
     
            //например у нас ha instanceof
            //org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter
            //handleAction потому что у нас фаза Action,
            //который внутри делает то, что вызывает ModelAndView doHandle(req, resp, handler),
            //проверяет чтобы результат обязательно был null потомучто это фаза Action
            ha.handleAction(req, resp, mappedHandler.getHandler());
                          

Комментариев нет:

Отправить комментарий