2014-06-11 2 views
0

Liferay에서 스프링 포틀릿 리다이렉트 및 JSP 렌더링 문제가 발생했습니다.스프링 포틀릿 MVC sentRedirect 및 setRenderParameter

나는 두 개의 JSP를 defaultView.jsp 및 second.jsp으로하는 Liferay PAGE1페이지 2 한 스프링 MVC 포틀릿 portletA에 두 페이지가 있습니다.

page1 및 page2는 모두 portletA를 인스턴스화합니다.

portletA는 @RenderMapping() 메소드를 호출하여 defaultView.jsp를 기본적으로로드합니다.

DefaultViewController 다음을 Liferay 페이지 2는 HTTP 호출 할 수 defaultView.jsp에서

@RenderMapping 
public String renderDefaultView() { 
    return "defaultView"; 
} 

리디렉션 (@ActionMapping resp.sendRedirect())

defaultView.jsp :

$(nRow).click(function() { 
     window.location.href = "<portlet:actionURL name='doGotoPage2' />" 
}); 

DefaultViewController : 나는 어떻게 portletA가 PAGE1에서 리디렉션 후 페이지 2의 다른 @RenderMapping 메서드를 호출 말할 수

을 궁금

이제
@ActionMapping("doGotoPage2") 
public void doGoToMedicalAid(ActionRequest req, 
     ActionResponse resp) { 

    try { 
     resp.sendRedirect("/group/project/page2"); 
    } catch (IOException ex) { 
     Logger.getLogger(DefaultViewController.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

? 지금까지 내가 이해

@RenderMapping(value = "renderSecondPage") 
public String renderSecondPage() { 
    return "second"; 
} 

을, 나는 전이나 sendRedirect을 한 후 작업 단계에서 renderParameters을 설정할 수 없습니다 :

나는 페이지 2에 second.jsp을 렌더링하는 portletA 싶습니다!

예를 들어,이 작동하지 않습니다와 java.lang.IllegalStateException 결과 : 매개 변수를 렌더링 설정 이미

resp.sendRedirect("/group/project/page2"); 
resp.setRenderParameter("render", "renderSecondPage"); 

감사를 호출 된 당신의 도움을 많이!

답변

1

Portlet API docs 상태 즉 :

대해 sendRedirect 메소드가 호출 된 ActionResponse의 인터페이스 다음 방법 후에 호출 될 수

  • setPortletMode
  • setWindowState
  • setRenderParameter
  • setRenderPara 미터

속성을 저장하려면 다른 범위를 사용해야합니다.

+0

작업 범위에서 리디렉션을 수행하고 렌더링 속성을 PortletSession에 저장하여이 문제를 해결할 수있었습니다. 아직도 그것을하는 제일 방법 같이 느끼지 않으며 그러나 지금 일한다 :) 너의 도움을 위해 감사하십시오! – Pascal

1

http://www.opensource-techblog.com/2012/12/multiple-render-method-in-liferay-mvc.html

은 위의 링크에 모습을 가지고 있습니까. 여기에 다른 jsp가 렌더링되는 동작 방법을 기준으로합니다.

+0

도움과 링크를 보내 주셔서 감사합니다. 그것은 다른 liferay 페이지로 방향 전환을 처리하지 않기 때문에 제 문제에 대한 해결책은 아닙니다. 그러나 다른 JSP를 렌더링하는 좋은 예입니다. 다른 범위를 사용하여 내 문제를 해결할 수있었습니다 (Steve의 답변 참조). – Pascal

1

두 번째 페이지에서 포틀릿의 URL을 준비해야합니다. liferay에서 다른 liferay 페이지에 배치 된 포틀릿의 렌더링 URL을 생성하여 가능합니다.

PortletURL renderUrl = PortletURLFactoryUtil.create(request, <<Portlet Id on aonther page>>, <<LayoutId of another page>>,PortletRequest.RENDER_PHASE); 
renderUrl.setWindowState(LiferayWindowState.NORMAL); 
renderUrl.setPortletMode(LiferayPortletMode.VIEW); 
renderUrl.setParameter("action", "<<name of action attribute set for render method>>"); 

설명 : -

  • PortletURLFactoryUtil는 포틀릿 URL을 생성하는 데 사용됩니다. 우리는 요청 (portletRequest), 다른 페이지에 배치 된 portletId, 다른 페이지의 레이아웃 ID 및 단계 (현재 렌더링 메소드를 호출하려는 이후 렌더링)를 전달해야합니다.

봄 MVC 포틀릿에서 여러 가지 렌더링 방법을 사용할 수 있습니다. 기본 렌더링 메서드는 다른 모든 개체가있는 동안 작업 특성을 갖지 않습니다.