从产品展示页面谈谈Hybris系列之二: DTO, Converter和Populator
文章作者:张健(Zhang Jonathan)
上一篇文章 从产品展示页面谈谈Hybris的特有概念和设计结构 我们讲解了Hybris一些特有的概念以及大体架构,并且介绍了Facade层里是如何定义DTO(Data Transfer Object)对象。
一个尚未回答的问题: 为什么DTO(在上一篇文章的具体例子里是Java类ProductData)会由Converter来生成?
这篇文章就从此问题开始。
我们再次翻出上一篇文章展示过的这张架构图。
当我们打开一个Hybris应用网页,比如某个Product(产品)的明细页面时, 背后实际上执行了下列的逻辑:
Service层从数据库里把数据取出,以Model(又称为DAO对象)的形式返回给Facade层。
Facade层调用Converter, 在Populator的帮助下,基于Model生成了DTO。
明细页面的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项目文件夹的什么地方呢?
- Converter
前一篇文章从产品展示页面谈谈Hybris的特有概念和设计结构介绍过,产品相关的Facade层存在于bin/ext-commerce/commercefacades这个extension。而在其中的resource/commercefacades-spring.xml文件中可以找到productConverter的定义:
第137行到139行表明实际注入的populators属性是一个列表(List),这个List里的每一个元素是ProductPopulator。 从List这个数据结构我们可以猜想到,Converter主要是通过调用1个或多个Populator来生成DTO对象的。
- 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的一个具体实现类, 位于packagede.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的更多相关文章
- 从产品展示页面谈谈Hybris的特有概念和设计结构
今天这篇文章来自我的同事,SAP成都研究院Hybris开发团队的开发人员Zhang Jonathan(张健).需要特别介绍的是,张健和成都研究院的其他开发同事不同,张健毕业于电子科技大学,读的专业是英 ...
- 精致3D图片切换效果,最适合企业产品展示
这是一个精致的立体图片切换效果,特别适合企业产品展示,可立即用于实际项目中.支持导航和自动播放功能, 基于 CSS3 实现,推荐使用最新的 Chrome,Firefox 和 Safari 浏览器浏览效 ...
- 【ASP.NET基础】简单企业产品展示网站--产品编辑CRUD
摘要:本文记录创建一个小的.简单的产品网站的步骤. 一,搭建一个简单的产品展示网站,熟悉以下知识点:NVelocity模板引擎.Ajax无刷新页面请求,文件上传,Row_Number实现分页,ckEd ...
- 循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理
在前面随笔<循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理>中介绍了在Vue + Element整合框架中,实现了动态菜单和动态路由的处理,从而可以根据 ...
- 使用jQuery简单实现产品展示的图片左右滚动功能
今天要做一个产品展示功能,由于产品比较多,一屏展示不完,所以想要做一个通过点击进行翻页的效果,在网上找了几个都不大好用,最后只能自己动手写了. 效果如下所示: 原理比较简单:将要滚动显示的区域的CSS ...
- magento在产品详细页面添加分享链接的方法
1,在产品详细页面的对用位置加入一下代码 <div class="sharethis_box"> <?php echo $this->ge ...
- 用TableView做的新闻客户端展示页面
用TableView做的新闻客户端展示页面 // MyTableViewImageCell.m // SildToDo // // Created by WildCat on 13-8-18. ...
- WordPress主题开发实例:产品展示
产品展示用到文章和缩略图功能 实现步骤: 一.创建分类 后台创建文章分类:产品中心 二.开启缩略图功能 在主题的functions.php中,添加一段代码,代码如下: add_theme_suppor ...
- 如何修改magento产品详细页面的栏目
magento默认模板里面的产品信息页面的布局是以两栏带右侧栏显示的,那么如何修改为两栏带左侧栏或者三栏.一栏的方式显示呢?下面教大家一种很简单的方法就可以实现.下面是默认的布局预览:
随机推荐
- DFS/BFS视频讲解
视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...
- CenctOS6 and CenctOS7 多种姿势解决忘记密码
-----linux---- 忘记密码啦!!! 忘记密码教程!!! 教你们忘记密码(我原来密码就是123456,忘记是不可能的!假装忘记的样子 0.0) 现在我们忘记密码了!对忘记密码了.我忘记密码了 ...
- js 判断各种数据类型 typeof 几种类型值
了解js的都知道, 有个typeof 用来判断各种数据类型,有两种写法:typeof xxx ,typeof(xxx) 如下实例: typeof 2 输出 number ...
- (转)python strip()函数 去空格\n\r\t函数的用法
原文:http://www.cnblogs.com/zdz8207/p/python_learn_note_20.html python3.4学习笔记(二十) python strip()函数 去空格 ...
- (转)Linux网络状态工具ss命令使用详解
Linux网络状态工具ss命令使用详解 原文:http://www.landui.com/help/show-5991.html ss 是 socket statistics 的缩写.顾名思义,ss ...
- 客户端与服务器cookie
认识cookie 第一部分: 概要 cookie是一种早期使用的客户端存储机制(现在仍在广泛使用),cookie数据会在Web浏览器和Web服务器之间传输, 因为早期cookie是针对服务器脚本设计的 ...
- Oracle 客户端、服务器、数据库、数据库对象(表、视图等)的关系
1.数据库服务器 所谓数据库服务器,只是在机器上安装了一个数据库管理软件,这个软件可以管理多个数据库.一般开发人员会针对每一个应用创建一个数据库 2.单实例数据库模式下的数据库服务器.数据库.数据库实 ...
- 用js(JavaScript-jQuery)解析XML文件 无法成功 获得XML对象,字符串一些心得
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/7822962.html 解析XML文件遇到的问题 今天秦博士叫我解析一下XML文件,将里面的所有 ...
- OpenGL Loading
什么是 OpenGL loading? OpenGL是一份API规范,并不是一个库.记住这点非常重要!它意味着每一个API背后的具体实现都依赖于你的GPU硬件.操作系统以及显卡驱动. OpenGL规范 ...
- elasticsearch fitler查询例子