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

Liferay 无法从Portlet Velocity模板将PortletSession传递给CustomUtil,liferay,liferay-6,liferay-velocity,Liferay,Liferay 6,Liferay Velocity,我查过了 自定义方法也可以正常工作。但我有一些具体的要求 如果您知道如何将PortletSession对象或RenderRequest传递给自定义方法,请告诉我 例如 我已尝试创建以下界面: package com.myTool; import javax.portlet.PortletSession; import javax.portlet.RenderRequest; public interface MyTest{ public String getUserCountry(Po

我查过了

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

如果您知道如何将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";
        }

    };
我尝试过以下方法,但没有成功:

(一)

(二)

(三)

(四)


另外,请不要说“您为什么需要它?”-只需提供有关如何发送PortletSession或可从中检索PortletSession的任何对象的想法。谢谢

您没有清楚地说明您在哪里使用velocity模板-在主题、web内容模板等中

我猜这应该是主题,因为你在开始时提供了一个链接,描述了如何在主题中使用它们,因此,简单的回答是,您无法从velocity模板中获取
PortletSession
RenderRequest
,但不要担心,因为您可以在模板文件中获取
HttpSession
HttpServletRequest
,并像在liferay中使用一样使用它

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

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

无论如何,但是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))
我已经尝试过了,但是您可以尝试从
HttpServletRequest
获取
RenderRequest

RenderRequest renderRequest = (RenderRequest) request.getAttribute(JavaConstants.JAVAX_PORTLET_REQUEST);
并通过以下方式作出回应:

RenderResponse renderResponse = (RenderResponse) request.getAttribute(JavaConstants.JAVAX_PORTLET_RESPONSE);
注意:
$request
变量也可以在web内容模板中找到(OP的评论)


希望这对您有所帮助

您还没有明确说明您在哪里使用velocity模板-在主题、web内容模板等中

我猜这应该是主题,因为你在开始时提供了一个链接,描述了如何在主题中使用它们,因此,简单的回答是,您无法从velocity模板中获取
PortletSession
RenderRequest
,但不要担心,因为您可以在模板文件中获取
HttpSession
HttpServletRequest
,并像在liferay中使用一样使用它

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

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

无论如何,但是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))
我已经尝试过了,但是您可以尝试从
HttpServletRequest
获取
RenderRequest

RenderRequest renderRequest = (RenderRequest) request.getAttribute(JavaConstants.JAVAX_PORTLET_REQUEST);
并通过以下方式作出回应:

RenderResponse renderResponse = (RenderResponse) request.getAttribute(JavaConstants.JAVAX_PORTLET_RESPONSE);
注意:
$request
变量也可以在web内容模板中找到(OP的评论)


希望这有帮助

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

(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

希望这也能帮助其他人

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

(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

希望这也能帮助其他人

谢谢你的建议。今天晚些时候我会试试的。关于使用地点-我在web内容模板中使用它,尽管我希望它不会成为问题,因为$request变量也在那里可用。不幸的是,这不适用于web内容中的VM模板。谢谢您的建议。今天晚些时候我会试试的。关于使用地点-我在web内容模板中使用它,但我希望这不会成为问题,因为$request变量也在那里可用。不幸的是,这不适用于web内容中的VM模板。