zoukankan      html  css  js  c++  java
  • 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输出页面.

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

    读取preferences.

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


    创建PortletConfig.

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

    创建RenderRequest.

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

    创建RenderResponse.

    1. RenderResponseImpl renderResponseImpl = RenderResponseFactory.create(
    2. renderRequestImpl, stringServletRes, portletId, company.getCompanyId(), plid);
    3.  
    4. // setAttribute(WebKeys.JAVAX_PORTLET_CONFIG, portletConfig);
    5. // setAttribute(WebKeys.JAVAX_PORTLET_REQUEST, renderRequestImpl);
    6. // setAttribute(WebKeys.JAVAX_PORTLET_RESPONSE, renderResponseImpl);
    7. renderRequestImpl.defineObjects(portletConfig, renderResponseImpl);
    8.  
    9. if (portlet.isActive() && access) {
    10. try {
    11. cachePortlet.render(renderRequestImpl, renderResponseImpl);
    12. }catch (UnavailableException ue) {
    13. portletException = true;
    14. PortletInstanceFactory.destroy(portlet);
    15. }
    16. }

    PortletPreferencesPK 为preferences的主键,它由portletId, layoutId和ownerId三部分标识.

    1. com.liferay.portal.service.impl.PortletPreferencesLocalServiceImpl
    2.  
    3. // getPreferences.
    4. public javax.portlet.PortletPreferences getPreferences(String companyId, PortletPreferencesPK pk) throws PortalException, SystemException {
    5. // 读取prefs缓存.
    6. Map prefsPool = PortletPreferencesLocalUtil.getPreferencesPool(pk.ownerId);
    7. PortletPreferencesImpl prefs =(PortletPreferencesImpl)prefsPool.get(pk);
    8.  
    9. if (prefs == null) {
    10. PortletPreferences portletPreferences = null;
    11. // 读取portlet.
    12. Portlet portlet = PortletLocalServiceUtil.getPortletById(companyId, pk.portletId);
    13. try {
    14. // 从数据库里读preferences.
    15. portletPreferences =PortletPreferencesUtil.findByPrimaryKey(pk);
    16. }catch (NoSuchPortletPreferencesException nsppe) {
    17. portletPreferences = PortletPreferencesUtil.create(pk);
    18. if (portlet == null) {
    19. // 设置系统默认的preferences.
    20. portletPreferences.setPreferences(Portlet.DEFAULT_PREFERENCES);
    21. }else {
    22. // 设置portlet.xml中定义的preferences.
    23. portletPreferences.setPreferences(portlet.getDefaultPreferences());
    24. }
    25. PortletPreferencesUtil.update(portletPreferences);
    26. }
    27. prefs = PortletPreferencesSerializer.fromXML(companyId, pk, portletPreferences.getPreferences());
    28. prefsPool.put(pk, prefs);
    29. }
    30. return (PortletPreferencesImpl)prefs.clone();
    31. }

    上面的代码首先从缓存中读取,如没有则从数据库读取,如数据库中还没有相应的记录,则读取默认值并更新到数据库中.

    PortletPreferencesFactory

    另外一个获取preferences的方式是通过PortletPreferencesFactory,它提供了更方便的获取preferences的方法.

    1. getPortalPreferences(HttpServletRequest req); // 通过HttpServletRequest获取.
    2. getPortalPreferences(ActionRequest req); // 通过ActionRequest获取.
    3. getPortalPreferences(RenderRequest req); // 通过RenderRequest获取.

    在getPortalPreferences方法中,读取preferences的任务还是交给PortletPreferencesLocalServiceImpl,只是在没有登录时,preferences被存储在httpsession中以便共享.

    1. getPreferences(HttpServletRequest req);

    与上面三个方法不同,这个方法直接读取RenderRequest的preferences.

    1. getPreferencesValidator(Portlet portlet);

    获取preferences的验证对象.

    liferay中proferences的保存.

    在liferay中,调用preferences的store就可以保存proferences到数据库了.

    1. public void store() throws IOException, ValidatorException {
    2. Portlet portlet = PortletLocalServiceUtil.getPortletById(_companyId, _pk.portletId);
    3. if (!_pk.portletId.equals(PortletKeys.LIFERAY_PORTAL)) {
    4. PreferencesValidator prefsValidator =PortalUtil.getPreferencesValidator(portlet);
    5. // 验证数据
    6. if (prefsValidator != null) {
    7. prefsValidator.validate(this);
    8. }
    9. }
    10.  
    11. // 更新preferences
    12. PortletPreferencesLocalServiceUtil.updatePreferences(_pk, this);
    13. //TODO
    14. }

    proferences是以xml文档的方式存入数据库中的.

    转载出处:http://www.poorren.com/liferay-portlet-preferences-use-setting/

  • 相关阅读:
    爬虫流程
    康哥笔记
    csdn笔记
    数据库多表联查
    完整数据恢复
    Linux安装mysql
    linux在vm下实现桥接模式
    Linux下ntpdate时间同步
    spark集群在执行任务出现nitial job has not accepted any resources; check your cluster UI to ensure that worker
    flume在启动时出现brokerList must contain at least one Kafka broker
  • 原文地址:https://www.cnblogs.com/airycode/p/5290867.html
Copyright © 2011-2022 走看看