最近使用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. TCP处理主要开销

    快速的网络TCP 通常受限 发送主机 与 接收主机. 而不是网络设备或协议本身的实现. TCP的处理的主要开销 分为中断操作.数据复制和协议处理. 1:中断操作 2:数据复制 3:协议处理 TCP的处 ...

  2. 工作流JBPM_day01:3-使用JBPM的API添加与执行流程

    工作流JBPM_day01:3-使用JBPM的API添加与执行流程 流程定义画完得到压缩文件--->部署流程定义-->启动流程实例-->查询我的个人任务列表-->办理任务--& ...

  3. python2.0 s12 day3

    s12 day3 视频每节的内容 03 python s12 day3 本节内容概要 第三天的主要内容 上节没讲完的: 6.集合 7.collections 1)计数器 2)有序字典 3)默认字典 4 ...

  4. Python2 与 Python3 区别

    print 用法不同:在 Python2 中,print 用法为 print "Hello World"在 Python3 中,print 用法为 print("Hell ...

  5. onTouch

    OnTouchOmOnTouchListenerOnTouchEvent View的事件分发 :    对于事件分发机制,举个简单的例子,在一个Activity中只有一个按钮,如果我们想给这个按钮注册 ...

  6. 详解Integer.toString(int i)方法和String.valueOf(int i)方法

    通过查看String类的源码: public static String valueOf(int i) { return Integer.toString(i); } 我们可以看到,String.va ...

  7. 十分钟理解Java中的动态代理

    十分钟理解 Java 中的动态代理   一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...

  8. ubuntu 创建桌面快捷方式

    $sudo apt-get install gnome-panel $gnome-desktop-item-edit  /home/xxx/桌面 --create-new 命令行:填入程序名称,如/u ...

  9. html表格中的tr td th用法

      表格是html中经常使用到的,简单的使用可能很多人都没问题,但是更深入的了解的人恐怕不多,下面我们先来看一下如何使用. <table>是<tr>的上层标签 <tr&g ...

  10. go练习3 --map的操作

    func T2_1() {     // 键值string , 值 int 类型     m1 := map[string]int{}     //添加一个元素     m1["str1&q ...