最近使用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. // setAttribute(WebKeys.JAVAX_PORTLET_CONFIG, portletConfig);
  4. // setAttribute(WebKeys.JAVAX_PORTLET_REQUEST, renderRequestImpl);
  5. // setAttribute(WebKeys.JAVAX_PORTLET_RESPONSE, renderResponseImpl);
  6. renderRequestImpl.defineObjects(portletConfig, renderResponseImpl);
  7. if (portlet.isActive() && access) {
  8. try {
  9. cachePortlet.render(renderRequestImpl, renderResponseImpl);
  10. }catch (UnavailableException ue) {
  11. portletException = true;
  12. PortletInstanceFactory.destroy(portlet);
  13. }
  14. }

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

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

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

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. // 更新preferences
  11. PortletPreferencesLocalServiceUtil.updatePreferences(_pk, this);
  12. //TODO
  13. }

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

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

Liferay portlet首选项(preferences)设置、存储处理的更多相关文章

  1. Eclipse 首选项(Preferences)

    Eclipse 首选项(Preferences) 设置首选项 该对话框可通过框架管理但是其他插件可以设置其他页面来管理首选项的配置. 我们可以通过 Window 菜单选择 Preferences 菜单 ...

  2. XamarinEssentials教程设置首选项Preferences的值

    XamarinEssentials教程设置首选项Preferences的值 如果要对首选项的某一项的值进行设置时,可以通过Preferences类的Set()方法实现,该方法可以对指定键的值进行设置. ...

  3. XamarinEssentials教程首选项Preferences判断项目是否存在

    XamarinEssentials教程首选项Preferences判断项目是否存在 首选项也可以称为偏好设置.它以键值对的形式保存数据,适用于用户少量数据的存储.例如,将用户的个性化设置保存后,每次打 ...

  4. JavaEE 配置文件 应用首选项存储

    JavaEE 配置文件 应用首选项存储 @author ixenos 什么是首选项? 首选项Preferences 指配置信息 首选项存储就是指对配置信息的存储   有什么方式存储? 有两种,一种存于 ...

  5. 详解Android首选项框架ListPreference

    详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...

  6. 转:Android preference首选项框架

    详解Android首选项框架ListPreference 探索首选项框架 在 深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写一个应用 ...

  7. Google AdWords 广告排名首选项

    排名首选项目标:了解 AdWords 广告客户可怎样为其广告设置排名首选项. 排名首选项简介 通过排名首选项,用户可以告诉 Google 他们希望其广告在给定网页上的所有 AdWords 广告中所处的 ...

  8. Windows 8 动手实验系列教程 实验6:设置和首选项

    动手实验 实验6:设置和首选项 2012年9月 简介 实验3介绍了合约并演示了应用程序如何轻松地与共享和搜索合约实现集成.合约同样包含设置超级按钮,它对活动的Windows应用商店应用的设置进行修改. ...

  9. 应用程序首选项(application preference)及数据存储

    应用程序首选项(application preference)用来存储用户设置,考虑以下案例: a. 假设有一款MP3播放器程序,当用户调节了音量,当下次运行该程序时,可能希望保持上一次调节的音量值. ...

随机推荐

  1. 超全面的JavaWeb笔记day04<dom树等>

    1.案例:在末尾添加节点(*****) 创建标签 createElement方法 创建文本 createTextNode方法 把文本添加到标签下面 appendChild方法 2.元素对象(了解) 如 ...

  2. python2.0_day21_bbs系统评论自动加载+文章创建

    day20中我们已经实现了bbs系统的前端展示,后台admin管理,以及前端动态显示顶部\登录和评论的分级展示功能.其中评论的分级展示功能最为复杂.上一节中我们只是在文章明细页面中加了一个button ...

  3. remove()

    remove() 用于从列表中删除指定的元素 In [35]: l = ['a', 'b', 'c'] In [36]: l.remove('b') In [37]: l Out[37]: ['a', ...

  4. 点击一个textView里的link导航至程序内可返回的自定义webView

    1,在AppDelegate.h里定义一个 id currentViewController; 在AppDelegate.m里 @implementation UIApplication (Priva ...

  5. CSS3 属性组参考资料

    CSS 属性组: 动画 背景 边框和轮廓 盒(框) 颜色 内容分页媒体 定位 可伸缩框 字体 生成内容 网格 超链接 行框 列表 外边距 Marquee 多列 内边距 分页媒体 定位 打印 Ruby ...

  6. 几种减小javascript对性能影响的方法

    1.将所有的script标签放在页面的底部,body的结束标签</body>之前. 2.将脚本打包,script标签越少,请求数就越少,加载速度加快,相应的响应时间变短. 3.使用非阻塞的 ...

  7. vux 全局注册组件

    背景:调试better-scroll的时候进行封装,作为组件来调用: 希望:全局注册组件: 1,在src的main.js下: 这样就可以用了:

  8. jQuery中的ajax用法案例

    什么是 AJAX? AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载 ...

  9. interface Impl

    public interface ActionBarOperations { void initSthOne(); void initSthTwo(); } public class ActionBa ...

  10. js的delete和void关键字

    delete关键字   delete关键字的作用: 删除对象的属性 语法:delete 对象.属性 可以删除没有使用var关键字声明的全局变量(直接定义在window上面的属性) delete关键字的 ...