最近使用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. SQL Server--实体再复习

    前些天小编所在的组织部重构.组长交给小编一项设计实体的活儿,它是我们软件灵魂(数据)的载体,实体的抽象影响到数据库设计,数据库设计的质量影响到整个程序的运营,以下是我设计的实体关系图: 系统核心业务逻 ...

  2. Mac下,如何把Github上的仓库删除掉

    这个虽然简单,但是还是做个记录,当初也是找不到地方,最终还是去百度了,步骤很简单: 如下: 1.进入Github主页,选中你要删除的仓库,点击进入到如下页面:

  3. Python 爬虫知识点

    一.基础知识 1.HTML分析 2.urllib爬取 导入urilib包(Python3.5.2) 3.urllib保存网页 import urllib.requesturl = "http ...

  4. eclipse、tomca和jvm的相关内存配置

    1,  设置Eclipse内存使用情况        修改eclipse根目录下的eclipse.ini文件        -vmargs  //虚拟机设置        -Xms40m        ...

  5. Python 列表表达式与生成器表达式

    列表表达式: (1) 语法1:[表达式 for 变量 in 列表],表示把得到的每一个变量值都放到 for 前面的表达式中计算 ,然后生成一个列表(2) 语法2:[表达式 for 变量 in 列表 i ...

  6. Java之类型的转换

    1.String 类型转化为 int 类型,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换. int a = Integer.parseInt(st ...

  7. CentOS6.4环境下布署LVS+keepalived笔记

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://400053.blog.51cto.com/390053/713566 环境: 1 ...

  8. NUC970设备驱动

    安装完WinUSB4NuVCOM_NUC970.exe后      USB0要配置成DEVICE 才可以在设备管理器中显示.

  9. MYSQL系列之(二)

    上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...

  10. AndroidのListView之滑动列表项(点击事件和滑动事件共存)

    这里正好在项目有这么一个bt的需求,如下图ListView的item可以响应点击事件也可以响应item的左右滑动事件,两个事件可以相互独立互不影响. 听说iphone的list选项就有这样bt的功能, ...