从产品展现页面谈谈Hybris的特有概念和设计结构

今天这篇文章来自个人同事,SAP成都研究院Hybris开发团队的开发人员Zhang Jonathan(张健)。须要特别介绍的是,张健和成都研究院的其余开发同事不一样,张健毕业于电子科技大学,读的专业是英语,也就是说Jonathan是文科背景。可是张健毕业后的第一份竟然选择了编程工做,并且是在IBM大型机上的编程工做。没错,就是用下面这个庞然大物写代码, 厉害吧!前端

而后,Jonathan在他大四上学期时,参加了IBM在电子科技大学计算机学院开展的大型机培训,今后开始了他的大型机编程之路。用的编程语言是COBOL。好古老的编程语言啊!git

一个英语专业的毕业生从事IBM大型机编程工做,这自己就很传奇了。然而传奇尚未结束,2016年末,Jonathan选择了跨编程语言跨行业,从他已经积累了丰富开发经验的COBOL语言大型机开发领域里,转投Java开发。他申请了SAP成都研究院Hybris开发工程师的职位,这以前他只是业余自学过Java,有过不到半年的Web项目经验。web

(若是是通常的软件公司,对于这种profile和岗位需求不太符合的简历,可能直接就拒掉了。可是在Jonathan应聘以前,SAP成都研究院有过成功的案例。咱们以前招过一位一样是英语专业背景的应聘者。该应聘者毕业后10年期间一直从事英语专业的工做, 只是业余时间喜欢写代码。他应聘的是SAP Fiori开发工程师。成功经过面试后,他利用在SAP成都研究院工做的18个月时间,成为了一位前端大神。他叫Wu Ji吴脊)面试

时任SAP成都Hybris开发团队项目经理的Derry和我一块儿对Jonathan进行了面试,Derry给Jonathan用优盘拷贝了一份Hybris开发环境,替他申请了一个访问Hybris帮助文档的帐号,而后布置了三道题目。这三道题目的内容是在这个Hybris开发环境上,给当前版本的Hybris实现一些新的功能。spring

Jonathan完成得很是迅速,天天经过邮件向Derry和我汇报完成进度,同时提出一些他在完成题目过程当中的思考和疑问。最后只花了一周时间很是完美地完成了这三道题。我以为考虑到他英语专业的背景和过去大型机的开发经历,这一切简直难以想象。docker

如今Jonathan在SAP成都Hybris开发团队工做了1年多的时间,已经成长为团队里开发的中坚力量,赢得了团队里全部同事们的信任。数据库

下文是Zhang Jonathan(张健)的原创文章。编程


本文介绍的Hybris全称是Hybris ECP(Enterprise Commerce Platform), 为简单起见,下面一概简称为Hybris。windows

Hybris是SAP旗下的电商平台产品,在国外电商产品评测中都位居前列,是兼顾扩展性和易用性的综合性平台。下图为gartner的2017电商产品评测报告。 mvc

注1: 上图报告来自网站

https://www.hybris.com/en/gmc32-gartner-mq-digital-commerce

这篇文章将结合hybris的产品展现页面,简单介绍一下hybris的主要概念和工程结构。

首先介绍下一些hybris特有的概念。

1. accelerator

在hybris里,accelerator是指由一些hybris功能模块构成的,能完成b2b和b2c等电商场景的hybris实例。通常译为加速器,用于模拟和演示用途,也能够根据客户需求作一些简单的定制开发直接用于生产环境。

2. recipe

recipe是用来安装hybris的一些脚本,具体存在于hybris的installer文件夹下的recipe子文件夹。能够用来安装加速器,SAP整合版本乃至docker版本的hybris实例,每一个recipe拥有以本身名字命名的文件夹,里面具备一个build.gradle文件, 其内容是全部安装此recipe须要的脚本。

3. extension

从业务来说,extension是服务于某个hybris业务的功能模块。从工程来说,解压hybris后,bin文件夹的每一个子文件夹内都包含一个工程文件夹,每一个工程文件夹都是一个extension. recipe安装的组件就是若干extension的组合。

4. template

hybris的设计具备很好的产品可扩展性,这表现为Hybris提供了不少模板工程(template extension)供客户参考,扩展,或直接使用。本文介绍的产品页面的View层就存在于yacceleratorstorefront这个模板内。

