[Liferay6.2]Liferay入门级portlet开发示例

什么是Portlet

来自百度百科(http://baike.baidu.com/view/58961.htm)的定义如下:

portlet是基于java的web组件,处理request并产生动态内容。一个portlet窗口包含一个标题栏,装饰,和portlet产生的内容。装饰可以包括改变portlet窗口状态和模式的按钮。portlet产生的内容称为片段,即一段遵守中心规则的标记(比如html, xhtml,wml(无线标记语言)),多个片段可以聚合成一个完整的文档。多个portlet聚合在一起,组成portal页。portlet容器控制portlet的生命周期。

本章将介绍如何使用Liferay IDE创建和部署一个入门级的Portlet。Liferay IDE开发环境的配置请参考《[Liferay6.2]Liferay社区版开发环境基础配置》一文。

新建Liferay portlet插件工程

在liferay ide中新建liferay portlet之前,必须先新建一个可用的liferay插件工程。

点击File->New->Liferay Plugin Project,打开新建Liferay插件工程界面。

[Liferay6.2]Liferay入门级portlet开发示例

Project name:工程名称。如果工程名后没有-portlet,在创建工程文件夹的时候会在最后加上-portlet后缀。

Display name:显示名称。默认情况下,显示名称会根据输入的工程名称自动生成,将第一个字母变成大写,将-替换成空格,将空格后的第一个字母变成大写。

Use default location:是否使用默认的位置,默认勾选。如果不勾选的就需要手动选择相应的路径。

Location:默认路径为{Liferay SDK 路径}\portlets\{工程名称[-portlet]},如本工程路径为F:\liferay\liferay6.2cega4\liferay-plugins-sdk-6.2\portlets\liferay-6.2-ce-ga4-demo-portlet。

Build type:构建类型,有Ant(liferay-plugins-sdk)和Maven(liferay-maven-plugin)两种构件类型,本示例选择默认的Ant。

Plugins SDK:插件SDK。

Liferay runtime:Liferay运行时。

Plugin type:插件类型。Liferay一共支持Portlet、Service Builder Portlet、Hook、Layout Template、Theme、Ext、Web等7种类型的插件。本示例先介绍Portlet插件的开发,其他几种插件后续再一一介绍。

Include sample code:是否包含示例代码,默认勾选,在创建工程的时候默认为创建出一个portlet示例。

Launch New Portlet Wizard after project is created:是否在工程被创建之后启动新建Portlet向导,默认不勾选。

Add project to working set:添加工程到工作集,默认不勾选。

配置完以上信息后,可以选择点击“Next >”按钮进入下一个配置或者点击“Finish”完成protlet插件工程配置。

如果选择点击“Next >”按钮可以看到如下界面,可以从可用的portlet框架中选择最适合该工程的技术。

[Liferay6.2]Liferay入门级portlet开发示例

Slecet portlet framework:选择portlet框架。可选的portlet框架目前只有Liferay MVC、JSF 2.x、Vaadin三大类,默认的是Liferay MVC,一种Liferay内置的、使用JSP实现的简单、轻量的MVC框架。其他的两个以后再讲。

Additional portlet options:附加的portlet选项,包含portlet名称和portlet的显示名称,默认与上一步的工程名称、工程的显示名称相同,不过我们也可以手工修改。

配置完成之后,点击“Finish”按钮,稍等片刻即可完成protlet插件工程配置。

[Console output redirected to file:F:\liferay\liferay6.2cega4\eclipse\workspace\.metadata\.plugins\com.liferay.ide.sdk.core\sdk.log]
Parallel execution with configuration on demand is an incubating feature.
:createPortlet BUILD SUCCESSFUL Total time: 18.405 secs

查看默认创建的示例Portlet代码

由于我们在“新建Liferay portlet插件工程”的过程中默认勾选了“Include sample code”选项,因此向导会默认给我们生成一个Portlet,名称为liferay-6.2-ce-ga4-demo。

与该portlet的相关的配置文件有三个,依次是WEB-INF下的portlet.xml、liferay-portlet.xml、liferay-display.xml。

portlet.xml:portlet定义描述文件,它描述portlet的类型,支持Mode, preferenes和role等,遵循JSR168标准实现。默认portlet的定义如下:

    <portlet>
<portlet-name>liferay-6.2-ce-ga4-demo</portlet-name>
<display-name>Liferay 6.2 Ce Ga4 Demo</display-name>
<portlet-class>com.liferay.util.bridges.mvc.MVCPortlet</portlet-class>
<init-param>
<name>view-template</name>
<value>/view.jsp</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
</supports>
<portlet-info>
<title>Liferay 6.2 Ce Ga4 Demo</title>
<short-title>Liferay 6.2 Ce Ga4 Demo</short-title>
<keywords>Liferay 6.2 Ce Ga4 Demo</keywords>
</portlet-info>
<security-role-ref>
<role-name>administrator</role-name>
</security-role-ref>
<security-role-ref>
<role-name>guest</role-name>
</security-role-ref>
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
</portlet>

liferay-portlet.xml:liferay的portlet定义描述文件,是liferay对portlet.xml的扩展描述,允许我们对portlet的呈现、功能和行为进行更深入的定制。默认portlet的定义如下:

    <portlet>
<portlet-name>liferay-6.2-ce-ga4-demo</portlet-name>
<icon>/icon.png</icon>
<header-portlet-css>/css/main.css</header-portlet-css>
<footer-portlet-javascript>/js/main.js</footer-portlet-javascript>
<css-class-wrapper>liferay-6.2-ce-ga4-demo-portlet</css-class-wrapper>
</portlet>

liferay-display.xml:portlet的类别定义文件,可以将portlet进行分类。

<display>
<category name="category.sample">
<portlet id="liferay-6.2-ce-ga4-demo" />
</category>
</display>

要注意的是,在portlet.xml、liferay-portlet.xml、liferay-display.xml三个文件中的portlet-name, portlet-id必须是一致的。

在portlet.xml中通过<init-param><name>view-template</name><value>/view.jsp</value></init-param>定义了该portlet展现界面view.jsp,其默认生成的内容也比较简单,其代码如下:

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:defineObjects />

This is the <b>Liferay 6.2 Ce Ga4 Demo</b> portlet.

其他关于portlet的图标icon、css、js等在liferay-portlet.xml配置文件中也都指出在此就不一一列举了。

接下来先将下如何新建portlet,最后在一起看看部署之后的展现应用效果。

新建portlet

新建portlet有手工编辑和向导创建两种方式。

手工编辑

手工编辑的步骤如下:

1、根据示例代码依次在portlet.xml、liferay-portlet.xml、liferay-display.xml添加portlet的相关信息;

2、创建view.jsp展现页面、portlet实现类、图标icon、css、js等文件。

向导创建

向导创建的方式如下:

1、创建portlet实现类

[Liferay6.2]Liferay入门级portlet开发示例

Portlet plugin project:portlet插件工程。

Source folder:源文件夹。

Create new portlet:创建新的portlet,默认选项,如果portlet存在前后数据交互,则建议创建实现类。

Use default portlet(MVCPortlet):使用默认的MVCPortlet,例如示例portlet代码,如果页面只是纯展现,则无需创建实现类。

如果选择“创建新的portlet”,则需要指定以下三个参数:

Portlet class:portlet实现类。

Java package:java包。

superclass:portlet实现类的超类。默认有com.liferay.util.bridges.mvc.MVCPortlet、com.liferay.portal.kernel.portlet.LiferayPortlet、javax.portlet.GenericPortlet三种下拉选择,也可以通过浏览按钮选择其他的。常用的一般是com.liferay.util.bridges.mvc.MVCPortlet。

2、指定portlet部署描述细节

[Liferay6.2]Liferay入门级portlet开发示例

Portlet Info:portlet信息主要包括portlet名称、显示名称及标题。

Portlet Modes:portlet模式分为View查看、Edit编辑、Help帮助三种,View是必须支持的模式,Edit、Help是可选的。

Liferay Portlet Modes:指定Liferay增强的portlet模式,分别有About、Config、Edit Defaults、Edit Guest、Preview、Print等。

Resources:资源文件。 默认创建JSP文件,并指定JSP的文件夹。默认不创建资源绑定文件,如果勾选则是默认创建国际化文件。

3、指定Liferay portlet部署描述细节

[Liferay6.2]Liferay入门级portlet开发示例

Liferay Portlet Info:Liferay portlet信息中指定图标、css、javascript以及css 类封装器(防止css和其他portlet中的css冲突)。还可以勾选Allow multiple instances(是否允许多个实例,默认不勾选,不勾选每个页面只能添加一个该portlet,勾选则表示每个页面只能添加多个该portlet)。

Liferay Display:Liferay显示配置。可以指定Display Category显示分类、Add to Control Panel是否添加到控制面板(默认不勾选)、Entry Category实体分类、Entry Weight实体权重、Create Entry Class是否创建实体类(默认不勾选)、EntryClass实体类名等信息,这里默认即可。

4、指定在Portlet类中生成的修饰符、结构和方法存根

modifiers:修饰符。分为public、abstract、final三种修饰符,默认为public。

Interfaces:点击Add可以添加接口。

最后是选择想要创建的方法存根,默认即可。

[Liferay6.2]Liferay入门级portlet开发示例

第四步配完之后,就可以点击“Finish”完成portlet的创建了。最终生成的代码这里就不演示了,大家可以在github上查看示例工程的代码。

比较两种方法,我认为手工编辑的步骤有些繁琐,个人建议还是根据向导进行创建。

生成portlet插件工程部署包

由于新建插件工程的时候,我们选择的构建方式是Ant,在插件构建之后,IDE的的Ant的视图中就自动添加了该portlet插件的构建脚本。

[Liferay6.2]Liferay入门级portlet开发示例

Ant的build方式很简单,直接双击即可,build成功之后就会在{liferay tomcat的主目录}\deploy下生成一个war包。

第一次部署没成功,报的错误是:

Buildfile: F:\liferay\liferay6.2cega4\liferay-plugins-sdk-6.2\portlets\liferay-6.2-ce-ga4-demo-portlet\build.xml
deploy: BUILD FAILED
F:\liferay\liferay6.2cega4\liferay-plugins-sdk-6.2\build-common.xml:: The following error occurred while executing this line:
: The following error occurred while executing this line:
F:\liferay\liferay6.2cega4\liferay-plugins-sdk-6.2\build-common.xml:: The following error occurred while executing this line:
: The following error occurred while executing this line:
F:\liferay\liferay6.2cega4\liferay-plugins-sdk-6.2\build-common.xml:: The following error occurred while executing this line:
: The following error occurred while executing this line:
F:\liferay\liferay6.2cega4\liferay-plugins-sdk-6.2\build-common.xml:: The following error occurred while executing this line:
F:\liferay\liferay6.2cega4\liferay-plugins-sdk-6.2\build-common.xml:: F:\liferay\liferay6.2cega4\bundles\tomcat-7.0.42\webapps\ROOT\WEB-INF\lib does not exist. Total time: seconds

根据标红的提示可知,该路径不存在,解决的办法是打开liferay-plugins-sdk-6.2\build.properties,重新修改app.server.parent.dir,使其正确指到liferay-portal-6.2-ce-ga4应用包的路径,这里可以用相对路径也可以用绝对路径。

    #
# Specify the application server parent directory.
#
#app.server.parent.dir=${sdk.dir}/../bundles
app.server.parent.dir=${sdk.dir}/../liferay-portal-6.2-ce-ga4

部署portlet插件工程

在IDE中启动tomcat,portlet插件war包会被自动部署起来。

如果在构建部署包之前,tomcat已经启动了,那么点击Ant build之后,生成的war包会被直接热部署起来。

部署成功之后,我们可以通过liferay的控制面板中的应用程序,查看到该portlet工程,其中包含了一个自动生成的示例portlet以及我们通过向导创建的portlet。

[Liferay6.2]Liferay入门级portlet开发示例

在页面中添加portlet

如下如所示,我们点击左侧的“添加”图标,会打开左侧的一个小窗口,在应用程序中,我们可以在示例分类下面找到我们创建的两个portlet,鼠标选中拖拽到页面布局中,即可展现出portlet。

[Liferay6.2]Liferay入门级portlet开发示例

上一篇:使用checkstyle来规范你的项目


下一篇:Java non-javadoc