Liferay 6开发学习(二十四):Liferay开发模式介绍

在Liferay IDE 2.0中我们创建Liferay插件工程的时候,有以下几个选项:

§ Portlet

§ Service Builder Portlet

§ Hook

§ Layout Template

§ Theme

§ Ext

这是Liferay提供的几种插件模式,还有一种直接基于源码的开发,本篇文章即为介绍这几种模式的差异,我们在什么样的情况下选择哪种模式更合适,这里只所以说更合适是因为选择什么样的开发模式,并不是非此即彼,在实际中我们可以组件使用。

在《Liferay 6.1开发学习(二):创建一个Portlet工程》这篇博客中,对这些模式有过一个大概的介绍,本篇进行一个详细的扩充说明。

Portlet

当我们在Liferay之上进行二次开发,是根据自己的业务需要开发Portlet时,一般选择此模式,也就是普通的插件工程,如果一般没有特殊说明,我们在讨论Liferay插件工程时,即指的此种模式。

在此种模式中我们可以加入Struts框架支持(Struts1、Struts2)、Spring MVC、JSF等支持JSR168和JSR286标准的MVC框架,同时也可以加入hibernate、Spring、CXF等其他后台业务框架。

整个Portlet工程的结构很类似一个标准的Java Web工程,在此工程的代码逻辑等部分,除了展现层,也即MVC框架支持的层面,其他层面的代码(比如Service层、Dao层)和普通的Java Web的处理逻辑都是一样的。

Service Builder Portlet

这个模式是在Liferay IDE 2.0里面才新加的,其实也不是一个新东西,和第一个Portlet模式基本无差异,差异地方就在于使用此模式建立Portlet插件工程时,会在WEB-INF生成一个Service.xml的文件。在第一种Portlet里面,我们也可以加入这个文件。

Hook

关于Hook工程的介绍请参考这篇博客《Liferay 6.1开发学习(九):Hook开发简介》,在这篇文章里面对Hook做了一个大概的介绍。那我们什么情况下选择使用Hook呢?

1、当我们对Liferay本身提供的一些功能想做微小调整的时候,这个是最大的前提,也就是需要对Liferay进行微小的调整,如果是进行大面积的调整时,则一般使用ext或直接基于源码开发。

2、当我们想修改Liferay本身的一些界面上的字样、文字的摆放位置、页面的排版等;

3、当我们对Liferay本身的一些翻译不太满意的时候;

4、当我们对Liferay自带功能(博客、文件媒体库、wiki等)的业务处理逻辑不太满意的时候;

5、当我们对Liferay一些事件处理过程(比如登录前事件、登录后事件、系统初始化前、系统初始化后)想做调整的时候;

以上这些情况都可以使用Hook,举几个实例:

1、我们对登录界面不满意,想做一些个性化的定制,这个时候就可以使用hook来覆盖登录portlet里面的登录界面的JSP即可;

2、比如我们想在Liferay里面加入百度统计(默认只支持google的统计,和6.2加入的pwiki),就可以hook在top_js.jsp,在里面加入相应的百度统计代码即可;

3、比如我们想控制用户登录后的页面跳转逻辑,我们使用hook来覆盖登录后事件即可;

4、比如我们想对验证逻辑进行一些调整,如支持无论用户输入用户ID、屏幕名称、email都可以登录(默认是只能配置一个),这个时候我也们可以hook一下UserLocalService即可;

5、比如我们想在Liferay里面全局引入jquery或者其他的JS框架,也同样的使用hook;

6、比如我们想让Liferay文件媒体库里面文件下载之后带上版本号,我们也可以hook文档管理的Service;;

7、比如我们想在Liferay启动的时候,放一些信息到request里面,我们可以hook初始化前事件。

8、……等等;

Layout Template

这个类型为布局模板,也就是开发我们的Portlet有几行几列的布局。请参考《Liferay 6.1开发学习(七):Layout布局模板开发》,由于这部分比较简单,不再重复。

Theme

