最近使用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. Neo4j简单的样例

    系统环境: Ubuntu 04.10 x64 一:安装 下载最新版:neo4j-community-2.2.3-unix.tar.gz  解压 cd neo4j-community-2.2.3/bin ...

  2. 深入volley(三)自己来写volley

    https://github.com/Smalinuxer/android-SpillOver 这是我自己写的一个请求缓存框架,基于volley的,沿袭了volley的架构与设计思想,而对其进一步的封 ...

  3. 【RF库Collections测试】Copy Dictionary

    Name: Copy DictionarySource:Collections <test library>Arguments:[ dictionary ]Returns a copy o ...

  4. 使用keytool生成密钥对

    1.首先要用KeyTool工具来生成私匙库:(-alias别名 –validity 3650表示10年有效) keytool -genkey -alias privatekey -keystore p ...

  5. Serlvet学习笔记之一 ——实现servlet的3种方法

    1.配置环境,从tomcat的lib下面引入servlet-api.jar包.

  6. poj_1182 并查集

    题目大意 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人 ...

  7. $.when()方法监控ajax请求获取到的数据与普通ajax请求回调获取到的数据的不同

    1.$.when(ajax).done(function(data)}); 2.$.ajax().done(function(data){}); 1中的data被封装进一个对象[data, " ...

  8. onethink插件控制器如何访问?

    具体路由分析就不说啦!就是那样.这里我只是方便访问来做一个记录,方便复制粘贴访问: 例如:新增一个Baoming的插件: 那么如何,访问这个控制里面方法呢? 第一种情况:这个控制器使用的是Admin模 ...

  9. Hive格式化输出数据库和表详细信息

    hive> desc database extended wx_test; OK wx_test hdfs://ns1/user/hive/warehouse/wx_test.db hadoop ...

  10. matplotlib 散点图scatter

    最近开始学习python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...