文章作者:张健(Zhang Jonathan)

上一篇文章 从产品展示页面谈谈Hybris的特有概念和设计结构 我们讲解了Hybris一些特有的概念以及大体架构,并且介绍了Facade层里是如何定义DTO(Data Transfer Object)对象。

一个尚未回答的问题: 为什么DTO(在上一篇文章的具体例子里是Java类ProductData)会由Converter来生成?

这篇文章就从此问题开始。

我们再次翻出上一篇文章展示过的这张架构图。

当我们打开一个Hybris应用网页,比如某个Product(产品)的明细页面时, 背后实际上执行了下列的逻辑:

  1. Service层从数据库里把数据取出,以Model(又称为DAO对象)的形式返回给Facade层。

  2. Facade层调用Converter, 在Populator的帮助下,基于Model生成了DTO。

  3. 明细页面的Controller将其对应的JSP路径返回给Hybris框架。

上述步骤完成之后,我们即可看到数据填充完毕之后的Hybris Product明细页面。

本文将详细介绍上述步骤(2), 即DTO的生成逻辑。

DAO

当点击这个名为DSC-H20 BLUE的产品图片后,

可以跳转到它的明细页面。

其中DAO的生成,也就是下图137行代码里的变量productModel的生成逻辑,会在下一篇文章即这个系列的第三篇文章详细阐述。 本文我们重点介绍DTO(第138行变量productData的生成逻辑)。

现在我们可以简单地把DAO对象,即变量productModel理解成它包含了DSC-H20 BLUE这个产品在数据库里存储的明细。

如果有ABAP开发经验的朋友,可以把这个变量包含的内容类比成ABAP里通过OPEN SQL从透明表里取出的数据。 这些数据由于格式原因还不能直接给上层的UI做展示,而需要经过进一步的加工和处理。这些加工由下文的converter和populator来完成。

DTO

之前我们介绍了DTO(productData)是由第138行的convert方法生成的。这个方法的调用者是getProductConverter方法返回的一个Converter的实例,该实例实际上是Spring框架帮我们注入的一个Bean。对Bean这个概念不熟悉的朋友可以用关键字”Spring Bean”在百度或者Google上搜索。

那么ProductConverter这个Bean的Spring相关定义在Hybris项目文件夹的什么地方呢?

  1. Converter

前一篇文章从产品展示页面谈谈Hybris的特有概念和设计结构介绍过,产品相关的Facade层存在于bin/ext-commerce/commercefacades这个extension。而在其中的resource/commercefacades-spring.xml文件中可以找到productConverter的定义:

第137行到139行表明实际注入的populators属性是一个列表(List),这个List里的每一个元素是ProductPopulator。 从List这个数据结构我们可以猜想到,Converter主要是通过调用1个或多个Populator来生成DTO对象的。

  1. Populator

我们再来看看Populator这个接口的代码,它定义了一个名为populate(SOURCE,TARGET)的方法。方法的注释清楚地说明了Populator是用Source变量的字段值去生成(Populate)Target变量的字段值,如下图所示。

回到我们的Product明细页面的展示例子。在ProductPopulator中:

  • Source对应Java类ProductModel

  • Target对应Java类ProductData

可见, Populator一般用于从Service层的DAO对象生成Facade层的DTO对象。

关于Populator的实际例子, 我们可以看看ProductUrlPopulator这个类, 它是接口Populator的一个具体实现类, 位于package**de.hybris.platform.commercefacades.product.converters.populator**下面。从这个package下面我们也能发现很多其他的Populator,这也解释了本文Converter章节里介绍的为什么Populator属性注入的类型需要选择为List。

从populate方法中可以看到:

  • DTO ProductData里的code和name属性的值都是直接取自DAO ProductModel里对应的同名属性;

  • DTO ProductData的url属性则是第47行的resolve方法根据DAO ProductModel计算出来的。

