Liferay portlet首選項(preferences)設置、存儲處理打賞

最近使用Liferay做項目集成,由于團隊人員在之前對Liferay這東西都沒有充分的了解,用起來著實費了不少力氣,最近為了為定制好的portlet添加初始化信息,翻閱了一些文章,下面是了解到的關于初始化信息(首選項)的配置處理機制.在JSR168規范中,允許使用preferences來存儲portlet的一些初始信息,preferences的內容在portlet.xml來設置.而在Liferay中,對preferences加入了數據庫持久化功能,并且可針對company,layout,portlet instance和user的不同組合來定制.

首先來看看在jsp頁面上如何訪問preferences.

/html/portal/render_portlet.jsp - Portlet輸出頁面.

Portlet portlet = (Portlet)request.getAttribute(WebKeys.RENDER_PORTLET);
CachePortlet cachePortlet = PortletInstanceFactory.create(portlet, application);

讀取preferences.

PortletPreferences portletPrefs = PortletPreferencesLocalServiceUtil.getPreferences(
company.getCompanyId(), PortletPreferencesFactory.getPortletPreferencesPK(request, portletId));


創建PortletConfig.

PortletConfig portletConfig = PortletConfigFactory.create(portlet, application);
PortletContext portletCtx = portletConfig.getPortletContext();
HttpServletRequest originalReq = PortalUtil.getOriginalServletRequest(request);

創建RenderRequest.

RenderRequestImpl renderRequestImpl = RenderRequestFactory.create(
originalReq, portlet, cachePortlet, portletCtx, windowState, portletMode, portletPrefs, plid);
StringServletResponse stringServletRes = new StringServletResponse(response);

創建RenderResponse.

RenderResponseImpl renderResponseImpl = RenderResponseFactory.create(
renderRequestImpl, stringServletRes, portletId, company.getCompanyId(), plid);

// setAttribute(WebKeys.JAVAX_PORTLET_CONFIG, portletConfig);
// setAttribute(WebKeys.JAVAX_PORTLET_REQUEST, renderRequestImpl);
// setAttribute(WebKeys.JAVAX_PORTLET_RESPONSE, renderResponseImpl);
renderRequestImpl.defineObjects(portletConfig, renderResponseImpl);

if (portlet.isActive() && access) {
try {
    cachePortlet.render(renderRequestImpl, renderResponseImpl);
}catch (UnavailableException ue) {
    portletException = true;
    PortletInstanceFactory.destroy(portlet);
}
}

PortletPreferencesPK 為preferences的主鍵,它由portletId, layoutId和ownerId三部分標識.

com.liferay.portal.service.impl.PortletPreferencesLocalServiceImpl

// getPreferences.
public javax.portlet.PortletPreferences getPreferences(String companyId, PortletPreferencesPK pk) throws PortalException, SystemException {
// 讀取prefs緩存.
Map prefsPool = PortletPreferencesLocalUtil.getPreferencesPool(pk.ownerId);
PortletPreferencesImpl prefs =(PortletPreferencesImpl)prefsPool.get(pk);

if (prefs == null) {
PortletPreferences portletPreferences = null;
// 讀取portlet.
Portlet portlet = PortletLocalServiceUtil.getPortletById(companyId, pk.portletId);
try {
    // 從數據庫里讀preferences.
    portletPreferences =PortletPreferencesUtil.findByPrimaryKey(pk);
}catch (NoSuchPortletPreferencesException nsppe) {
    portletPreferences = PortletPreferencesUtil.create(pk);
    if (portlet == null) {
    // 設置系統默認的preferences.
    portletPreferences.setPreferences(Portlet.DEFAULT_PREFERENCES);
    }else {
    // 設置portlet.xml中定義的preferences.
    portletPreferences.setPreferences(portlet.getDefaultPreferences());
   }
PortletPreferencesUtil.update(portletPreferences);
}
prefs = PortletPreferencesSerializer.fromXML(companyId, pk, portletPreferences.getPreferences());
prefsPool.put(pk, prefs);
}
return (PortletPreferencesImpl)prefs.clone();
}

上面的代碼首先從緩存中讀取,如沒有則從數據庫讀取,如數據庫中還沒有相應的記錄,則讀取默認值并更新到數據庫中.

PortletPreferencesFactory

另外一個獲取preferences的方式是通過PortletPreferencesFactory,它提供了更方便的獲取preferences的方法.

getPortalPreferences(HttpServletRequest req); // 通過HttpServletRequest獲取.
getPortalPreferences(ActionRequest req); // 通過ActionRequest獲取.
getPortalPreferences(RenderRequest req);  // 通過RenderRequest獲取.

在getPortalPreferences方法中,讀取preferences的任務還是交給PortletPreferencesLocalServiceImpl,只是在沒有登錄時,preferences被存儲在httpsession中以便共享.

getPreferences(HttpServletRequest req);

與上面三個方法不同,這個方法直接讀取RenderRequest的preferences.

getPreferencesValidator(Portlet portlet);

獲取preferences的驗證對象.

liferay中proferences的保存.

在liferay中,調用preferences的store就可以保存proferences到數據庫了.

public void store() throws IOException, ValidatorException {
Portlet portlet = PortletLocalServiceUtil.getPortletById(_companyId, _pk.portletId);
if (!_pk.portletId.equals(PortletKeys.LIFERAY_PORTAL)) {
PreferencesValidator prefsValidator =PortalUtil.getPreferencesValidator(portlet);
// 驗證數據
if (prefsValidator != null) {
prefsValidator.validate(this);
}
}

// 更新preferences
PortletPreferencesLocalServiceUtil.updatePreferences(_pk, this);
//TODO
}

proferences是以xml文檔的方式存入數據庫中的.

文章收集整理自互聯網,出處不詳

Liferay portlet首選項(preferences)設置、存儲處理
文章《Liferay portlet首選項(preferences)設置、存儲處理》二維碼
  • 微信打賞
  • 支付寶打賞

已有11條評論

  1. 何捷浪

    好棒~好~萌菌網www.moejun.tv/

    2015-04-27 09:54 回復
  2. 海濤

    親的網站不錯啊,挺棒的加油奧。歡迎回訪www.xiuxiaohua.com

    2013-08-24 10:36 回復
  3. nfl jersey

    博主。。我看不懂

    2013-04-27 14:21 回復
  4. 平頂山

    過來看看老鄉,程序不懂啊

    2013-04-05 11:54 回復
  5. 音樂人生網賺

    支持 支持

    2013-04-03 22:45 回復
  6. 蘇蘇網賺博客

    技術文章,必須頂

    2013-04-03 21:20 回復
  7. ζ??????? ? 螻ㄧ蟻

    很不錯 頂+1

    2013-04-03 09:40 回復
  8. 港城婚紗攝影寧寧

    很棒的說,頂一下

    2013-03-31 17:03 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