2016-09-01 8 views
1

私は、次の概念に出くわしたときに、いくつかのポートレットのチュートリアルをチェックしていた:により分離されたアクションとレンダリングモデルにリクエスト属性がアクションからポートレットでのレンダリングに伝播されないのはなぜですか?

、アクション要求属性がに含まれているビューコンポーネントのいずれにも使用できません

public class DateTimePortlet extends GenericPortlet { 

public void doView(RenderRequest req, RenderResponse res) throws IOException, PortletException {   
    Object actionAttribute = req.getAttribute("datetime"); 
    res.getWriter().println("Date Time:" + (actionAttribute != null ? actionAttribute :"Unavailable")); 
    res.getWriter().close(); 
} 

public void processAction(ActionRequest req, ActionResponse res) throws PortletException { 
    req.setAttribute("datetime",new Date()); 
}   
} 

そして、なぜこれが起こっている実際に私は理解していない....です:相(JSP、サーブレットなど)

と述べたコードは以下の通りであったレンダリングレンダリングメソッドは常にアクションメソッドの後に呼び出されませんか? ....彼らは同じ範囲で実行されますか?

答えて

2

要求の属性は、要求自体にのみ関係します。あなたがフェーズをレンダリングするアクションフェイズからの情報を渡したい場合は、このメソッドを何度も呼び出すことができます。

actionResponse.setRenderParameter("parameter-key","value"); 

とRenderPhaseで後にあなたが情報を得ることができます。

renderRequest.getParameter("parameter-key"); 

他があります。リクエストセッションを使用するか、Liferay Portlet Preferencesを使用するかのように、これを行う方法。

actionRequest.getPortletSession().setAttribute("session-key",value); 
actionRequest.getPreferences().setValue("preferences-key","value"); 

と後:?たとえば

renderRequest.getPortletSession().getAttribute("session-key"); 
renderRequest.getPreferences().getValue("preferences-key","default-value"); 
+0

ので、レンダリングや行動のそれぞれが異なる要求を持って、それが転送または派遣、同じ要求ではありませんか? –

+1

Liferayは、MVCPortletクラスを介してポートレット仕様に便利な拡張を提供し、すべてのアクションパラメータをレンダリングパラメータとして直接コピーします。あなたは、あなたのportlet.xmlで以下のinit-のparamを設定することでこれを実現することができます ' コピーリクエストパラメータ ' –

+1

をレンダリングし、アクション要求は全く異なる要求と相です。詳細は、https://dev.liferay.com/develop/tutorials--/knowledge_base/6-1/understanding-the-two-phases-of-portlet-executionを参照してください。 – atrujillofalcon

関連する問題