Liferay Portal系统架构点滴
原文地址: http://www.liferay.com/web/guest/documentation/architecture
目录
Liferay Portal系统架构点滴 1
目录 1
I、综述 1
II、Portlet 应用接口(JSP168) 2
III、Struts 和 Tiles 2
IV、Session EJBs、Spring和Hibernate 3
V、SAOP、RMI和Tunneling 5
VI 应用服务器 6
I、综述
用户可以通过传统的或者无线网络的方式访问portal。开发者可以通过SOAP、RMI和自己定义的通道类访问暴露的API来操作portal。
II、Portlet 应用接口(JSP168)
Liferay设计成为部署符合(JSP168)Portlet 应用接口的Portlet。很多有用的Portlet(比如邮件、Liferay文档、日立、公告版和其他)已经跟portal绑定,而且可以作为添加自定义的Portlet的范例。
III、Struts 和 Tiles
所有的HTTP和WAP请求都通过MainServlet响应,MailServlet扩展了Struts基类ActionServlet。 MainServlet处理所有的请求,使得每个请求都路由到合适的PortletAction。 想要更好的理解portal的web框架请参考Struts。
Portal的布局信息通过定制的模板管理。想要更好的理解Tiles如何管理布局的,请参考Tile的相关文章。
IV、Session EJBs、Spring和Hibernate
Liferay不再依赖EBJ,可以部署在标准的servlet容器中。所有的业务逻辑都集中在可以被Spring查找和实例化的POJO实现中。这些实现都可以通过Spring的AOP和IOC修改或者强化。
Portal 企业版使用Session EJB包装POJO实现,以为大型网站提供所需的重量级扩展和事务支持。Portal 专业版调用POJO实现以提供轻量级的一致的外观(fa?ade)。
所有的数据都使用Hibernate持久化,供POJO实现调用。 Liferay原来使用CMP技术构建持久化, 因为Hibernate优秀的速度和弹性而转换为Hibernate。 Liferay不依赖特定的数据库,可以在多种流行的数据库上运行。
Liferay使用JAAS Web安全机制,当用户登录的时候,他们的信息会被传送到相应的Servlet和EJB节点。远程的Session EJB可以利用这一点,在EJB层级确认安全性和授权,防止它在其他地方被复制。本地Session EJB向其他Session EJB暴露业务逻辑,不需要明确的确认安全性,因为它们不会被远程调用。信息也会被传送到作为远程Session EJB基础类的POJO实现上。
企业版使用Session EJB,允许部署者将Web服务器、EJB服务器、数据库服务器分开,构建三层的架构。这是真正的N层部署,因为没有人再关注单层的群,而且可以为大企业提供最大程度的弹性。
大部分的EJB、HBM和Model都是用/portal-ejb目录下service。xml中的ant任务build-service生成的。每个持久化数据的Portlet都有自己的service。xml。(搜索/portal-ejb目录,你就可以得到一个列表)。当我们想要为portlet产生持久类的时候就可以复制这些文件到/portal-ejb目录。这是一个构建在Xdoclet引擎上面的内部工具。
比如,在读取Bookmarks Portlet的service。xml时,下列模型类被生成。每个模型类映射数据库中的一个表。不要编辑BookmarksEntryModel,要通过编辑BookmarksEntry来增加手工维护的代码。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类生成针对各个模型类的映射。这样当模型类跨层配置而Hibernate不是的时候允许一个N层的架构。
com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryHBM
com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderHBM
添加、更新、删除、查找、移动和计算Hibernate entries的持久方法作为默认的持久化机制被生成。
com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryPersistence
com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderPersistence
生成的帮助类调用持久化方法。默认的,帮助类调用Hibernate持久化方法来更新数据库。你可以在portal。properties中重写,而且只要扩展了默认的持久化类就可以设置自己的持久化类。这意味着可以自定义在哪里保存你的数据。它可以是一个传统的数据库,或者LDAP服务器,或者其他。
com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryUtil
com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderUtil
池类也被创建成最小的对象,行为也可以在portal。properties中修改。
com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryPool
com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderPool
扩展了PrincipalBean的POJO实现持有业务逻辑,确认调用者信息,可以被远程调用。调用getUserId()返回当前用户id。调用getUser()返回代表当前用户的用户模型。扩展POJO实现的Session EJB实现了PrincipalSessionBean。
比如,这些类允许你删除一个书签入口或者文件夹,当且仅当你是这个入口或者文件夹的创建者。
这些类只有在它们不存在的时候才能被生成。
com.liferay.portlet.bookmarks.service.impl.BookmarksEntryServiceImpl
com.liferay.portlet.bookmarks.service.impl.BookmarksFolderServiceImpl
帮助类是基于POJO实现生成的。它们帮助保存开发者的时间和显示错误(polluted)的代码。与其写好几行代码来寻找合适的Session EJB包装或者POJO实现,你可以简单的使用BookmarksEntryServiceUril。addEntry来调用BookmarksEntryServiceImpl。addEntry中的等价方法。
BookmarksEntryServiceUril 调用BookmarksFolderServiceFactory来查找实现BookmarksEntryService的类。BookmarksFolderServicesFactory根据Spring和portal。properties的配置来决定是否加载Session EJB包装或者POJO实现。Session EJB扩展了POJO实现。
com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryServiceEJB
com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryServiceEJBImpl
com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryServiceHome
com.liferay.portlet.bookmarks.service.spring.BookmarksEntryService
com.liferay.portlet.bookmarks.service.spring.BookmarksEntryServiceFactory
com.liferay.portlet.bookmarks.service.spring.BookmarksEntryServiceUtil
com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderServiceEJB
com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderServiceEJBImpl
com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderServiceHome
com。Liferay.portlet.bookmarks.service.spring.BookmarksFolderService
com。Liferay.portlet.bookmarks.service.spring.BookmarksFolderServiceFactory
com。Liferay.portlet.bookmarks.service.spring.BookmarksFolderServiceUtil
通道(Tunneling)类使得开发者可以通过80端口调用POJO实现。本文档的V部分针对这个给出了一个例子。
com.liferay.portlet.bookmarks.service.http.BookmarksEntryServiceHttp
com.liferay.portlet.bookmarks.service.http.BookmarksFolderServiceHttp
Soap类被生成,以便开发者通过80端口调用POJO实现。Soap比通道(tunneling)慢,因为tunneling请求流是二进制格式的。Soap比tunneling灵活,因为客户端类不局限于Java。
com.liferay.portlet.bookmarks.service.http.BookmarksEntryServiceSoap
com.liferay.portlet.bookmarks.service.http.BookmarksFolderServiceSoap
没有扩展PrincipalBean的POJO实现类用来持有业务逻辑,不用确认调用者的信息,可以被本地调用。这些类的存在使得业务逻辑可以很容易的被其他工程集成。
这些类只有在先前不存在的情况下才会被生成。
com.liferay.portlet.bookmarks.service.impl.BookmarksEntryLocalServiceImpl
com.liferay.portlet.bookmarks.service.impl.BookmarksFolderLocalServiceImpl
帮助类也一并生成。
com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryLocalServiceEJB
com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryLocalServiceEJBImpl
com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryLocalServiceHome
com.liferay.portlet.bookmarks.service.spring.BookmarksEntryLocalService
com.liferay.portlet.bookmarks.service.spring.BookmarksEntryLocalServiceFactory
com.liferay.portlet.bookmarks.service.spring.BookmarksEntryLocalServiceUtil
com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderLocalServiceEJB
com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderLocalServiceEJBImpl
com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderLocalServiceHome
com.liferay.portlet.bookmarks.service.spring.BookmarksFolderLocalService
com.liferay.portlet.bookmarks.service.spring.BookmarksFolderLocalServiceFactory
com.liferay.portlet.bookmarks.service.spring.BookmarksFolderLocalServiceUtil
有一些用户需要远程调用本地的Service类,所以远程Service类的本地副本也一并被生成。
com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryRemoteServiceEJB
com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryRemoteServiceEJBImpl
com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryRemoteServiceHome
com.liferay.portlet.bookmarks.service.spring.BookmarksEntryRemoteService
com.liferay.portlet.bookmarks.service.spring.BookmarksEntryRemoteServiceFactory
com.liferay.portlet.bookmarks.service.spring.BookmarksEntryRemoteServiceUtil
com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderRemoteServiceEJB
com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderRemoteServiceEJBImpl
com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderRemoteServiceHome
com.liferay.portlet.bookmarks.service.spring.BookmarksFolderRemoteService
com.liferay.portlet.bookmarks.service.spring.BookmarksFolderRemoteServiceFactory
com.liferay.portlet.bookmarks.service.spring.BookmarksFolderRemoteServiceUtil
很多人刻意避免Session EJB因为它很重和需要大量的编码。我们的构建脚本证明你可以在复用中保持Session EBJ的优势,这样可以在付出和回报上保持很好平衡。
Spring给予Liferay额外的弹性。 开发者利用Liferay Portal,可以在一个Servlet容器中测试他们的POJO实现;而利用Liferay Portal企业版,可以在一个应用服务器部署成产品。
V、SAOP、RMI和Tunneling
所有的远程POJO实现都通过SOAP、RMI和我们自己的通道(Tunneling)类暴露给外部世界。
我们并不是简单的这样做因为Web Service还是一个困顿(buzz)的世界,但是我们发现它确实对集成有用。接下来是一个公司平衡这些资源的例子。
3 sixteen是一家将快速创建和运作的T恤公司。他们看到Liferay,想利用集成的购物 portlet。但是他们认为Liferay作为一个处于时尚前沿的T恤公司站点太难看了。为了解决这个问题,他们决定将他们的网站分为两个站点:一个手册站点和一个购物站点。
www。3sixteen。com 成为一个构建在Flash上面的漂亮的站点。my。3sixteen。com则是使用Liferay分发的购物站点。这两个站点分别放在不同的Linux系统主机上,所有的目的放在不同的宿主上。
他们还需要构建一个邮件列表来收集所有感兴趣的客户的邮件地址。为实现这个,他们再Flash站点增加了一个JSP弹出窗口(pop up box),这样可以告诉Portal服务器在Address Book Portlet中将邮件地址增加到联系列表(contact)。
下面是一个JSP片断,显示3sixteen的用户如何利用ABContactServiceHttp增加一个联系列表。
ABContactServiceHttp调用ABContactServiceUtil的addContact。这个调用通过80端口发送,被http://my。3sixteen。com/tunnel/servlet/AuthTunnelServlet接收。应用服务器确认认证匹配,然后处理ABContactServiceUtil,就好像ID为joe_bloggs的用户在调用addContact。然后ABContactServiceUtil调用ABContactServiceImpl来完成实际工作。你可以通过查看JavaDocs里面的源代码来查看这个逻辑。
现在Joe Bloggs可以登录到portal,在Address Book portlet可以看到他已经有一个新的联系列表。所有被包含的portlet都有这个性能因为这些帮助类已经生成。这意味着你可以撰写applet或者任何Java应用来操作那些包含你的业务逻辑的Session EJB。假如有人持有你的密码那么这会是一个安全问题,所以你可以通过修改配置文件portal。properties来限制通道(Tunnel)Servlet只监听特定的端口。
你也可以通过SOAP和RMI操作Session EJB。我们将尽快提交更多这方面的例子。
VI 应用服务器
Liferay是从底层构建的,可以被应用服务器所用。下面是一个Portal例子列表,显示portal连接数据库以及展示Liferay的性能。
http://demo.liferay.net
http://my.ccuc.net
http://my.3sixteen.com
http://portal.liferay.com
http://www.gatewayfriends.org
http://www.jasonandiris.com
每个Portal中的用户在其他Portal中没有信息保留。他们用域名分隔开,根据公司编号存在于各自的空间内。
查看Multiple Portal获取细节信息,了解如何在一台机器上部署多个Portal实例。
作者 : eamoi @ Aljoin Software
Dev2dev ID: educhina
Blog地址:
http://spaces.msn.com/members/eamoi/
http://blog.sina.com.cn/u/1183534285
http://www.blogjava.net/eamoi/
posted on 2005-10-08 11:42
eamoi 阅读(7730)
评论(2) 编辑 收藏 所属分类:
Java