我已查看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的任何对象的任何想法。感谢
答案 0 :(得分:1)
您还没有在主题,网页内容模板等中明确说明使用速度模板的位置?
我猜它会是主题,因为你在开头给出了一个链接,描述了如何在主题中使用它们,所以简短的回答是你不能从PortletSession
和RenderRequest
获得速度模板但不要担心,因为您可以在模板文件中获取HttpSession
和HttpServletRequest
并使用它,因为它在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
希望这对其他人也有帮助