LIFERAY作为开发平台
如果你读了前面的内容,应该了解了Liferay Portal的架构,模块化和技术。下面将讲讲如何通过Liferay平台自定义或开发来创建网站。
WEB应用程序和PORTLET
作为一个开发平台,Liferay可在一个页面轻松部署多个应用程序,这为管理员和开发人员提供了灵活性。以这种方式编写的应用程序称为portlet,这是Liferay平台的支柱。您可以使用Liferay的MVC Portlet框架或Spring MVC或JSF等通用框架编写portlet。如果您打算为您的应用程序提供基于Web的界面,并且希望管理员能够灵活配置,Portlet提供了非常强大的模型。您可以创建多个portlet而不是更庞大的应用程序,让管理员选择如何将它们与其之前的portlet在界面上组合。
你也有其他选择。Liferay将其业务逻辑从它的UI(由单独模块提供)解耦,所以可自由选择其他UI技术实现。
可以将Liferay作为Headless平台使用,你可以利用Service Builder快速创建JAX-RS和JAX-WS的Web服务。然后用任何喜欢的前端技术或移动技术构建独立应用。
可扩展性
正如您所想,上述系统包含了架构良好系统的必需工具,该系统允许开发人员不仅可以创建基于模块的应用程序,还可以扩展系统现有功能。
组件使开发扩展和自定义变得方便。如果您将此模型与其他产品进行比较,您会看到它的便利性。
要定制现有服务,您需要做的唯一事情就是部署一个组件。如果你想删除你的实现并恢复到默认行为,你只需解除部署你的组件。
将其与传统的软件开发模式比较。
每次软件更新时,您都必须重新下载源代码,重新应用您的修补程序并重新编译软件。
使用Liferay,您的自定义代码将保存在您自己的模块中,容器根据您提供的元数据来处理这些模块。
开发者工具
Liferay的OSGi容器为你提供了这些好处:
- 容器可以启动和停止组件。
- 一个组件实现一个OSGi服务。
- 组件可直接使用或调用OSGi服务。
- 该框架管理组件所调用的服务绑定(就像Spring或EJB一样,但是动态的)。
听起来都很棒,剩下的只有一件事:你如何开始开发组件?我们为新手提供了一条轻松途径,同时为有工具偏好的老手保留了灵活性。Liferay提供了一些很好的工具,如果你是一位经验丰富的开发人员,这些工具也可以整合到现有工具中。如果您使用标准构建工具(如Gradle或Maven),文本编辑器或以及Java IDE(如Eclipse,intelliJ或NetBeans)或测试框架(如Spock或JUnit),可以让它们与Liferay一起协作。
Liferay的工具提供了一些重要的增强功能:
- Blade CLI通过从模板创建基于Gradle的Liferay项目。
- Liferay Workspace是基于Gradle的自定义SDK,它使用Blade CLI将项目和运行时集成到一个便捷,可分发和可共享的区域。
- Liferay IDE是一个Eclipse的开发环境,它将Blade CLI和Liferay Workspace的所有功能集成到一个最佳图形环境中。
- Liferay Developer Studio提供Liferay IDE提供的所有功能,以及企业开发人员需要的附加工具。
- Liferay Service Builder通过从单个XML文件生成所有数据库表,本地服务和Web服务,帮助您更快地创建后端。
您可以选择使用或忽略Liferay的工具。这很灵活,因为Liferay提供了一个开放的开发框架。我们反对专有和捆绑,因此我们的工具旨在补充,而不是替换。
除了构建工具和IDE之外,您将使用应用程序开发框架。Liferay的开发框架包括许多功能(评论,社交关系,用户管理等等),以加快应用程序的开发。它们可帮助您从提供充分测试的,现代,可扩展,可换肤开发模块搭建应用程序。您的应用程序不仅功能强大,还可以花费更少的时间,并且工作良好。这并不意味着你仅限于Liferay提供的内容; 如果您喜欢使用,完全可以使用第三方框架。
为了开发portlet,Liferay提供了一个方便且易于使用的框架,名为MVCPortlet,使编写portlet变得简单,但开发人员可以使用任何其他框架(如Spring MVC)来创建portlet。MVCPortlet使用组件来处理请求,受益于上述所有特性(生命周期,可扩展性,易于组合等)。
Liferay还包括一个名为Service Builder的实用工具,它可以方便地创建后端数据库表、用于访问它们的Java对象关系映射,以及放置业务逻辑的位置。它还可以生成JSON或SOAP web服务,为开发人员提供使用web或移动客户端存储和检索数据的完整堆栈。但这并不妨碍您使用Java Persistence (JPA)并生成JAX-WS web服务。
除了工具之外,Liferay还提供了许多可重用框架。
框架和API
Liferay的开发平台为应用程序开发提供了一个很好的框架,并提供API。很多情况下。应用程序可以通过利用Liferay的框架来创建,这些框架封装了应用程序常见功能。例如,评论系统允许开发人员对他们定义的任何资产附加评论,不管他们新开发的,还是系统自带的资产。资产由系统共享,用于表示许多常见元素,例如用户,组织,站点,用户组,博客条目,甚至文件夹和文件。
Liferay还包括许多用于资产运营的框架。工作流可以轻松创建需要审批流程的应用程序。回收站在指定的时间段内存储已删除的资产,无需管理员的干预即可轻松恢复数据。具有多个可用后端的文件存储API使存储和共享文件简单到不值一提。搜索也内置于系统中,并且为与其应用程序集成做了专门设计。开发复杂应用程序时所需的许多框架已经存在; 您只需要利用它们:社交网络API,带有数据列表的用户生成表单,消息总线,审计系统等等。
LIFERAY项目示例
是时候练习了。展示Liferay开发风格的好方法是通过一些项目。首先,您将看到一个使用MVCPortlet开发的portlet,并展示组件的使用。下一个是extension扩展。这两个示例都向您展示了遵循模块化范例构建功能的容易程度。
很高兴向您展示标准的Hello World项目,Liferay风格,但这太容易了:Blade或Liferay IDE创建的默认模板已经默认使用该模板。您会看到Hello You portlet。除了将用户的名字添加到消息之外,它与Hello World的功能相同。如果你的名字因此是John,它会返回Hello, John。
以下是Project结构:
Hello You portlet有一个简单的项目结构。
此项目由Liferay的Blade CLI工具生成后,没有创建任何新文件,所以这个过程非常简单。你定义的portlet类在.java文件中。您还有两种不同的资源:language properties和JSP文件。最后,该bnd.bnd
文件描述了OSGi容器的应用程序元数据,并且该build.gradle
文件构建了该项目。
任何熟悉Java的Web开发人员都可以理解这些JSP,但是由于风格的原因,有些解释是有序的。这里定义了一个init.jsp
文件,包含前端所需的所有 imports和tag库初始化代码。这样,任何JSP都可以简单包含init.jsp
,声明所有imports。该init.jsp
看起来像这样:
它所做的只是声明你可能想要使用的tag库,然后调用一些tags来使portlet框架中的对象可用。
你还需要看下view.jsp
:
现在我们有了一些东西。portlet类(以MVC术语来说,Controller)在请求中提取一个名为userName
的字符串,提供给JSP,并用它向用户打招呼。因此,真正的功能在portlet类中:
顶部是@Component
注释,它告诉OSGi容器应该如何处理这个模块。指定immediate=true
,表示当部署了这个模块并且它的所有依赖都满足时,它应该立即启动,而不是被延迟加载。接下来是几个特定于portlet的属性:在Liferay的用户界面中显示的类别,显示名称,默认视图等。最后,定义服务实现(只是一个Java接口),这是个portlet类。
这个类扩展了Liferay的MVCPortlet
类(延伸GenericPortlet
,实现Portlet
)。唯一重写的render()
方法,Liferay的API用于获取用户的名字并将其放入一个名为request的属性中userName
。
您看到它是如何工作的:portlet运行并提取用户的名字,将其放入request请求中,然后通过使用@Component
注释中指定的模板路径和视图模板属性将处理转发到view.jsp
用户的第一个名称被获取并显示。
有趣是bnd.bnd
文件:
这声明了module模块的名称(有时也称为bundle包)。为了避免容器中的命名冲突,正确定义命名空间是一种好做法。该版本也需要声明,允许容器管理模块版本级别的依赖关系。这称为语义版本控制,是一个重要讨论话题。
这就是这个portlet的全部。接下来,您将看到一个extension扩展,在许多情况下,它比portlet更简单。
Liferay的用户界面分为几个区域。有控制菜单和产品菜单,其中包含添加菜单和模拟菜单。如果你想扩展UI,你可以通过部署一个可以添加你想要的模块来实现。在本例中,您将添加一个链接到产品菜单,该菜单默认位于浏览器的右上角:
为此,将添加一个站点链接:
您可以通过部署组件来在产品菜单的添加链接。
与portlet一样,该工程布局易于理解。
和前面一样,你有一个构建脚本,一个声明模块名称和版本的bnd.bnd
文件,一个Java类和一个语言属性文件。
Java类只定义了四个方法:
如前所述,此工程是Blade CLI通过模板生成的。源代码是模板的一部分; 你需要做的唯一事情就是提供链接。
第一种方法获取您想要在菜单中使用的Font Awesome icon图标。接下来得到“label”,即用户将鼠标悬停在链接上时显示的文本。该文本在Language.properties
文件中的唯一属性值:
下一个方法返回这个链接的目标URL,最后的方法返回一个布尔值来显示或隐藏链接。
部署此模块时,链接将在模块启动时添加到菜单中。您不必在Liferay的JSP或JavaScript文件中查找来自定义菜单:它是一个扩展点,它被设计为自定义。
这是模块化开发范例。它可以帮助保持代码的清晰分离,无论是应用程序还是扩展,都来自默认发布的代码,并且可以让您在运行时动态自更新,以避免停机。这是一种不同的模式,当你开始使用模块并获得的好处时,我们认为你会同意这是一种很好的模式。