这个resolve方法的使用,表明了Populator不只是简单的把DAO对象的值设置到DTO对象中。在Hybris的标准实现里诸如Product url属性这样需要调用其它Service来处理后然后再展示到前端的例子还有很多。

比如商品的库存,多货币价格等信息, 在数据库端本来就没有和产品信息存在同一张表,自然也不能直接从Product的DAO对象中获取,而是需要在相关的Populator里调用单独的物流处理和价格处理的Service来生成。

这里我们再回想下Hybris的三层结构图。

设想下如果没有Facade层和DTO对象,前端的Controller将不得不调用很多Service,返回很多单独的Model(如产品,物流和价格信息)给页面,加重页面处理的负担。而Hybris的Facade层包装了Service层的复杂逻辑,为前端提供了简明统一的DTO对象,大大降低了前端的处理复杂度。这正是面向对象设计模式中的Facade(外观)模式的体现,因此我们能够从Hybris的架构图中发现Facade层的名字。

希望大家通过这篇文章对Hybris Facade层的Converter和Populator能有比较详细的了解。下一篇我们将继续介绍Hybris的Service层。

Jerry注:

优秀的产品总是有着相似的设计思路。本文介绍的DAO和DTO, 不仅仅出现在Hybris里,在SAP的很多其他产品里也有用到。

在SAP CRM里,从ABAP数据库里取出的数据因为结构差异无法直接被SAP CRM的BSP UI消费,必须要在图中的Generic Interaction Layer里做一个结构和格式的转换:

下图是SAP CRM UI上产品长文本字段的一个截图:

这个长文本字段的值, 从数据库取出到最后显示在UI上,也经历了在Populator(下图的ABAP类: CL_CRM_PRODIL_LONGTEXT)里从DAO到DTO的转换。

至此我们能发现无论是在SAP Hybris还是SAP CRM里,这种DAO到DTO的映射都体现在具体的代码里。

而在SAP Business by Design, SAP Hybris Cloud for Customer和SAP S/4HANA里,这种DAO到DTO的映射关系则维护在一些模型里。这样, 应用开发人员负责维护映射关系,而框架负责统一处理映射关系。即使将来因为业务变化导致这些映射关系也需要发生变化,此时可以仅修改维护映射关系的模型,而无需修改任何代码。

SAP把底层模型层(Model Layer)和上层消费层(Consumption Layer)之间的存储及解析映射关系模型的这一中间层称为SADL(Service Adaptation Definition Layer, L在有的上下文里也称为Language)。维护映射关系的模型则成为SADL模型。如下图所示:

在这个系列的下一篇文章里,Jonathan将介绍Hybris Commerce的持久层设计原理。

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

