Liferay
不再依賴于
EJB
,它完全可以單獨裝配到一個
servlet
容器(如:
Tomcat,JBoss
等)中。而所有的業務邏輯都通過
Spring
管理的
POJO
來實現。這樣的實現利益于
Spring
的
AOP
各
IOC
特性。
但在POJO的實現方法上Liferay的兩個版本有所不同,企業版(enterprise)中通過EJB從而為大站點提供了高擴展性各良好的事務支持能力(如集群),而專業版(professiona)直接通過輕量級的接口完成。
所有的業務數據都通過Hibernate來實現并通過POJO來調用。Liferay曾經使用CMP技術.來實現持久層,但后來因速度及靈活性等原因改用Hibernate。在數據庫方面,Liferay也完全兼容大多數主流類型DB。
Liferay使用JAAS來完成用戶認證安全管理,好處是當一個用戶登錄后,它的安全屬性可以在Servlet和EJB層中沿用,真正作到系統級的SSO。具體講,遠程EJB可以沿用安全檢查及權限屬性,本地的EJB是為其它EJB提供業務邏輯服務的,不能被遠程調用所以也不必做此類檢查;安全原則也派生到POJO實現中,而這此實現其實是遠程EJB的基礎類。
企業版式使用EJB,所以系統分別可以在WEB服務器、EJB服務器、數據庫服務器三層中實現集群。當然在n層的系統中,集群也保持優勢,而且在每一層都并不強迫使用集群,這些都為大企業應用提供了極好的彈性選擇權。
系統中的EJB、HBM、以及模式Model者是ant執行build-ejb任務時,通過讀取目錄/portal-ejb下的ejb.xml文件,然后自動生成的。每個有持久層對象的門戶單元(portlet)都有自己的ejb.xml文件(可以在/portal-ejb下搜索得到清單)。當需要生成持久層的類時,就把文件復制到/portal-ejb下,這生成工具是建立在XDoclet之上的。
例如:通過讀取Bookmarks門戶單元的ejb.xml文件配置后,自動生成下列的模式類。每個類對應數據庫中的一個表。永遠不要手工修改BookmarksEntryModel類,而要通過修改BookmarksEntry,然后再更新BookmarksEntryModel內容。這樣做的好處是減少了直接寫代碼的工作,而只做相應的標記工作。
com.liferay.portlet.bookmarks.model.BookmarksEntry
com.liferay.portlet.bookmarks.model.BookmarksEntryModel
com.liferay.portlet.bookmarks.model.BookmarksFolder
com.liferay.portlet.bookmarks.model.BookmarksFolderModel
Hibernate類是根據模式(model)類對應生成的。這樣就可以在多層系統中允許模式類是可作序列化處理的,而Hibernate類則不必。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryHBM
com.liferay.portlet.bookmarks.ejb.BookmarksFolderHBM
持久層的方法如:add, update, delete, find, remove, 以及count,系統都默認自動生成。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryPersistence
com.liferay.portlet.bookmarks.ejb.BookmarksFolderPersistence
也生成了專門的協助類(Helper classes),可以用來調用持久層方法。默認時,協助類調用Hibernate的方法來對數據庫進行更新操作,但是也可以改寫portal.properties中的配置,使用自己專用的類來完成,但這種類要求要繼承默認的持久層類。換言之,用戶完全可以定制自己的持久層數據,可以是一個正統的數據庫,或者是LDAP服務器,其它什么的。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderUtil
為了減少對象生成的成本,引入了對象池,可以通過修改portal.properties文件來控制池的基本動作。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryPool
com.liferay.portlet.bookmarks.ejb.BookmarksFolderPool
用來實現業務邏輯的POJO類,通過繼承PrincipalBean類,來實現有關調用者的方法,所以可以遠程調用。如:調用getUserId()可以得到當前用戶的ID;調用getUser()則返回當前用戶的對象。EJB再繼承這類POJO,實現遠程調用。
例如:下面的類實現了,允許當且公當bookmark項目或目錄的生成者可以刪除它。這些對象只有在不存在時才可能被創建。
協助類(Helper classes)是在POJO的實現基礎上生成的。它可以節約開發者的工作,不必書寫很多行的代碼,而只要簡單的找到合適的EJB wrapper或POJO實現,通過調用BookmarksEntryManagerUtil.addEntry來間接調用相應的BookmarksEntryManagerImpl.addEntry方法就可以了。
BookmarksEntryManagerUtil通過調用BookmarksFolderManagerFactory來查找實現BookmarksEntryManager的類。也正是通過BookmarksFolderManagerFactory來識別Spring和portal.properties中的配置來決定要是載入EJB wrapper還是POJO實現。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManager
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManager
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerUtil
隧道類(Tunneling classes)是用來實現通過80端口來調用POJO的。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerHttp
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerHttp
Soap類也是用來實現通過80端口來調用POJO的。雖然與隧道類相比Soap類在速度上要差一點,原因是隧道類使用二進制數據流。但Soap類用靈活,可以適用各種客戶端(不局限于Java)。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerSoap
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerSoap
Soap類也是用來實現通過80端口來調用POJO的。雖然與隧道類相比Soap類在速度上要差一點,原因是隧道類使用二進制數據流。但Soap類用靈活,可以適用各種客戶端(不局限于Java)。這些類只有在檢驗到不存在時才會被創建。同時協助類也生成了。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManager
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManager
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerUtil
但總有一些用戶需要調用引種當地類,于是完全相對應的遠程類也應用而生了。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManager
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManager
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerUtil
許多人避免使用EJB,因為它的重量級,需要大量的代碼工作。Liferay的自動生成腳本可以使得,既不損失EJB的優點,而且還最小化重復的代碼等工作,從而你可以在努力與結果之間找到一個良好的平衡點。
Spring也給Liferay帶來了更多的好處。開發者既可以利用專業版在一個servlet容器中測試POJO的實現,也可以通過企業版在應用服務器上裝載要上線的產品。
但在POJO的實現方法上Liferay的兩個版本有所不同,企業版(enterprise)中通過EJB從而為大站點提供了高擴展性各良好的事務支持能力(如集群),而專業版(professiona)直接通過輕量級的接口完成。
所有的業務數據都通過Hibernate來實現并通過POJO來調用。Liferay曾經使用CMP技術.來實現持久層,但后來因速度及靈活性等原因改用Hibernate。在數據庫方面,Liferay也完全兼容大多數主流類型DB。
Liferay使用JAAS來完成用戶認證安全管理,好處是當一個用戶登錄后,它的安全屬性可以在Servlet和EJB層中沿用,真正作到系統級的SSO。具體講,遠程EJB可以沿用安全檢查及權限屬性,本地的EJB是為其它EJB提供業務邏輯服務的,不能被遠程調用所以也不必做此類檢查;安全原則也派生到POJO實現中,而這此實現其實是遠程EJB的基礎類。
企業版式使用EJB,所以系統分別可以在WEB服務器、EJB服務器、數據庫服務器三層中實現集群。當然在n層的系統中,集群也保持優勢,而且在每一層都并不強迫使用集群,這些都為大企業應用提供了極好的彈性選擇權。
系統中的EJB、HBM、以及模式Model者是ant執行build-ejb任務時,通過讀取目錄/portal-ejb下的ejb.xml文件,然后自動生成的。每個有持久層對象的門戶單元(portlet)都有自己的ejb.xml文件(可以在/portal-ejb下搜索得到清單)。當需要生成持久層的類時,就把文件復制到/portal-ejb下,這生成工具是建立在XDoclet之上的。
例如:通過讀取Bookmarks門戶單元的ejb.xml文件配置后,自動生成下列的模式類。每個類對應數據庫中的一個表。永遠不要手工修改BookmarksEntryModel類,而要通過修改BookmarksEntry,然后再更新BookmarksEntryModel內容。這樣做的好處是減少了直接寫代碼的工作,而只做相應的標記工作。
com.liferay.portlet.bookmarks.model.BookmarksEntry
com.liferay.portlet.bookmarks.model.BookmarksEntryModel
com.liferay.portlet.bookmarks.model.BookmarksFolder
com.liferay.portlet.bookmarks.model.BookmarksFolderModel
Hibernate類是根據模式(model)類對應生成的。這樣就可以在多層系統中允許模式類是可作序列化處理的,而Hibernate類則不必。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryHBM
com.liferay.portlet.bookmarks.ejb.BookmarksFolderHBM
持久層的方法如:add, update, delete, find, remove, 以及count,系統都默認自動生成。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryPersistence
com.liferay.portlet.bookmarks.ejb.BookmarksFolderPersistence
也生成了專門的協助類(Helper classes),可以用來調用持久層方法。默認時,協助類調用Hibernate的方法來對數據庫進行更新操作,但是也可以改寫portal.properties中的配置,使用自己專用的類來完成,但這種類要求要繼承默認的持久層類。換言之,用戶完全可以定制自己的持久層數據,可以是一個正統的數據庫,或者是LDAP服務器,其它什么的。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderUtil
為了減少對象生成的成本,引入了對象池,可以通過修改portal.properties文件來控制池的基本動作。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryPool
com.liferay.portlet.bookmarks.ejb.BookmarksFolderPool
用來實現業務邏輯的POJO類,通過繼承PrincipalBean類,來實現有關調用者的方法,所以可以遠程調用。如:調用getUserId()可以得到當前用戶的ID;調用getUser()則返回當前用戶的對象。EJB再繼承這類POJO,實現遠程調用。
例如:下面的類實現了,允許當且公當bookmark項目或目錄的生成者可以刪除它。這些對象只有在不存在時才可能被創建。
協助類(Helper classes)是在POJO的實現基礎上生成的。它可以節約開發者的工作,不必書寫很多行的代碼,而只要簡單的找到合適的EJB wrapper或POJO實現,通過調用BookmarksEntryManagerUtil.addEntry來間接調用相應的BookmarksEntryManagerImpl.addEntry方法就可以了。
BookmarksEntryManagerUtil通過調用BookmarksFolderManagerFactory來查找實現BookmarksEntryManager的類。也正是通過BookmarksFolderManagerFactory來識別Spring和portal.properties中的配置來決定要是載入EJB wrapper還是POJO實現。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManager
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManager
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerUtil
隧道類(Tunneling classes)是用來實現通過80端口來調用POJO的。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerHttp
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerHttp
Soap類也是用來實現通過80端口來調用POJO的。雖然與隧道類相比Soap類在速度上要差一點,原因是隧道類使用二進制數據流。但Soap類用靈活,可以適用各種客戶端(不局限于Java)。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerSoap
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerSoap
Soap類也是用來實現通過80端口來調用POJO的。雖然與隧道類相比Soap類在速度上要差一點,原因是隧道類使用二進制數據流。但Soap類用靈活,可以適用各種客戶端(不局限于Java)。這些類只有在檢驗到不存在時才會被創建。同時協助類也生成了。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManager
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManager
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerUtil
但總有一些用戶需要調用引種當地類,于是完全相對應的遠程類也應用而生了。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManager
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManager
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerEJBImpl
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerFactory
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerUtil
許多人避免使用EJB,因為它的重量級,需要大量的代碼工作。Liferay的自動生成腳本可以使得,既不損失EJB的優點,而且還最小化重復的代碼等工作,從而你可以在努力與結果之間找到一個良好的平衡點。
Spring也給Liferay帶來了更多的好處。開發者既可以利用專業版在一個servlet容器中測試POJO的實現,也可以通過企業版在應用服務器上裝載要上線的產品。