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

文章作者:张健(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的一个具体实现类, 位于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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

原文地址:https://www.cnblogs.com/sap-jerry/p/8438654.html

时间: 2024-08-25 10:39:17

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

仿腾讯云手机端产品展示页面类swiper效果(附源码)

老婆做项目非需要做得像腾讯云手机端产品展示效果,有点像swiper,但还是点不一样,研究了很久发现用现有的swiper功能没办法实现,没办法只好想办法把腾讯云的抠下来研究一下.现在大公司的前端做的都非常高端,经过了二个多小时我才算是把效果给弄下来了. 源码下载地址:http://pan.baidu.com/s/1i46hXK5

【ASP.NET基础】简单企业产品展示网站--产品编辑CIUD

摘要:本文记录创建一个小的.简单的产品网站的步骤. 一,搭建一个简单的产品展示网站,熟悉以下知识点:NVelocity模板引擎.Ajax无刷新页面请求,文件上传,Row_Number实现分页,ckEditor使用,Bootstrap的简单使用.[点击查看网站效果] 二,网站基本框架:新建项目ProductWeb ,并完成基本框架的搭建(SQLHelper,ckEditor,Common_Nvelocity,Bootstrap等添加到项目中).并创建ProductWebDB .[下载基本模板框架]

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

这是一个精致的立体图片切换效果,特别适合企业产品展示,可立即用于实际项目中.支持导航和自动播放功能, 基于 CSS3 实现,推荐使用最新的 Chrome,Firefox 和 Safari 浏览器浏览效果. 效果演示      源码下载 您可能感兴趣的相关文章 Web 开发中很实用的10个效果[源码下载] 精心挑选的优秀jQuery Ajax分页插件和教程 12个让人惊叹的的创意的 404 错误页面设计 让网站动起来!12款优秀的 jQuery 动画插件 十分惊艳的8个 HTML5 & JavaS

支持移动手机的响应式产品展示幻灯片特效

在线预览   源码下载 Mono是一款支持移动手机的响应式产品展示js幻灯片特效.该特效在每一个幻灯片slide中展示一个产品大图,以及产品的名称,并且每一个幻灯片slide的背景颜色可以进行平滑的切换过渡.它的特点还有: 响应式.支持视口大于320像素的浏览器. 支持移动手机. 跨浏览器.在IE8和IE9浏览器中,该特效会自动进行回退.你可以使用respond.js来是该特效在IE8中使用 media query. 使用简单. Mono是Sequence.js的一个主题.Sequence.js

微信公众平台支持接收和发送微信小视频 微信小店产品展示更全方位

微信公众号支持小视频功能已上线.这个功能对微信小店来说是个大利好,产品展示更多方位,某宝颤抖了么?已微信认证的公众号可接收来自微信用户的小视频,并作为素材下发给微信用户,增强公众帐号与粉丝实时互动性. 1. 公众号接收来自微信用户的小视频,并保存到素材库. 2. 公众号将小视频插入图文消息中,并下发给微信用户.下发渠道包括群发消息.自定义回复.自动回复等.

sharepoint designer + XSLT快速构建数据展示页面

准备展示数据 准备一个测试列表,添加部分测试数据 生成母版页 1.用designer打开需要创建页面的网站 2.点击左侧"所有文件",将需要做为母板页的静态页面拖入designer内(相关的css和js文件也拖入,当然也可以建一个文件夹存在,不放在根目录) 3.在高级模式下打开此静态页面,另存为母板页 4.以高级模式编辑母板页,将需要动态展示的区域替换为占位符(多个占位符ID不要重复),替换之后保存. 使用母板页建立展示页面 1.基于母板页的建立展示页面 2.以高级模式打开展示页,使用

如何修改magento产品详细页面的栏目

magento默认模板里面的产品信息页面的布局是以两栏带右侧栏显示的,那么如何修改为两栏带左侧栏或者三栏.一栏的方式显示呢?下面教大家一种很简单的方法就可以实现.下面是默认的布局预览:修改成两栏带左侧栏后的效果:修改成三栏后的效果:修改成一栏效果: 这样的效果很容易实现的,首先你需打开catalog.xml文件1.3版本app > design > frontend > default > deault > layout > catalog.xml1.4版本app &g

【j2ee spring】32、巴巴运动网的产品类别页面

巴巴运动网的产品类别页面 1.项目图解 这里面好多页面都是错的,只是个模板,暂时用不上,需要的代码我会全部贴出来,最后做完的时候我会把项目发上来 2.首先我们引入相应的jar包 3.首先我们组装整个页面的整体格局 页面的素材我会上传的,链接是:http://download.csdn.net/detail/cutter_point/8803985 top.jsp <%@ page contentType="text/html;charset=UTF-8"%> <%@

Github展示页面总结

(本文为参考众多文章后的自我总结) 1.安装git Mac无须安装git,自带命令功能.windows(https://git-for-windows.github.io/index.html) 2.在github上创建项目仓库 start a project 取名,剩下的默认,create repository,完成. 3.上传代码 用刚才安装的git将本地代码上传到github. ①打开项目目录 cd /d/myGit/navcarousel (或者直接把文件夹拖过来) ②初始化版本库,用于