Liferay 如何在portlet的操作阶段创建RenderURL?

Liferay 如何在portlet的操作阶段创建RenderURL?,liferay,portlet,liferay-6,Liferay,Portlet,Liferay 6,在方法processAction(ActionRequest请求,ActionResponse响应)中,我将一条记录插入数据库并获取ID,然后 我想重定向到此记录的查看页面。因此,我需要创建一个带有该ID参数值的RenderURL ActionResponse不提供创建renderURL的方法。Liferay中的某些代码执行类似的操作,如: 在访问actionURL 将renderURL作为actionURL中的参数传递 但是,当时我不知道ID的值 其他代码也直接使用new PortletURL

在方法
processAction(ActionRequest请求,ActionResponse响应)
中,我将一条记录插入数据库并获取
ID
,然后 我想重定向到此记录的查看页面。因此,我需要创建一个带有该ID参数值的
RenderURL

ActionResponse
不提供创建
renderURL
的方法。Liferay中的某些代码执行类似的操作,如:

  • 在访问
    actionURL
  • renderURL
    作为
    actionURL中的参数传递
  • 但是,当时我不知道
    ID
    的值


    其他代码也直接使用
    new PortletURLImpl()
    。我的portlet无法看到该类。

    您可以包含视图页面include(viewTemplate、actionRequest、actionResponse),而不是创建renderURL。或者,如果您想发送任何参数以在doView中获取它,则使用actionResponse.setParameter(名称、值)方法

    其他代码也直接使用新的PortletURLImpl()。我的portlet无法看到该类

    因为这个类在门户impl.jar中,而且不建议使用这个jar中的类。从Liferay 6.1开始,如果类指向
    portal impl.jar
    ,则无法从插件sdk构建portlet

    现在回答你的问题:

    任何jsp都是通过
    render
    方法或方法(如果使用liferay)呈现的,该方法将作为Portlet正常生命周期的一部分被调用

    以下是您需要采取的步骤:

  • 最后在“processAction”方法中设置渲染参数(使用方法),该参数将在渲染方法中可用,如下所示:

    actionResponse.setRenderParameter("myID", 1201);
    
    仅供参考:使用
    setRenderParameter
    后,您不能使用该方法

  • 在获取任何其他请求参数时,在呈现方法中获取此
    “myID”

    //assuming your ID is a long
    long myUserName = ParamUtil.getLong(renderRequest, "myID");
    

  • 之后,只需使用

    include(renderPage, renderRequest, renderResponse);
    
    WARE
    renderPage
    只不过是一个字符串,包含
    docroot
    中jsp的路径,如
    /html/yourportlet/view.jsp

    事后想一想:
    如果您使用的是Liferay IDE,那么您可以尝试使用
    MVCPortlet
    创建一个简单的portlet项目,然后查看生成的
    portlet.xml

  • 所以基本上你需要把信息从动作阶段传递到渲染阶段,这是一个很好的解释细节的地方

    就这样。
    希望这有帮助


    如果您对此有任何疑问,请告诉我。

    我创建了一个带有占位符作为参数值的
    RenderURL
    ,如下所示:

       <portlet:renderURL var="redirect">
          <portlet:param name="ID" value="__ID__" />
       </portlet:renderURL>`
    

    在行动阶段,请执行以下操作:

    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute (WebKeys.THEME_DISPLAY);
    PortletURL url = PortletURLFactoryUtil.create(request, this.getPortletName(), themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
    
    response.sendRedirect("/c/portal/login?redirect=" + HttpUtil.encodeURL(url.toString()));
    
    例如,如果要重定向到登录页面并返回,可以执行以下操作:

    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute (WebKeys.THEME_DISPLAY);
    PortletURL url = PortletURLFactoryUtil.create(request, this.getPortletName(), themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
    
    response.sendRedirect("/c/portal/login?redirect=" + HttpUtil.encodeURL(url.toString()));
    

    当然,您可以根据需要添加或复制参数。

    对不起,我没有说清楚。我想要
    renderURL
    作为重定向URL。如果您不重定向,当您刷新或按地址栏中的enter键时,您将得到错误的页面结果。谢谢您,Prakash。我试过你的方法。actionURL之后,您无法刷新或按地址栏中的enter键。顺便说一句,在某些情况下,
    PortalUtil.copyRequestParameters
    将非常有用。