PortletSession使用JSF Liferay Portlets

时间:2012-06-01 21:14:25

标签: jsf-2 liferay portlet

我正在开发一个JSF 2 Portlet,但我需要获取全局会话变量。

请求可以正常使用:

FacesContext facesContext = FacesContext.getCurrentInstance();
    PortletRequest request = (PortletRequest) facesContext.getExternalContext().getRequest();

但会话为空:

PortletSession session = request.getPortletSession(false);

如果把这段代码放在liferay-portlet.xml文件中工作正常,但我不能做IPC:Inter Portlet Comunication

<!-- Portlet session -->
    <private-request-attributes>false</private-request-attributes>
    <private-session-attributes>false</private-session-attributes>

如何在不使用最后一个代码的情况下获取和设置变量会话?

谢谢

今天我尝试了这个:

FacesContext facesContext = FacesContext.getCurrentInstance(); 
PortletRequest request = (PortletRequest) facesContext.getExternalContext().getRequest(); 
HttpServletRequest httpRequest = PortalUtil.getHttpServletRequest(request); 
HttpSession session = httpRequest.getSession(true); 
System.out.println(session.getAttribute("XXXX"));

但是为空

4 个答案:

答案 0 :(得分:4)

警告:使用<private-session-attributes>false</private-session-attributes>使用Liferay Faces已知to cause memory leaks。使用风险自负!

重新排序它会起作用!

<portlet>
    <portlet-name>distribution</portlet-name>
    <icon>/icon.png</icon>
    <instanceable>false</instanceable>
    <private-session-attributes>false</private-session-attributes>
            ...
            ...
            ...
            ...

答案 1 :(得分:1)

有两个选项:

1)在PortletSession中设置属性时,请使用此方法public void setAttribute(String name,Object value,int scope),其中scope应为PortletSession.APPLICATION_SCOPE

执行此操作时,请将其更改为liferay-portlet.xml

<private-request-attributes>false</private-request-attributes>
<private-session-attributes>false</private-session-attributes>

警告:使用<private-session-attributes>false</private-session-attributes>使用Liferay Faces已知to cause memory leaks。使用风险自负!

2)使用HttpSession代替PortletSession,以获取HttpSession,请使用PortalUtil.getHttpServletRequest(portletRequest),然后从httpServletRequest获取HttpSession。

希望这有帮助。

由于

答案 2 :(得分:1)

警告:使用<private-session-attributes>false</private-session-attributes>使用Liferay Faces已知to cause memory leaks。使用风险自负!

我解决了配置liferay-portlet.xml的问题

1。)我仅使用:

更改了liferay-portlet.xml
<private-session-attributes>false</private-session-attributes>

2.)在Java Class i中创建的方法:

FacesContext facesContext = FacesContext.getCurrentInstance();
PortletRequest request = (PortletRequest) facesContext.getExternalContext().getRequest();
PortletSession session = request.getPortletSession(false);

如果您获得会话属性

session.getAttribute("XXXXXX",PortletSession.APPLICATION_SCOPE);

如果您设置会话属性

session.setAttribute("NAME","VALUE",PortletSession.APPLICATION_SCOPE);

答案 3 :(得分:0)

克里斯蒂的第二个选择对我有用。当我设置

<private-session-attributes>false</private-session-attributes>

导致我的portlet部署失败。解析xml文件时出错。

我不知道为什么。 Liferay版本6.1.1