Liferay 6.1开发可配置portlet开发

一、Portlet是什么?

Portlet是基于java的web组件,由portlet容器管理,并由容器处理请求,生产动态内容。Portals使用portlets作为可插拔用户接口组件,提供信息系统的表示层。作为利用servlets进行web应用编程的下一步,portlets实现了web应用的模块化和用户中心化。 portlet规范,即jsr(Java Standardization Request )168/268,是为了实现portal和portlet的互操作。它定义了portlet和portlet容器之间的和约,让portlet实现个性化、表示和安全的api集。规范还定义了怎样在portlets应用中打包portlets。(引自百度百科:http://baike.baidu.com/view/58961.htm

Liferay是portlet规范的实现,对于portlet规范实现的主流产品还有IBM、Oracle等的Portal产品,主流产品的详细可以参看:http://www.huqiwen.com/2012/06/11/what-is-liferay/ 此篇文章中关于Liferay市场地位处的图片。很以很多时候我们将Liferay称为一个Portal容器,也就是一个提供Portlet运行的环境。

二、创建一个Portlet

1、基于上一节的Study这个portlet工程的基础。点击Liferay IDE上的liferay工具栏,有三个按钮,点击中间按钮,New Liferay Portlet。如下图,点击下一步。

liferay-portlet-demo

Portlet plugin project:这里选择要创建的portlet属于哪个插件工程。

Source folder:类的放置位置,一般默认。

Portlet Class:要创建的Portlet的控制类的名称,可以将此类看作Struts中的Action类。

Java package:包名。

Superclass:选择要继承哪个类。一般默认,也就是MVCPortlet。下面这几个类的关系如下:MVCPortlet是LiferayPortlet的子类,LiferayPortlet是GenericPortlet的子类。在MVCPortlet中封装了一些方便开发的方法,所以一般使用MVCPortlet,如果有特殊需求可以使用他们的父类。

2、在此步骤看到的是Portlet的相关信息,如模式,JSP位置等,此步骤是portlet.xml文件的可视化编辑,此步骤的所有选项都可以通过编辑portlet.xml完成。点击下一步。

创建portlet的信息页

Porltet Info:这里显示的是Porltet的名称,显示名称,标题等。一般默认,不需要修改。

Portlet Modes:这里是portlet的模式,View、Edit、Help这三种模式,是portlet规范里面定义的。

Liferay Portlet Modes:看名知义,Liferay Portlet模式。一般默认即可。Portlet默认的三种模式,Liferay认为不能满足实际的需求,所以又新增了这几种模式。如果选择多个模式,就可以在portlet的设置里面看到,可以通过设置进行切换,方便进行一些特殊需求,如:config可以用来开发可配置Porltet,管理员可以为指定的Portlet定制相关的参数等。

JSP folder:JSP的存放位置,一般默认的命名是html/porltet名称,一般默认即可。html是相对于docroot的,完整路径是docroot/html/demo/view.jsp。

Create resource bundle file:绑定资源文件,主要是国际化。如果想要porltet的名称是中文的,测必须使用资源文件,liferay推荐工程中的所有文字描述类的内容都使用资源文件来定义,这样方便国际化,也能避免出现一些可能的乱码问题。这里先不选,后面详讲国际化。

3、此步骤是Liferay-portlet.xml和liferay-display.xml的可视化编辑。点击完成即可。

liferay-portlet信息

Icon:此portlet的图标。

Allow mutiple instaces:是否允许在同一个页面中有多个porltet的实例,默认为否。

CSS:当前porltet的自定义CSS。一般默认。

JavaScript:当前portlet自定义JS。一般默认。

CSS classname:当前portlet的命名空间,防止CSS和其他porltet冲突。

Category:当前的portlet,显示在哪个分类下面,这里是Liferay-display.xml文件的可视化编辑。

三、MVCPortlet的简单使用

可以看到在工程的com.huqiwen.study包下面生成了一个Demo的java文件,如果只是让portlet显示/html/demo/view.jsp里面的内容,则不需要在Demo.java文件里面添加内容。如果需要让view.jsp后从台初始化一些信息,则需要重写doView文法。view模式显示时调用doView方法,edite模式显示时调用doEdite方法,config模式显示时调用doConfig方法,依此类推。

在此大部分情况下可以将renderRequest当然HttpServletRequest使用。如果要转换可以通过PortalUtil.getHttpServletResponse(portletResponse)来进行转换。

可以使用renderRequest.setAttribute(arg0, arg1)方法,在前台页面通过JSTL等进行取值。

 

 

一、什么是可配置portlet

其实portlet本来就是可以配置的,但我们的开发大部分情况下只使用view模式,edit和config模式一般没有使用,对于使用editor和config等模式的portlet,我们可以将他们称为可配置portlet。通过使用可配置portlet,可以做许多个性化定制。

应用场景:

1、如果在首页上有展现专题的地方,可以建立一个专题展现的portlet,这个地方要展现的内容为一个图片或多个图片,点击图片可以跳转相应的链接。但是专题可能需要变化,则这里可以添加一个config或edit模式来让管理员通过配置参数来定制。

2、如首页的新闻栏目,设计时是展现的A栏目,但是实际中用户可能有变化,需要换成其他栏目,同样可以通过可配置portlet来满足。

3、如提供RSS订阅,我们可以在配置项里面设置RSS的输出方法为标题或者是摘要或者是全文,标准可以为atom或者rss2.0等配置。

4、如有一个指标展现,用户需求为可定制的,用户A可以选择柱状图、用户B可以选择折线图、用户C可以选择饼图等。

包括但不限于以上场景,需要通过配置来适用不同的情况,为用户提供可配置选项的地方都可以使用可配置portlet。

可配置portlet的开发方式

可配置portlet的开发方式,我按数据的存储方式的不同,大概的分为两种。一种为使用PortletPreferences存储的,一种为自定义数据表结构存储的。

使用PortletPreferences存储的方式为将配置数据以键值对的形式存储于PortletPreferences的相关属性字段里面。以portlet的实例ID做为识别进行存储信息,适用于配置信息不算太复杂的场景。

如果配置信息比较复杂,推荐建立相关的数据库,将配置信息存储于数据库中。本文主要介绍存储于PortletPreferences中的方法,存储于数据库和普通的portlet的数据存储方法类似。

如果按模式的不同,又可以分为edit、config、help等不同的模式。这些对应于建立portlet时选用的modes的不同而不同,这里主要介绍config模式。其他模式类似。

使用Config模式

1、需要有一个建立好的portlet。portlet的创建,参考前面的portlet简述:http://www.huqiwen.com/2012/09/03/liferay-6-1-development-study-3-portlet-explicate/

2、在Liferay-portlet.xml里面找到此portlet的相关配置,在里面添加configuration-action-class元素,如下:

<portlet>
 <portlet-name>customjspportlet</portlet-name>
 <icon>/icon.png</icon>
 <configuration-action-class>xx.xxx.xxx.customjspportlet.CustomJspConfigurationAction</configuration-action-class>
 <instanceable>true</instanceable>
 <header-portlet-css>/css/main.css</header-portlet-css>
 <footer-portlet-javascript>
 /js/main.js
 </footer-portlet-javascript>
 <css-class-wrapper>customjspportlet-portlet</css-class-wrapper>
 </portlet>

3、建立CustomJspConfigurationAction类,此类继承自DefaultConfigurationAction即可。

4、重写其中的render方法。如下。

public String render(PortletConfig portletConfig, RenderRequest renderRequest, RenderResponse renderResponse){
String portletId = renderRequest.getParameter("portletResource");
 PortletPreferences preferences = PortletPreferencesFactoryUtil.getPortletSetup(renderRequest, portletId);
renderRequest.setAttribute("customjspConfig_page_title",preferences.getValue("customjspConfig_page_title", StringPool.BLANK));
 renderRequest.setAttribute("customjspConfig_page_link",preferences.getValue("customjspConfig_page_link", StringPool.BLANK));
return "/html/CustomJspPortlet/config.jsp";
}

这个方法是点击portlet中的配置时进入的方法。在这个方法里面做以下几件事情。

1):我们获取到了当前portlet的PortletPreferences。

