Liferay7开发文档_1.2作为开发平台

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结构:

你好,你的portlet-layout.png

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看起来像这样:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

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

<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>

<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>

<%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>

<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>

<liferay-theme:defineObjects />

<portlet:defineObjects />

它所做的只是声明你可能想要使用的tag库,然后调用一些tags来使portlet框架中的对象可用。

你还需要看下view.jsp

<%@ include file="/init.jsp" %>

<jsp:useBean id="userName" type="java.lang.String" scope="request" />

<p>

    <b>Hello, <%=userName %>!</b>

</p>

现在我们有了一些东西。portlet类(以MVC术语来说,Controller)在请求中提取一个名为userName的字符串,提供给JSP,并用它向用户打招呼。因此,真正的功能在portlet类中:

@Component(
    immediate = true,
    property = {
        "com.liferay.portlet.display-category=category.sample",
        "com.liferay.portlet.instanceable=true",
        "javax.portlet.display-name=hello-you Portlet",
        "javax.portlet.init-param.template-path=/",
        "javax.portlet.init-param.view-template=/view.jsp",
        "javax.portlet.resource-bundle=content.Language",
        "javax.portlet.security-role-ref=power-user,user"
    },
    service = Portlet.class
)
public class HelloYouPortlet extends MVCPortlet {

    @Override
    public void render(RenderRequest renderRequest, 
                    RenderResponse renderResponse)
            throws IOException, PortletException
    {
        ThemeDisplay themeDisplay = (ThemeDisplay)
                    renderRequest.getAttribute(WebKeys.THEME\_DISPLAY);

        User user = themeDisplay.getUser();

        renderRequest.setAttribute("userName", 
                    user.getFirstName());



        super.render(renderRequest, renderResponse);
    }

}

顶部是@Component注释,它告诉OSGi容器应该如何处理这个模块。指定immediate=true,表示当部署了这个模块并且它的所有依赖都满足时,它应该立即启动,而不是被延迟加载。接下来是几个特定于portlet的属性:在Liferay的用户界面中显示的类别,显示名称,默认视图等。最后,定义服务实现(只是一个Java接口),这是个portlet类。

这个类扩展了Liferay的MVCPortlet类(延伸GenericPortlet,实现Portlet)。唯一重写的render()方法,Liferay的API用于获取用户的名字并将其放入一个名为request的属性中userName

您看到它是如何工作的:portlet运行并提取用户的名字,将其放入request请求中,然后通过使用@Component注释中指定的模板路径和视图模板属性将处理转发到view.jsp用户的第一个名称被获取并显示。

有趣是bnd.bnd文件:

Bundle-SymbolicName: com.liferay.docs.hello.you
Bundle-Version: 1.0.0

这声明了module模块的名称(有时也称为bundle包)。为了避免容器中的命名冲突,正确定义命名空间是一种好做法。该版本也需要声明,允许容器管理模块版本级别的依赖关系。这称为语义版本控制,是一个重要讨论话题。

这就是这个portlet的全部。接下来,您将看到一个extension扩展,在许多情况下,它比portlet更简单。

Liferay的用户界面分为几个区域。有控制菜单和产品菜单,其中包含添加菜单和模拟菜单。如果你想扩展UI,你可以通过部署一个可以添加你想要的模块来实现。在本例中,您将添加一个链接到产品菜单,该菜单默认位于浏览器的右上角:

产品菜单unchanged.png

为此,将添加一个站点链接:

产品选单与 - link.png

您可以通过部署组件来在产品菜单的添加链接。

与portlet一样,该工程布局易于理解。

产品菜单项目layout.png

和前面一样,你有一个构建脚本,一个声明模块名称和版本的bnd.bnd文件,一个Java类和一个语言属性文件。

Java类只定义了四个方法:

@Component(
    immediate = true,
    property = {
        "product.navigation.control.menu.category.key=" +
                 ProductNavigationControlMenuCategoryKeys.USER,
        "product.navigation.control.menu.entry.order:Integer=1"
    },
    service = ProductNavigationControlMenuEntry.class
)
public class DevProductNavigationControlMenuEntry
    extends BaseProductNavigationControlMenuEntry
    implements ProductNavigationControlMenuEntry {

    @Override
    public String getIcon(HttpServletRequest request) {

        return "link";
    }

    @Override
    public String getLabel(Locale locale) {

        ResourceBundle resourceBundle = ResourceBundleUtil.getBundle(
            "content.Language", locale, getClass());

        return LanguageUtil.get(resourceBundle, "custom-message");
    }

    @Override
    public String getURL(HttpServletRequest request) {

        return "https://dev.liferay.com";

    }

    @Override
    public boolean isShow(HttpServletRequest request) throws 
        PortalException {

        return true;
    }

}

如前所述,此工程是Blade CLI通过模板生成的。源代码是模板的一部分; 你需要做的唯一事情就是提供链接。

第一种方法获取您想要在菜单中使用的Font  Awesome icon图标。接下来得到“label”,即用户将鼠标悬停在链接上时显示的文本。该文本在Language.properties文件中的唯一属性值:

custom-message=Liferay Developer Network

下一个方法返回这个链接的目标URL,最后的方法返回一个布尔值来显示或隐藏链接。

部署此模块时,链接将在模块启动时添加到菜单中。您不必在Liferay的JSP或JavaScript文件中查找来自定义菜单:它是一个扩展点,它被设计为自定义。

这是模块化开发范例。它可以帮助保持代码的清晰分离,无论是应用程序还是扩展,都来自默认发布的代码,并且可以让您在运行时动态自更新,以避免停机。这是一种不同的模式,当你开始使用模块并获得的好处时,我们认为你会同意这是一种很好的模式。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值