从产品展示页面谈谈Hybris系列之二: DTO, Converter和Populator相关推荐

  1. 从产品展示页面谈谈Hybris系列之三:Hybris Service层介绍

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  2. 业务展示类网站高保真原型模板库、企业品牌官网、公司业务介绍、产品展示及营销、首页模板、内页模板、单页模板、整站模板、导航、轮播、横幅、列表、客户、案例、页脚、动态面板、母版、页面事件、窗口函数

    本作品是一套专为业务展示类网站而推出的原型模板库,适用于制作企业品牌官网.公司业务介绍.产品展示及营销等各类网站.作品中包含了符合目前主流展示类网站设计风格的丰富模板及素材,并以UI设计稿级别的高保真 ...

  3. php制作商品展示页面,wordpress如何做产品展示页

    产品展示用到文章和缩略图功能 实现步骤: 一.创建分类 后台创建文章分类:产品中心 二.开启缩略图功能 在主题的functions.php中,添加一段代码,代码如下:add_theme_support ...

  4. 电商产品设计:谈谈促销功能的实现逻辑

    电商产品设计:谈谈促销功能的实现逻辑 七月订阅专栏取消订阅 汪汪社区里的一只喵. 2017-07-12 1.5万 170 23 产品经理就业班,12周特训,测.练.实战,22位导师全程带班,200+名 ...

  5. 精致3D图片切换效果,最适合企业产品展示

    这是一个精致的立体图片切换效果,特别适合企业产品展示,可立即用于实际项目中.支持导航和自动播放功能, 基于 CSS3 实现,推荐使用最新的 Chrome,Firefox 和 Safari 浏览器浏览效 ...

  6. 互联网3D数字化时代,3D产品展示开启新商机

    随着互联网技术的发展,越来越多的企业开始借助互联网宣传自己的产品,在淘宝.京东.得物等电商平台上,可以看到一些商家开始在线上3D展示产品. 早在2020年,就提出要普及5G商用,3D技术开始发展成熟, ...

  7. 实践任务1:利用 HBuilderX制作产品展示模块+实践任务2:利用 HBuilderX制作公司网站首页+实践任务3: 利用 HBuilderX制作公司网站首页实现固定侧边菜单

    实践任务1:制作产品展示模块 创建一个产品展示product.html网页,在网页展示推荐产品的信息,包含产品图片.名称和规格说明,网页效果如图所示.本任务利用盒子模型来实现四个产品图的展示,使用盒子 ...

  8. 3个必看的常见问题解答页面示例,帮您重做产品FAQ页面F

    成功的企业都有个共性特点,永远将客户体验放在第一位.95%的消费者认为良好的客户体验对品牌忠诚度很重要. 提供一流的客户体验可能是费时费钱且复杂但确实很有必要执行.但其中有一项被遗忘的客户服务策略是经 ...

  9. 网页中商业产品展示页制作方法探讨

    网页中商业产品展示页是非常主动向用户推送内容,起到吸引注册或者使用某个产品等等使用户进一步使用的目的.现在很多的网站的首页经常就会用引导页作为首页,但是国内很多都搞成有奖销售了,不管三七二十一先在展示 ...

最新文章

  1. Java基础 —— 异常
  2. Twitter4j和Esper:在Twitter上跟踪用户情绪
  3. mybatis添加方法可以传map吗_Mybatis中传递多个参数的4种方法总结
  4. 汉游天下公司的一些感悟
  5. 从零开始学 Web 之 ES6(三)ES6基础语法一
  6. Dojo.Layout下的三个布局组件,浓缩精华
  7. 关于seata分布式事务框架的几个问题
  8. getHibernateTemplate()的find用法大全
  9. ubuntu 两行命令自动安装最合适的NVIDIA驱动
  10. 谷歌浏览器software_reporter_tool关闭
  11. linux下的文件io编程实现文件的拷贝
  12. WIN7镜像中增加USB3.0驱动和语言包
  13. android n自带游戏,Android N玩游戏更快了 但国产ROM要等很久
  14. 飞腾PC机器与奔腾G645的PC机器以及E5-2630V4虚拟机内存性能简单对比
  15. 熊写代码这三年:阅读写作与技术成长
  16. 微信小程序之页面样式以及背景图片显示问题
  17. 淘宝双11大数据分析(环境篇)
  18. Unirech阿里云国际版云服务器ecs的应用场景有哪些?
  19. 新手操作更换固态和重装系统竟然这么麻烦?!
  20. 【编程练习】小强去春游

热门文章

  1. 【线性回归】面向新手的基础知识
  2. pyecharts学习(part3)--简单图表绘制及参数优化
  3. Django从理论到实战(part54)--MEDIA_ROOT和MEDIA_URL
  4. 回归树与基于规则的模型(part2)--简单回归树
  5. 利用python爬虫(part10)--Xpath节点集与函数
  6. 《黑天鹅》读书笔记(part2)--我们从重复中学习,但忽略了从未发生过的事件
  7. lede 命令 启用 ssh_PHP imap_open函数任意命令执行漏洞
  8. 77 行代码实现 ABAP ALV 中的双击事件处理
  9. 为什么 SAP 电商云 Spartacus UI SSR 模式下的客户端应用,不会发起 product 请求
  10. TypeScript 的类型推导 Type Inference