由於你的小面(JSF視圖)在不同的portlet,您需要執行Inter Portlet Communication (IPC)
。
使用IPC Portlet會話
您可以根據portlet會話的IPC來傳遞你的itemnumber
到messages
門戶。要執行此,在發件人的portlet,獲取會話的portlet如下
PortletSession portletSession = renderRequest.getPortletSession();
portletSession.setAttribute("key", value ,PortletSession.APPLICATION_SCOPE);
而在接收器的portlet
PortletSession portletSession = renderRequest.getPortletSession();
String value = (String) portletSession.getAttribute("key ",PortletSession.APPLICATION_SCOPE);
// Do what ever you want...
在兩個portlet,添加以下屬性在liferay-portlet.xml
文件
private-session-attributes>false</private-session-attributes>
IPC使用公共呈現參數
另一種方式來傳遞你的itemnumber
到messages
的portlet是使用public render parameters
。要做到這一點,你需要定義一個公共呈現參數
<portlet-app ...>
...
<public-render-parameter>
<identifier>identifier</identifier>
<qname xmlns:x="http://namespace.com">x:identifier</qname>
</public-render-parameter>
...
</portlet-app>
而且在都的portlet其聲明如下
<portlet>
...
<supported-public-render-parameter>identifier</supported-public-render-parameter>
...
<portlet>
然後,您可以發送的itemnumber
如下
actionReponse.setRenderParameter("identifier", value);
和檢索它使用事件
最後的方式來傳遞你的itemnumber
renderRequest.getParameter("identifier");
// Do what ever you want...
IPC是使用event
。由於您正在使用JSF
作爲Portlet框架,因此Portlet之間的事件發生完全不同。你必須遵循以下步驟:
1.定義事件
在portlet.xml
文件
<event-definition xmlns:event="http://www.namespace.com">
<qname>identifier</qname>
<value-type>java.lang.String</value-type>
</event-definition>
2.創建一個事件橋處理
創建一個定義事件實施BridgeEventHandler
的課程如下
public class CustomBridgeEventHandler implements BridgeEventHandler {
@Override
public EventNavigationResult handleEvent(FacesContext facesContext, Event event) {
EventNavigationResult eventNavigationResult = null;
// Processing the event will be written here...
return eventNavigationResult;
}
}
3。發件人portlet 在發件人portlet中,您需要在portlet.xml
文件中聲明事件和網橋處理程序。
事件
<portlet>
...
<supported-publishing-event xmlns:event="http://www.namespace.com">
<qname>identifier</qname>
</supported-publishing-event>
...
</portlet>
橋
<portlet>
...
<init-param>
<name>javax.portlet.faces.bridgeEventHandler</name>
<value>com.roufid.tutorials.bridge.CustomBridgeEventHandler</value>
</init-param>
...
</portlet>
火災的事件
public void yourMethod() {
// Getting the faces context.
FacesContext fc = FacesContext.getCurrentInstance();
// Getting the portlet action response.
ActionResponse actionReponse = (ActionResponse) fc.getExternalContext().getResponse();
// Firing the event
QName qName = new QName("http://www.namespace.com ", "identifier");
actionReponse.setEvent(qName, dataYouWantToSend);
}
4.接收器portlet 在接收器portlet中,您需要在portlet.xml
文件中聲明事件和橋處理器。
事件
<portlet>
...
<supported-publishing-event xmlns:event="http://www.namespace.com">
<qname>identifier</qname>
</supported-publishing-event>
...
</portlet>
橋
<portlet>
...
<init-param>
<name>javax.portlet.faces.bridgeEventHandler</name>
<value>com.roufid.tutorials.bridge.CustomBridgeEventHandler</value>
</init-param>
...
</portlet>
過程中的橋樑處理器
public class CustomBridgeEventHandler implements BridgeEventHandler {
@Override
public EventNavigationResult handleEvent(FacesContext facesContext, Event event) {
EventNavigationResult eventNavigationResult = null;
String eventQName = event.getQName().toString();
// Processing the defined event.
if (eventQName.equals("{http://www.namespace.com}identifier")) {
// Getting the event value.
String value = (String) event.getValue();
// Do what ever you want here...
}
return eventNavigationResult;
}
}
事件10
在所有情況下,因爲你的portlet是在不同的戰爭,你需要在portlet-ext.properties
文件添加這個屬性,讓位於不同的Liferay頁面
portlet.public.render.parameter.distribution=layout-set
更多信息portlet之間的IPC和示例
糾正我,如果我不明白你的問題。您有3頁:1-'購買物品'2-'物品細節'和3-'消息'。你想通過保留itemnumber的值來將用戶從'Item detail'重定向到'messages'? –
我有2頁。 '買了物品'(這顯示了細節,但在同一頁上)。和'消息'。顯示所有消息。但如果我從'items'頁面跳轉到'messages'頁面,我想用所選項目中的id初始化篩選器。 – griFlo
在同一個portlet中是否購買了物品和消息? –