2012-06-01 32 views
2

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

请求工作正常:

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

但会议为空:

PortletSession session = request.getPortletSession(false); 

如果把这个代码的Liferay-portlet.xml文件工作正常,但我不能这样做IPC:Inter Portlet通信

<!-- 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")); 

但空

+0

我不做Portlet,但不应该将'true'作为* create *参数传递吗? 'getPortletSession(真)'。这在逻辑上会更有意义。 – BalusC

+0

BalusC with true,not works –

+0

你在哪里设置属性?请提供该片段。 –

回答

2

我解决我的问题Liferay的配置,portlet.xml中

1)我改变了的Liferay-portlet.xml的只有:

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

2)在Java 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); 
2

有2个选项:

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> 

2)使用HttpSession代替PortletSession,以获得HttpSession,请使用PortalUtil.getHttpServletRequest(portletRequest)和来自HttpServletRequest,获得HttpSession中。

希望这会有所帮助。

感谢

+0

当我想要获得会话属性时,这是空的,使用HttpSession而不是PortletSession –

+0

只有在http会话中设置,才能从HttpSession获取属性。你有没有尝试选项1? –

+0

没关系 –

1

克里斯蒂的第二个选项为我工作。当我设置

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

它导致我的portlet部署失败。解析xml文件时发生错误。

我不知道为什么。 Liferay Version 6.1.1

5

重新排序它将工作!

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