從產品展現頁面談談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的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼:

相關文章
相關標籤/搜索