2):从PortletPreferences里面获取key为customjspConfig_page_title和customjspConfig_page_link的数据,并将他们放到request里面。

3):告诉Liferay我的配置页的JSP的路径是哪个。

5、编写config.jsp页面。config.jsp页面里面是我们要配置的一此参数信息,大部分情况下是一个展现的表单。主要内容可以参考如下(从项目中截取的部分代码,为说明问题已经简化):

<form action="<liferay-portlet:actionURL portletConfiguration="true" />" name="<portlet:namespace />fm" id="<portlet:namespace />fm" method="post">
<ul>
 <li>
 <span>标题:</span>
 <input tabindex="1"  type="text" name="<portlet:namespace />customjspConfig_page_title" id="<portlet:namespace />customjspConfig_page_title" value="<%=title%>" />
 </li>
 <li>
 <span>链接地址:</span>
 <input id='<portlet:namespace />custom_page_link' name='<portlet:namespace />customjspConfig_page_link' type="text" value="<%=link %>" /> 
 </li>
 <li>
 <input type="button" value="" οnclick="<portlet:namespace />saveConfig()">
 </li>
</ul>
</form>

这里的关键点为form的action,所有这种模式的可配置portlet的action都可以固定为:<liferay-portlet:actionURL portletConfiguration="true" />。

6、服务端保存配置信息的处理。步骤5中的action会进入步骤3建立的配置类的processAction方法。在上面的配置类里重写processAction方法。里面的内容如下:

public void processAction(PortletConfig portletConfig, ActionRequest actionRequest, ActionResponse actionResponse)
 throws Exception {
 String portletResource = ParamUtil.getString(actionRequest, "portletResource");
PortletPreferences preferences = PortletPreferencesFactoryUtil.getPortletSetup(actionRequest, portletResource);
if (Validator.isNotNull(preferences)) {
//从request里面取数据
 String title = ParamUtil.getString(actionRequest, "customjspConfig_page_title");
 String link = ParamUtil.getString(actionRequest, "customjspConfig_page_link");
//将数据以键值对的形式填充到preferences里面
 preferences.setValue("customjspConfig_page_title", title);
 preferences.setValue("customjspConfig_page_link", link);
//存储数据到数据库中,持久化数据
 preferences.store();
 SessionMessages.add(actionRequest, "success");
 }
 super.processAction(portletConfig, actionRequest, actionResponse);
 }

到这里已经完成了可配置portlet的配置部分的开发。

在view.jsp中使用配置数据

前面步骤开发的配置数据的目标是为了在view.jsp中使用,在view.jsp中使用可以在view.jsp的action中使用,也可以直接在view.jsp中直接提取,方法为:

PortletPreferences preferences = renderRequest.getPreferences();
 String title = preferences.getValue("customjspConfig_page_title", StringPool.BLANK);
 String link = preferences.getValue("customjspConfig_page_link", StringPool.BLANK);

通过这样的方法即可取到前面的配置信息,取取的数据具体怎么展现,怎么使用,根据不同的业务场景有所不同。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值