最近使用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. easyui-textbox 只读设置取消

    <script> $(function () { $("#txt_beginAmount").attr('readonly', true); $("#txt_ ...

  2. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFacto

    控制台: 2016-4-1 16:32:06 org.hibernate.annotations.common.Version <clinit> 信息: Hibernate Commons ...

  3. jquery 获取当前时间加180天

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. PHP5 session 详解【经典】

    原文:http://www.pkwind.com/php5-session-xiang-jie-jing-dian http协议是WEB服务器与客户端 (浏览器)相互通信的协议,它是一种无状态协议.所 ...

  5. 如何设置SOLR的高亮 (highlight)?

    打开SOLR的核心配置文件: solrconfig.xml 找到 standard request handler 写入以下XML配置代码: <requestHandler name=" ...

  6. jQUery中closest和parents的主要区别是

    ①,前者从当前元素开始匹配寻找,后者从父元素开始匹配寻找: ②,前者逐级向上查找,直到发现匹配的元素后就停止了,后者一直向上查找直到根元素,然后把这些元素放进一个临时集合中,再用给定的选择器表达式去过 ...

  7. PyQt4消息窗口

    默认情况下,如果我们单击了窗口标题栏上的X标记,窗口就会被关闭.但是有些时候我们想要改变这一默认行为.比如,我们正在编辑的文件内容发生了变化,这时若单击X标记关闭窗口,编辑器就应当但出确认窗口. #! ...

  8. mysql concat

    CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式. 第一个参数是其它参数的分隔符.分隔符的位置放在要连接的两个字符串之间. 分隔符可以是一个字符 ...

  9. Kconfig和Makefile的修改

    Kconfig文件的作用 内核源码树的目录下都有两个文件Kconfig(2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconf ...

  10. elk日志分析与发掘深入分析

    elk日志分析与挖掘深入分析 1 为什么要做日志采集? 2 挖财自己的日志采集和分析体系应该怎么建? 2.1 日志的采集 2.2 日志的汇总与过滤 2.3 日志的存储 2.4 日志的分析与查询 3 需 ...