2011-04-30 2 views
3

본인의 의도는 리소스 (Dinamically generated PDF)를 제공하는 ResourceRequest를 처리하는 데 있습니다. 이 파일을 잘못 생성하면 포틀릿에 실패 메시지가있는 전체 포털이 렌더링되어야합니다.포틀릿 : 전체 포털을 표시하기 위해 ResourceRequest를 전달하십시오.

전체 포털을 렌더링하는 요청에 ResourceRequest를 전달할 수 있습니까? 나는 또한 리다이렉트를 고려하고 있지만, 나는 어떤 속성들/매개 변수들을 함께 전달할 수 있기를 원할 것이다.

내가 내 문제를 충분히 설명했으면 좋겠다. 고맙습니다.

관련/중복 : How to make the ResourceResponse to forward the request to error page in liferay portlet

이 작동 내가 달성하고자하는 것과 유사한 무언가를 예입니다. 저는 Liferay의 유틸리티 클래스 SessionErrors을 사용합니다 : serveResource()은 세션에 객체를 저장하고 렌더 URL로 리다이렉션을합니다. doView() 메서드는 후속 요청 중에 호출되며 세션에 저장된 내용을 읽을 수 있습니다.

import com.liferay.portal.kernel.servlet.SessionErrors; 
import javax.portlet.GenericPortlet; 
import javax.portlet.RenderRequest; 
import javax.portlet.RenderResponse; 
import javax.portlet.ResourceRequest; 
import javax.portlet.ResourceResponse; 
import javax.portlet.PortletException; 
import javax.portlet.PortletException; 
import javax.portlet.PortletRequestDispatcher; 

public class ResourceRequestForwardPortlet extends GenericPortlet { 

    public void serveResource(ResourceRequest request, ResourceResponse response) 
     throws PortletException, IOException { 

     SessionErrors.add(resourceRequest, "resourcerequest.error", "ERROR " + errorText); 

     resourceResponse.setProperty(ResourceResponse.HTTP_STATUS_CODE, "302"); 
     resourceResponse.addProperty("Location", resourceResponse.createRenderURL().toString()); 
    } 

    public void doView(RenderRequest renderRequest, RenderResponse renderResponse) 
     throws IOException, PortletException { 

     String error = (String)SessionErrors.get(renderRequest, "resourcerequest.error"); 
     SessionErrors.clear(renderRequest); 

     renderRequest.setAttribute("errorMsg", error); 

     PortletRequestDispatcher portletRequestDispatcher = getPortletContext().getRequestDispatcher("view.jsp"); 
     include(viewTemplate, renderRequest, renderResponse); 
     portletRequestDispatcher.include(renderRequest, renderResponse); 
    } 
} 

달성하고자하는 것은 동일하지만 브라우저가 두 가지 요청을하지 못하도록합니다. 이를 위해 전진을하고 싶습니다. 오류 메시지를 요청 속성으로 써야합니다.

나는 GitHub의이 예제 프로젝트를 업로드 : https://github.com/adrianrm/poc-forward-portlet/tree/master/src/main/java/arm/requestforward

+0

했나 : 전방가 발생했을 때 그 꼭대기에

public class ResourceRequestForwardPortlet extends GenericPortlet { public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException { HttpServletRequest request = PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(portletRequest)); PortletURL renderURL = portletResponse.createRenderURL(); try { request.setAttribute("error", errorText); String forwardURL = renderURL.toString().replace("http://localhost:8080", "");//The generation of the forwardURL could be done nicer RequestDispatcher rd = request.getRequestDispatcher(forwardURL); rd.forward(request, PortalUtil.getHttpServletResponse(portletResponse)); } catch (ServletException e) { throw new PortletException(e); } } } 

가,을 Liferay 콘솔에 경고를 표시

: 아직도, 나는 그것이 포틀릿 사양에 존재하지 않는 기능에 대한 해결 방법이라고 생각 솔루션을 찾을 수 있습니까? –

+0

아무 것도. 우리는 ActionRequest가 전송되는 해결 방법을 사용했으며, 성공하면 표시된 페이지가 Javascript로 다운로드를 트리거한다고 생각합니다. – AdrianRM

+1

'ResourceRequest'는 대부분 아약스와 함께 사용됩니다. 따라서 전체 포털을 새로 고치려면'ResourceRequest'의 일이 아니며, 최선을 다해 포기할 경우 ajax를 통해 포틀릿에 실패 메시지를 표시 할 수 있습니다. 그렇지 않으면 일부 플래그를 반환하여 자바 스크립트를 통해 전체 포털에서 새로 고침을 트리거 할 수 있습니다. –

답변

0

다음은 앞으로 서블릿을 사용하여 작업을 수행하려는 시도이며, 그것을 작동하는 것 같다.

14:33:51,048 WARN [http-apr-8080-exec-112][code_jsp:128] {code="404", msg="/poc-forward-portlet/web/guest/home", uri=/web/guest/home} 
X-Requested-With null 
관련 문제