Lifeary体系结构,这个文章是我自己翻译的,第一次翻译,自己都感觉不是很满意。请见谅。
I.
概述
II.
III.
IV.
V.
VI.
I.
概述
Users 能够从商业和无线设备进入门户。开发者能够从开放的API通过SOAP、RMI和我们定制的渠道类来访问门户。
II.
Portlet API (JSR 168)
Liferay 是被设计来发布门户网站,门户网站是符合Portlet API(JSR 168)的。 许多实用的Portlet 捆绑了邮件、文件、日历、信息平台等门户,并且能够增加自己定制的门户来作为例子。.
III.
Struts and Tiles
所有的HTTP和WAP请求都通过MainServlet, MainServlet继承自基础Struts的ActionServlet. MainServlet 处理所有请求并且保证每一个请求都按照正确的PorletAction来发送。学习Struts能够更好的理解门户网站的框架功能。
门户的所有的规划信息都集中在两个文件当中:portal_layout.jsp 和portlet_layout.jsp。这些文件存放在
/portal-web/docroot/WEB-INF/html/tiles文件夹中。关于Tiles的文章能够更加方便的了解Tiles是如何作为规划管理器来工作的。
Funambol是一个很好的例子网站,这个网站修改了门户规划来支持独立的外观和感觉。
IV.
会话EJBs and Hibernate
Liferay是很少的门户中的一个,它建立了自己的Portlet container和支持会话EJB的Portlet。我们要支持EJB是因为我们的很多用户需要通过会话EJB的分布支持
会话EJB给Lifera提供了一个分布式的支持事务的逻辑层。是的,那是笨重的,而且对于小型项目是非常没有必要的。但是他对于我们很有有着大型网站的用户是非常重要的
业务逻辑集中在会话EJB中,持久性数据使用Hibernate。Liferay以前是依靠CMP技术来实现持久性。但是现在转变成Hibernate,因为它速度更快,弹性更好。Liferay具有数据库无关性,能够在各种流行的数据库中运行
Liferay使用JAAS网站安全,也就是说当一个用户登录的时候,他们的信息将传给Servlet和EJB层。在EJB层校对安全和授权可以是它不能在别处被复制,这对于远程的会话EJB是有益的。本地会话EJB把业务逻辑暴露给其他的会话EJB,它不需要特殊的核对安全,因为它不能被远程调用。
使用会话EJB永许我们把系统分成WEB服务器、EJB服务器和数据库服务器,能够建立三层集群。n层的发布是可以的,因为不能强行说集群就是任何的一层,能够允许大公司最大的可扩展性。
大部分的我们的EJB,HBM和模型都是通过ANT任务build-ejb生成的,可以阅读ejb.xml 在portal-ejb文件夹中。每一个持久数据的Portlet都有一个ejb.xml文件(搜索
/portal-ejb,你会找到的),当我们要为portlet生成持久的对象的时候我们会把这个文件拷别到
/portal-ejb文件夹中。这是一个内在的工具,这个工具在上面的Xdoclet引擎中建立。
例如,阅读在书签Portlet中找到的ejb.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对象不是,在这情况下就能够允许多层架构。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryHBM
com.liferay.portlet.bookmarks.ejb.BookmarksFolderHBM
增加、修改、删除、查找、删除和计算得Hibernate入口的持久方法被生成做为默认的持久化机制。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryPersistence
com.liferay.portlet.bookmarks.ejb.BookmarksFolderPersistence
生成Helper对象来调用持久化方法。Helper对象默认调用Hibernate的持久化方法来更新数据库,你能够在 portal.properties中修改它,使用你自己的持久化方法,只要他继承默认的持久化对象。这就意味着你在存储数据的时候能够定制。你能使用传统的数据库,LDAP服务甚至其他的东西。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderUtil
Pooling对象也能创建,用来最小化对象的新建。你也能在portal.properties中修改。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryPool
com.liferay.portlet.bookmarks.ejb.BookmarksFolderPool
继承自PrincipalSessionBean的管理对象生成用来保存核对呼叫者信息的业务逻辑,它能够被远程调用。调用getUserId()返回当前用户的ID,调用getUser()返回代表当前用户的用户模型。例如,一些对象允许你删除一条书签和文件夹,当且仅当你是这个条目或者文件夹的创建者。
如果这些对象不存在,那么这些对象仅仅能能创建一次。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerEJB
创建Helper对象反映了Manager对象。Helper对象帮助保存开发时间,阻止污染代码。而不是写几行代码仅仅是为了查找和创建合适的会话EJB。你调用BookmarksEntryManagerUtil.addEntry就是调用了BookmarksEntryManagerEJB.addEntry等同的方法。.
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManager
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerHomeUtil
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManager
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerHomeUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerUtil
因为Tunneling对象被生成 ,所以开发者能够调用通过80端口来调用Manager对象,在这个文档的第五部分给出了一个例子。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryManagerHttp
com.liferay.portlet.bookmarks.ejb.BookmarksFolderManagerHttp
本地的Manager对象继承自BasicSessionBean ,生成用来保存业务逻辑,它并不核对调用者的信息,能够被本地调用。因为这些对象存在,所以业务逻辑能够容易的和其他的项目进行整合。
如何这些对象不存在,能够被新建一次。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerEJB
Helper对象也会被创建。
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManager
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerHomeUtil
com.liferay.portlet.bookmarks.ejb.BookmarksEntryLocalManagerUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManager
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerHomeUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderLocalManagerUtil
一些用户需要远程的调用本地的管理对象,所以和本地对象平行的对象也被生成了。com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManager
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerHomeUtil
com.liferay.portlet.bookmarks.ejb.BookmarksEntryRemoteManagerUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManager
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerEJB
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerHome
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerHomeUtil
com.liferay.portlet.bookmarks.ejb.BookmarksFolderRemoteManagerUtil
很多人们通过会话EJB做外部接口,因为他们是沉重的,需要很多的代码。当我们最小化重复工作,以至于你能建立一个成绩与结果的最佳平衡。这些测试表明我们能够平衡会话EJB的优点。
V.
SOAP, RMI, and Tunneling
所有的远程EJB都能够通过SOAP、RMI和我们定制的通道对象来和外面的世界对接。
我们不能简单的处理它,因为Web服务已经逼近了。但是因为我们发现它对于整合是非常的有用,下面是一个公司整合这些资源的例子。
3sixteen 是一家T恤衫公司,他们需要快速建立,快速运行起来。他们看到了liferay,并且想使用整合的购物Portlet,他们认为liferay对于t恤衫公司来说是很难看的,他们为自己在时尚的尖端和自豪。为了解决这个问题,他们决定把他们的WEB表示曾分成两个网站,一个产品册子网站一个购物网站。
www.3sixteen.com使用Flash成为一个漂亮的网站,my.3sixteen.com成为了一个使用香子兰liferay发布的购物网站,这两个网站建立在两个不同的linux服务器上,因为意图和作用被放在不同的地方。
他们也必须建立一个邮件列表来收集他们感兴趣的客户的邮件列表。为了完成它,他们在Flas网站上增加了一个JSP弹出页面,这个页面能够通过门户服务器来增加email地址到Address Book portlet的联系中。
以下是JSP片段,这些片段显示了3sixteen 的小伙们如何通过ABContactManagerHttp 来增加联系信息。
String URL = "http://my.3sixteen.com";
HttpPrincipal httpPrincipal = new HttpPrincipal(URL, "joe_bloggs", "password");
ABContactManagerHttp.addContact(httpPrincipal, firstName, lastName, emailAddress);
ABContactManagerHttp调用了ABContactManagerUtil中的addContact 方法。这个调用能够通过80端口被http://my.3sixteen.com/tunnel/servlet/AuthTunnelServlet接收到。应用服务能够确保匹配鉴定,然后处理ABContactManagerUtil来判断是否id为 joe_bloggs的用户在调用ABContactManagerUtil 的addContact,然后调用ABContactManagerEJB 来处理实际该做的事情,你能够跟踪这些逻辑通过察看包含在生成的JAVADocs中的源代码。
现在Joe Bloggs能够记录进门户,并且察看他的地址簿门户看他有了一个新的联系人。因为Helper对象的生成,所有包含的portlet都有这样的能力。这就意味着我们能够编写Applet或者其他的JAVA应用来进入已经包含你的业务逻辑的会话EJB。这就能有一个安全的风险,如果有人有了你的密码,所以你能够调配来限制Tunnel Servlet 仅仅监听特定的端口,可以在portal.properties中调配。
你也能通过SOAP和RMI进入会话EJB,我们很快会发出更多的例子
VI.
应用服务提供商
Liferay 被建立在从后台一直到被应用服务提供者使用。下面是一些门户的例子,创建了一个连接一个数据库的门户的实例,展示了liferay的性能。
每一个这些门户中的用户都没有其他门户的信息,他们通过域分开,每一个门户都通过公司的ID存在于自己的空间中。
看Multiple Portals 获得创建在一台机器上的多个liferay实例的详细信息