Liferay portlet首选项(preferences)设置、存储处理
最近使用Liferay做项目集成,由于团队人员在之前对Liferay这东西都没有充分的了解,用起来着实费了不少力气,最近为了为定制好的portlet添加初始化信息,翻阅了一些文章,下面是了解到的关于初始化信息(首选项)的配置处理机制.在JSR168规范中,允许使用preferences来存储portlet的一些初始信息,preferences的内容在portlet.xml来设置.而在Liferay中,对preferences加入了数据库持久化功能,并且可针对company,layout,portlet instance和user的不同组合来定制.
首先来看看在jsp页面上如何访问preferences.
/html/portal/render_portlet.jsp - Portlet输出页面.
- Portlet portlet = (Portlet)request.getAttribute(WebKeys.RENDER_PORTLET);
- CachePortlet cachePortlet = PortletInstanceFactory.create(portlet, application);
读取preferences.
- PortletPreferences portletPrefs = PortletPreferencesLocalServiceUtil.getPreferences(
- company.getCompanyId(), PortletPreferencesFactory.getPortletPreferencesPK(request, portletId));
创建PortletConfig.
- PortletConfig portletConfig = PortletConfigFactory.create(portlet, application);
- PortletContext portletCtx = portletConfig.getPortletContext();
- HttpServletRequest originalReq = PortalUtil.getOriginalServletRequest(request);
创建RenderRequest.
- RenderRequestImpl renderRequestImpl = RenderRequestFactory.create(
- originalReq, portlet, cachePortlet, portletCtx, windowState, portletMode, portletPrefs, plid);
- StringServletResponse stringServletRes = new StringServletResponse(response);
创建RenderResponse.
- RenderResponseImpl renderResponseImpl = RenderResponseFactory.create(
- renderRequestImpl, stringServletRes, portletId, company.getCompanyId(), plid);
- // setAttribute(WebKeys.JAVAX_PORTLET_CONFIG, portletConfig);
- // setAttribute(WebKeys.JAVAX_PORTLET_REQUEST, renderRequestImpl);
- // setAttribute(WebKeys.JAVAX_PORTLET_RESPONSE, renderResponseImpl);
- renderRequestImpl.defineObjects(portletConfig, renderResponseImpl);
- if (portlet.isActive() && access) {
- try {
- cachePortlet.render(renderRequestImpl, renderResponseImpl);
- }catch (UnavailableException ue) {
- portletException = true;
- PortletInstanceFactory.destroy(portlet);
- }
- }
PortletPreferencesPK 为preferences的主键,它由portletId, layoutId和ownerId三部分标识.
- com.liferay.portal.service.impl.PortletPreferencesLocalServiceImpl
- // getPreferences.
- public javax.portlet.PortletPreferences getPreferences(String companyId, PortletPreferencesPK pk) throws PortalException, SystemException {
- // 读取prefs缓存.
- Map prefsPool = PortletPreferencesLocalUtil.getPreferencesPool(pk.ownerId);
- PortletPreferencesImpl prefs =(PortletPreferencesImpl)prefsPool.get(pk);
- if (prefs == null) {
- PortletPreferences portletPreferences = null;
- // 读取portlet.
- Portlet portlet = PortletLocalServiceUtil.getPortletById(companyId, pk.portletId);
- try {
- // 从数据库里读preferences.
- portletPreferences =PortletPreferencesUtil.findByPrimaryKey(pk);
- }catch (NoSuchPortletPreferencesException nsppe) {
- portletPreferences = PortletPreferencesUtil.create(pk);
- if (portlet == null) {
- // 设置系统默认的preferences.
- portletPreferences.setPreferences(Portlet.DEFAULT_PREFERENCES);
- }else {
- // 设置portlet.xml中定义的preferences.
- portletPreferences.setPreferences(portlet.getDefaultPreferences());
- }
- PortletPreferencesUtil.update(portletPreferences);
- }
- prefs = PortletPreferencesSerializer.fromXML(companyId, pk, portletPreferences.getPreferences());
- prefsPool.put(pk, prefs);
- }
- return (PortletPreferencesImpl)prefs.clone();
- }
上面的代码首先从缓存中读取,如没有则从数据库读取,如数据库中还没有相应的记录,则读取默认值并更新到数据库中.
PortletPreferencesFactory
另外一个获取preferences的方式是通过PortletPreferencesFactory,它提供了更方便的获取preferences的方法.
- getPortalPreferences(HttpServletRequest req); // 通过HttpServletRequest获取.
- getPortalPreferences(ActionRequest req); // 通过ActionRequest获取.
- getPortalPreferences(RenderRequest req); // 通过RenderRequest获取.
在getPortalPreferences方法中,读取preferences的任务还是交给PortletPreferencesLocalServiceImpl,只是在没有登录时,preferences被存储在httpsession中以便共享.
- getPreferences(HttpServletRequest req);
与上面三个方法不同,这个方法直接读取RenderRequest的preferences.
- getPreferencesValidator(Portlet portlet);
获取preferences的验证对象.
liferay中proferences的保存.
在liferay中,调用preferences的store就可以保存proferences到数据库了.
- public void store() throws IOException, ValidatorException {
- Portlet portlet = PortletLocalServiceUtil.getPortletById(_companyId, _pk.portletId);
- if (!_pk.portletId.equals(PortletKeys.LIFERAY_PORTAL)) {
- PreferencesValidator prefsValidator =PortalUtil.getPreferencesValidator(portlet);
- // 验证数据
- if (prefsValidator != null) {
- prefsValidator.validate(this);
- }
- }
- // 更新preferences
- PortletPreferencesLocalServiceUtil.updatePreferences(_pk, this);
- //TODO
- }
proferences是以xml文档的方式存入数据库中的.
转载出处:http://www.poorren.com/liferay-portlet-preferences-use-setting/
Liferay portlet首选项(preferences)设置、存储处理的更多相关文章
- Eclipse 首选项(Preferences)
Eclipse 首选项(Preferences) 设置首选项 该对话框可通过框架管理但是其他插件可以设置其他页面来管理首选项的配置. 我们可以通过 Window 菜单选择 Preferences 菜单 ...
- XamarinEssentials教程设置首选项Preferences的值
XamarinEssentials教程设置首选项Preferences的值 如果要对首选项的某一项的值进行设置时,可以通过Preferences类的Set()方法实现,该方法可以对指定键的值进行设置. ...
- XamarinEssentials教程首选项Preferences判断项目是否存在
XamarinEssentials教程首选项Preferences判断项目是否存在 首选项也可以称为偏好设置.它以键值对的形式保存数据,适用于用户少量数据的存储.例如,将用户的个性化设置保存后,每次打 ...
- JavaEE 配置文件 应用首选项存储
JavaEE 配置文件 应用首选项存储 @author ixenos 什么是首选项? 首选项Preferences 指配置信息 首选项存储就是指对配置信息的存储 有什么方式存储? 有两种,一种存于 ...
- 详解Android首选项框架ListPreference
详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...
- 转:Android preference首选项框架
详解Android首选项框架ListPreference 探索首选项框架 在 深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写一个应用 ...
- Google AdWords 广告排名首选项
排名首选项目标:了解 AdWords 广告客户可怎样为其广告设置排名首选项. 排名首选项简介 通过排名首选项,用户可以告诉 Google 他们希望其广告在给定网页上的所有 AdWords 广告中所处的 ...
- Windows 8 动手实验系列教程 实验6:设置和首选项
动手实验 实验6:设置和首选项 2012年9月 简介 实验3介绍了合约并演示了应用程序如何轻松地与共享和搜索合约实现集成.合约同样包含设置超级按钮,它对活动的Windows应用商店应用的设置进行修改. ...
- 应用程序首选项(application preference)及数据存储
应用程序首选项(application preference)用来存储用户设置,考虑以下案例: a. 假设有一款MP3播放器程序,当用户调节了音量,当下次运行该程序时,可能希望保持上一次调节的音量值. ...
随机推荐
- Cocos2d-x3.0触摸
cocos2d-x 3.0開始採用C++11,并開始脱离OC风格,在触摸处理上也作出了改变 C++11带来了Lambda表达式(匿名函数),它将简化程序编写,可使代码更清晰易懂 在旧2.x版本号的触摸 ...
- 开源 免费 java CMS - FreeCMS1.9 移动APP生成网站列表数据
项目地址:http://www.freeteam.cn/ 生成网站列表数据 提取同意移动APP訪问的网站列表,生成json数据到/mobile/index.html页面. 从左側管理菜单点击生成网站列 ...
- Android程序增加代码混淆器
增加代码混淆器.主要是增加proguard-project.txt文件的规则进行混淆,之前新建Android程序是proguard.cfg文件 能够看一下我採用的通用规则(proguard-proje ...
- ios 气泡聊天
最近做的项目里面,有几个模块用到了聊天功能和评论回复的功能,使用的频率还是很高的,所以抽时间做了这个博客,希望能给自己和别人带来方便, 具体代码如下: 1,创建model, #import <F ...
- 在linux本地下载ftp中的文件
使用wget命令 -r :会在当前目录下生成192.168.30.14文件名 下面的命令就是下载这个ftp目录"/home/ftp/*"下面的所有文件 wget -r ftp:// ...
- bootstrap里面的popover组件如何使鼠标移入可以对弹出框进行一系列的操作
在bootstrap里面,有一个组件很可爱,它就是popover,它是对标签title属性的优化,奉上连接一枚:http://docs.demo.mschool.cn/components/popov ...
- 当JS出现的Cannot read property 'XXX' of null错误
由于在加载JS的时候,页面还未加载完成,就出现了这样的错误.解决方法很简单,将这段 js 放到页面的最下面,等到所以页面加载完成时,再加载这段JS.
- linux如何设置用户权限
linux与用户权限设置: 1.添加用户 首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy //修改密码 ...
- 索引原理 B tree
数据库原理之-索引 背景介绍: 用数据库的时候经常有几个疑问: 1:为啥通过加索引就能提升数据的查询料率? 2:为啥加多了索引会导致增删改的效率变低? 3:为啥有的人能用好有的人用不好? 这些问题我们 ...
- 【BZOJ3280】小R的烦恼 最小费用最大流
[BZOJ3280]小R的烦恼 Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的 ...