我想在一個portlet實例的所有用戶之間共享bean,但我不知道如何。如何在Portlet實例的所有用戶之間共享數據?
我正在研究一個(Liferay)portlet,它將有許多對此portlet實例的每個用戶有用的數據:在被放置在頁面上後,portlet將從DB中獲取取決於其偏好的數據。我希望此portlet將此數據存儲在RAM中,而不是在首選項中以避免從/到字符串轉換。
我知道我可以將它存儲在會話中,但這會爲每個查看portlet的用戶創建一份數據副本。結果:因爲這個,我可能在RAM中有大量的數據。 我無法使用上下文(或我的Portlet類中的局部變量),因爲數據將在Portlet的所有實例之間共享,並且我希望它是特定於實例的。
事實上,我希望它的工作方式與portlet的首選項相似,但其他bean不是Strings。
這裏是我想什麼(話說我的Portlet顯示的內容列表,就像資源發佈)的例子:
- 在一個頁面上,我會放2次的portlet:一個顯示所有的事件,另一個顯示所有的博客條目
- 被設置首選項後,portlet的每個實例都將獲得內容的列表,並且將其存儲在RAM
- 當用戶訪問該頁面時,列表將使用每個Portlet實例的內容
- 當另一個用戶訪問同一頁面,將使用相同的列表(由「同一名單」,我的意思是列表的同一個實例,對於爲例)
這裏Portlet類的代碼示例:
package com.test;
import com.liferay.portlet.asset.model.AssetEntry;
import com.liferay.util.bridges.mvc.MVCPortlet;
import java.io.IOException;
import java.util.List;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
/**
* Portlet implementation class NewPortlet
*/
public class NewPortlet extends MVCPortlet {
@Override
public void doView(RenderRequest renderRequest,
RenderResponse renderResponse) throws IOException, PortletException {
List<AssetEntry> entries = null;
/*HERE : Get the entries from RAM (session/context/...)*/
renderRequest.setAttribute("entries", entries);
super.doView(renderRequest, renderResponse);
}
/*HERE : The methods containing code for preferences, setting "entries" to RAM, etc...*/
}
有誰知道如何去做,或者如果它不可能?
你對RAM存儲器有什麼意義?把你的代碼放到問題中。 – Mark
通過RAM,我的意思是Randow訪問存儲器(不是ROM,所以不是用HD寫的)。 OK for Code,我會嘗試一個例子(我還沒有代碼,因爲如果沒有這個問題的解決方案,我就無法開始編碼)。 – pierreonthenet
我可能已經找到了解決方案:使用上下文並在屬性名稱中包含portlet名稱空間。 它看起來像這樣: entries = context.getAttribute(renderResponse.getNamesSpace()+「entries」); 您對此有何看法? – pierreonthenet