无法从Portlet Velocity模板将PortletSession传递给CustomUtil

时间:2012-11-29 23:50:09

标签: liferay liferay-6 liferay-velocity

我已查看Using custom services or liferay services in liferay themes (velocity templates)?

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

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

E.g。

我试图创建以下界面:

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

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

2 个答案:

答案 0 :(得分:1)

您还没有在主题,网页内容模板等中明确说明使用速度模板的位置?

我猜它会是主题,因为你在开头给出了一个链接,描述了如何在主题中使用它们,所以简短的回答是你不能从PortletSessionRenderRequest获得速度模板但不要担心,因为您可以在模板文件中获取HttpSessionHttpServletRequest并使用它,因为它在liferay的init.vm中使用。

因此变量$request适用于HttpRequest而不适用于RenderRequest,因此$request.getSession()代表HttpSession而不是PortletSession

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

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

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的评论)

希望这有帮助

答案 1 :(得分:0)

Liferay论坛上提供了答案(这不是PortletSession,而是HttpSession,但这对我的案例来说还可以):

http://www.liferay.com/web/raymond.auge/blog/-/blogs/6051129(RayAugé的评论日期为11/30/12 9:54 AM)

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

#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

希望这对其他人也有帮助