Liferay 无法从Portlet Velocity模板将PortletSession传递给CustomUtil
我查过了 自定义方法也可以正常工作。但我有一些具体的要求 如果您知道如何将PortletSession对象或RenderRequest传递给自定义方法,请告诉我 例如 我已尝试创建以下界面: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
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模板。