Theme也就是我们说的主题开发,如果我们想让Liferay变个样子,或者是想让Liferay运行起来达到我们的界面设计人员所设计的界面,就需要借助于主题。

1、比如经常有人问的,怎么去掉页面下方的“技术支持 Liferay”等,这就可以在主题的portal_normal.vm里面进行修改;

2、比如我们想让dockbar根据不同的角色来显示或者是直接隐藏掉,也可以在Portal_normal.vm里面进行调整。

3、比如我们想定制导航条的显示效果、背景颜色、按钮形状、tab的样式等等都是在Theme里面实现。

总而言之,如果是想让Liferay换个样子,我们就借助于主题。关于主题详细介绍,同样的也参看之前写的《Liferay 6.1开发学习(八):主题开发》。

Ext

在Liferay的早期开发中,主要采用Ext的模式,在Ext模式中我们可以对Liferay进行任意的修改和调整,覆盖Liferay自身的任何类、方法、JS、JSP、css等,上面的几种模式的开发,我们在Ext模式里面都能够实现。

使用Hook能够实现的功能,我们使用Ext模式全部都可以做,但反过来就不可以,也就是Ext能做的事情,Hook不一定能做得了。

那Ext与Hook的明显差异在哪呢?

1、hook工程部署之后不需要重启,ext必须重启应用才会生效;

2、Ext可以覆盖Liferay所有的类,而hook对类的覆盖调整,是基于代理或一些接口来实现的;Ext是直接按原路径覆盖,在类加载的时候根据配置文件,加载相应的ext下面的类;

3、Ext模式相对来说会比较重,而且有较强的入侵性,会在Liferay的Root目录下面复制许多的文件进去;

那什么时候采用Ext,什么时候采用Hook呢?

1、在要修改的内容不多的前提下,我们优先选用Hook,如果Hook不能满足需求,再选用Ext;

2、当我们要修改的内容稍多,只是修改,不涉及对源码的删除时,采用ext;

3、当我们需要调用portal-impl里面的类,或者对这里面的方法进行修改的时候,采用Ext;

4、发现了Liferay的一些影响项目进行的bug,可以采用ext进行修复(其实也就是上面的1的内容,对源码修改的内容不多,同时hook又不能满足需求)。

基于源码开发

最不推荐的模式为直接基于源码开发,源码的编译调试,可以参考这篇文章《Liferay 6.1开发学习(五):编译调试修改源码》。有以下情况时推荐采用基于源码的开发模式:

1、对Liferay进行裁剪,删除自带的Portlet,相关类等;

2、对Liferay本身的功能进行大面积的修改调整。

实际中一般不推荐基于源码的开发,原因有以下几点:

1、工作量比较大,同时需要一个对Liferay的源码结构有一定了解的人;

2、调整源码可能带来一些不确定的Bug;

3、比如现在是对Liferay6.2.0的源码进行了大量的修改,明天Liferay发布了7.0版本,这个时候想升级是很困难的;

总结

在这些开发模式中,前五种基本上是平级的,一般考虑的顺序为Portlet=Theme=Hook>Ext>基于源码的开发。在实际的项目中,一个稍大点的项目上面的开发模式,除了基于源码的开发,其他的一般都会用到。

比如在我们的项目中一般会存在:

1、多个Portlet工程:按大的模块拆分工程,一个Portlet工程下面包含多个portlet。

2、两个theme工程:一个前台主题、一个后台主题。

3、一个Hook工程:用来对一些内容进行Hook,比如登录、引入JS、一些业务逻辑调整、翻译调整等。

4、一个Ext工程(根据实际情况而言,此工程也不是必须的):对一些Liferay本身的功能进行调整,以更方便项目的进行;

可能有同学问了,那这样一个项目下来,岂不是有五六个工程?能不能合成一个呢?当然是可以的,我们可以直接将这些功能都合并到Portlet工程或者theme工程里面。但是一般还是推荐将这些分工,以方便维护。

你可能感兴趣的:(Liferay 6开发学习(二十四):Liferay开发模式介绍)