了解Action Phase和Render Phase的执行

Paw*_*wan 0 portlet liferay

我正在使用Liferay 6进行门户开发.

通过Liferay开发人员指南,作者解释了Portlet执行有两个阶段

  1. 行动阶段
  2. 渲染阶段
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().println("<BR/>");
        PortletURL u = res.createActionURL();
        res.getWriter().println("<A href=" + u + ">Trigger an action.");
        res.getWriter().close();
    }

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

我的理解是该doView方法被称为" 渲染阶段 ",该processAction方法被称为" 动作阶段 ".

如果页面上显示5个portlet,doView则会为每个页面刷新执行"渲染阶段"(即" 方法"中的代码).

如果我是对的,请告诉我.

Ola*_*ock 7

是的,正确的:有最大值.1个portlet处理每个请求的一个动作,但是页面上的所有portlet都会有一个渲染请求在运行(除非输出被缓存,但是让我们放弃这个相当高级的东西)

在完成渲染时,对请求也可以有0个动作处理(这是通常在portlet上执行的最常见操作.在这个阶段你必须(并且可以)不改变任何状态.).

在Action之后,可以触发事件阶段(参见Portlet-Communication,IPC),可以在任意数量的Portlet上执行.

如果你不想重新加载整个页面,你就必须考虑资源相在那里你可以处理AJAX调用和服务于各种比一个portlet是为了服务于通常的页面片段等不同的资源.