Hybris的层级结构划分

咱们再来介绍一下hybris的整体结构划分。

Hybris和不少主流Web应用同样,使用Spring Framework进行开发。以常见的使用Spring MVC的工程为例,通常可简单分为前端页面(View层),Spring MVC Controller和Spring注入的Service(Controller层),整合ORM框架的DAO(Model层)。

Hybris大体划分为三层,和经典MVC不一样在于: Hybris前端页面和Spring MVC Controller统一为View层,Service和DAO统一为Service层,Facade(即DTO数据传输对象层)在中间单独为一层。这三层都分别存在于一个extension内,继而构成hybris工程的总体。

注2: 上图的DTO, Converter和Populator的概念将在后续系列文章详细介绍,这里只需简单理解成它们的做用就是把业务数据从数据库里读取出来而且进行格式转换便于提供给Controller用于最终将数据展示在UI上。DAO和DTO都不是Hybris特有的概念,而是软件系统设计中的通用概念,其定义以下:

本次演示安装的是hybris 6.5的release版本,安装包是大小为2GB左右的zip文件。以windows为例,解压后,简单用下面几个命令就可从installer文件夹启动一个hybris的实例。其中的initialize步骤是数据初始化的过程,时间较长请耐心等待,咱们使用的b2c_china这一recipe就是SAP成都研究院的Hybris开发团队开发的中国定制版加速器。

cd $HYBRIS_HOME_DIR/installer
install.bat -r b2c_china setup
install.bat -r b2c_china initialize
install.bat -r b2c_china start

在hybris启动完毕后,用以下连接打开首页后,任意点击一个产品便可进入产品详情页面。

https://localhost:9002/yacceleratorstorefront?site=electronics

由于一个hybris实例能够支持多个电商网站共享一套代码,相似SAP Hybris Cloud for Customer里的multi-tenant的概念, 因此访问某一网站须要加上site这个参数。

以下图:

本文接下来将介绍从用户点击产品连接,到看到该产品的详情页面这一过程,Hybris应用背后到底发生了哪些事情。

产品的连接是以"/p/+产品代码"结尾的一串很长的字符,"/p/"以前的部分是用产品详细类别和产品名称拼成的,根路径是yacceleratorstorefront。

前面也提到过yacceleratorstorefront是hybris主要的view层template extension,它位于bin/ext-template目录下。在它的web/src目录下有spring mvc controller的代码; web/webroot目录下则包含了全部的前端页面代码(使用JSP+Jquery)。

在上述web/src目录中找到产品页面展现的ProductPageController里的方法productDetail(productCode),其中获取产品明细数据经过调用facade层的productFacade.getProductForCodeAndOptions(productCode, extraOptions) 方法,能够继续查看此方法的实现,看它如何返回产品的DTO对象ProductData。

在facade的具体实现DefaultProductFacade里,能够看到ProductData是由ProductConverter的convert方法基于ProductModel生成的。那么什么是Converter呢?为何必定要调用它来生成DTO对象呢?

这里咱们能够先找到DefaultProductFacade的位置,它位于bin/ext-commerce这个文件夹下的commercefacades。这个extension正如它的命名,实际上还提供了不少如订单,产品目录等等的commerce相关的DTO对象。观察它的结构,能够找到resource文件夹下有两个xml文件,commercefacades-beans.xml和commercefacades-spring.xml。前者是定义DTO对象的地方,后者固然是提供spring配置的。

在Hybris里,不管DTO对象(以Data结尾的Java类)仍是DAO对象(以Model结尾的Java类), 都不是经过直接手动编写Java代码来建立的,而是经过在xml文件里定义对象属性, 而后通过编译,以POJO(Plain old Java object)的形式生成在platform这个extension里。 经过这种基于配置文件生成Java类的方式,实现了对象定义和代码的隔离。这样即便之后须要给对象增减属性, 不再用去逐一添加修改属性对应的get和set方法,只须要改变xml里对应的定义,从新编译便可。

注3: POJO也不是SAP Hybris的一个专属概念,而是软件设计里的一个通用概念。Wiki定义以下:

https://en.wikipedia.org/wiki/Plain_old_Java_object

下一篇咱们将详细介绍Hybris的Facade层和Service层, 包括DTO, DAO, Conveter, Populator这些模块的做用。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

相关文章
相关标签/搜索