1

我已经检查了在 liferay 主题(速度模板)中使用自定义服务或 liferay 服务?

和自定义方法工作正常。但我有一些具体要求。

如果您知道如何将 PortletSession 对象或 RenderRequest 传递给自定义方法,请告诉我。

例如

我试图创建以下界面:

package com.myTool;


import javax.portlet.PortletSession;
import javax.portlet.RenderRequest;

public interface MyTest{
  public String getUserCountry(PortletSession portletSession);
  public String getUserCountry(RenderRequest request);
}

在实现接口的类中,我有以下方法:

public String getUserCountry(PortletSession portletSession) {
        try {
            myUtil.setPortletSession(portletSession);
            return "Success";
        }
        catch (Exception e) {
            e.printStackTrace();
            return "exception-portletSession";
        }

    };

    public String getUserCountry(RenderRequest request) {
        try {
            myUtil.setPortletSession(request.getPortletSession());
            return "Success request";
        }
        catch (Exception e) {
            e.printStackTrace();
            return "exception-renderRequest";
        }

    };

我尝试了以下方法但没有运气:

1)

#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($request.getAttribute("javax.portlet.response")))
$result

2)

#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($request.get("portlet-session")))
$result

3)

#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($request.getSession()))
$result

4)

#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($request.getSession()))
$result

PS请不要说“你为什么需要这个?” - 只需提供有关如何发送 PortletSession 或可以从中检索 PortletSession 的任何对象的任何想法。谢谢

4

2 回答 2

1

您还没有清楚地说明,您在哪里使用速度模板 - 在主题、网络内容模板等中?

我猜这将是主题,因为您在开始时提供了一个链接,描述了如何在主题中使用它们,所以简短的回答是您无法从速度模板中获取PortletSessionRenderRequest,但不要担心,因为您可以获得HttpSessionHttpServletRequest在模板文件中使用它,就像在 liferay 的init.vm.

所以变量$request是 forHttpRequest和 is not for RenderRequest,因此$request.getSession()给出HttpSession和 not PortletSession

我认为您无法以速度获得特定于 portlet 的请求和会话的原因可能是因为模板与 portlet 无关,因此无法知道您在询问哪个 portlet request

无论如何,但是 portlet 请求中可能存在的所有属性或参数都存在于 中HttpServletRequest,所以我想您需要将方法签名更改为:

public interface MyTest{
    public String getUserCountry(HttpSession portletSession);
    public String getUserCountry(HttpServletRequest request);
}

然后使用:

#set($result = $currentProfileUtil.getUserCountry($request.getSession()))
#set($result = $currentProfileUtil.getUserCountry($request))

我已经尝试过了,但您可以尝试RenderRequest从以下位置获取HttpServletRequest

RenderRequest renderRequest = (RenderRequest) request.getAttribute(JavaConstants.JAVAX_PORTLET_REQUEST);

并通过以下方式回应:

RenderResponse renderResponse = (RenderResponse) request.getAttribute(JavaConstants.JAVAX_PORTLET_RESPONSE);

注意:$request变量也可用于网络内容模板(OP 的评论)

希望这可以帮助

于 2012-11-30T13:49:30.440 回答
0

Liferay 论坛上提供了答案(这不是 PortletSession 而是 HttpSession,但这对我来说没问题):

http://www.liferay.com/web/raymond.auge/blog/-/blogs/6051129(Ray Augé 于 2012 年 11 月 30 日上午 9:54 发表评论)

就我而言(来自原始问题),解决方案如下:

#set($serviceContext = $portal.getClass().forName("com.liferay.portal.service.ServiceContextThreadLocal").getServiceContext())
#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($serviceContext.getSession()))
$result

希望这也能帮助其他人

于 2012-12-01T21:35:44.687 回答