﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-谈笑有鸿儒，往来无白丁-文章分类-Portal相关文档</title><link>http://www.blogjava.net/badboyryan/category/13620.html</link><description>&lt;hr color=red&gt;
&lt;marquee  direction=left bgcolor= aaaaee behavior=scroll scrollamount=2 onmouseover="this.stop();" onmouseout="this.start();" width=500&gt;
&lt;font color=green&gt; 在恰当的时间、地点以恰当的方式表达给恰当的人...&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color=blue&gt;阅读的时候请注意分类，佛曰我日里面是谈笑文章，其他是各个分类的文章，积极的热情投入到写博的队伍中来，支持blogjava做大做强！向dudu站长致敬&gt;&gt; &gt;  （qq群侠客岛:26858781）&lt;/font&gt;
&lt;/marquee&gt; 
&lt;hr color=blue&gt;
&lt;marquee  direction=right bgcolor= aabbee behavior=scroll scrollamount=2 onmouseover="this.stop();" onmouseout="this.start();" width=500&gt;
&lt;font color=green&gt;精品推荐:&lt;/font&gt;&lt;a href="http://www.blogjava.net/badboyryan/category/13259.html"&gt;谈笑有鸿儒&lt;/a&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=green&gt;&lt;a href="http://www.blogjava.net/badboyryan/category/14653.html"&gt;&lt;font color=red&gt;资源整合，门户网站&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;
&lt;a href="http://www.blogjava.net/badboyryan/category/15148.html"&gt;JAVA名人堂&lt;/a&gt;
&lt;/marquee&gt; 
&lt;hr color=red&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:24:49 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:24:49 GMT</pubDate><ttl>60</ttl><item><title>Liferay Portal系统架构点滴 </title><link>http://www.blogjava.net/badboyryan/articles/60949.html</link><dc:creator>谈笑有鸿儒</dc:creator><author>谈笑有鸿儒</author><pubDate>Mon, 31 Jul 2006 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/articles/60949.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/60949.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/articles/60949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/60949.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/60949.html</trackback:ping><description><![CDATA[
		<p>Liferay Portal系统架构点滴<br />原文地址: <a href="http://www.liferay.com/web/guest/documentation/architecture">http://www.liferay.com/web/guest/documentation/architecture</a><br />目录<br />Liferay Portal系统架构点滴 1<br />目录 1<br />I、综述 1<br />II、Portlet 应用接口(JSP168) 2<br />III、Struts 和 Tiles 2<br />IV、Session EJBs、Spring和Hibernate 3<br />V、SAOP、RMI和Tunneling 5<br />VI 应用服务器 6</p>
		<p>I、综述<br />用户可以通过传统的或者无线网络的方式访问portal。开发者可以通过SOAP、RMI和自己定义的通道类访问暴露的API来操作portal。<br /> <br />II、Portlet 应用接口(JSP168)<br />Liferay设计成为部署符合(JSP168)Portlet 应用接口的Portlet。很多有用的Portlet(比如邮件、Liferay文档、日立、公告版和其他)已经跟portal绑定，而且可以作为添加自定义的Portlet的范例。<br />III、Struts 和 Tiles<br />所有的HTTP和WAP请求都通过MainServlet响应，MailServlet扩展了Struts基类ActionServlet。 MainServlet处理所有的请求，使得每个请求都路由到合适的PortletAction。 想要更好的理解portal的web框架请参考Struts。<br />Portal的布局信息通过定制的模板管理。想要更好的理解Tiles如何管理布局的，请参考Tile的相关文章。<br />IV、Session EJBs、Spring和Hibernate<br />Liferay不再依赖EBJ，可以部署在标准的servlet容器中。所有的业务逻辑都集中在可以被Spring查找和实例化的POJO实现中。这些实现都可以通过Spring的AOP和IOC修改或者强化。<br />Portal 企业版使用Session EJB包装POJO实现，以为大型网站提供所需的重量级扩展和事务支持。Portal 专业版调用POJO实现以提供轻量级的一致的外观(fa?ade)。<br />所有的数据都使用Hibernate持久化，供POJO实现调用。 Liferay原来使用CMP技术构建持久化， 因为Hibernate优秀的速度和弹性而转换为Hibernate。 Liferay不依赖特定的数据库，可以在多种流行的数据库上运行。<br />Liferay使用JAAS Web安全机制，当用户登录的时候，他们的信息会被传送到相应的Servlet和EJB节点。远程的Session EJB可以利用这一点，在EJB层级确认安全性和授权，防止它在其他地方被复制。本地Session EJB向其他Session EJB暴露业务逻辑，不需要明确的确认安全性，因为它们不会被远程调用。信息也会被传送到作为远程Session EJB基础类的POJO实现上。<br />企业版使用Session EJB，允许部署者将Web服务器、EJB服务器、数据库服务器分开，构建三层的架构。这是真正的N层部署，因为没有人再关注单层的群，而且可以为大企业提供最大程度的弹性。<br />大部分的EJB、HBM和Model都是用/portal-ejb目录下service。xml中的ant任务build-service生成的。每个持久化数据的Portlet都有自己的service。xml。(搜索/portal-ejb目录，你就可以得到一个列表)。当我们想要为portlet产生持久类的时候就可以复制这些文件到/portal-ejb目录。这是一个构建在Xdoclet引擎上面的内部工具。<br />比如，在读取Bookmarks Portlet的service。xml时，下列模型类被生成。每个模型类映射数据库中的一个表。不要编辑BookmarksEntryModel，要通过编辑BookmarksEntry来增加手工维护的代码。BookmarksEntry一次性生成，扩展了BookmarksEntryModel。这样允许我们轻松的生成代码，而且具备手工维护的弹性。<br />com.liferay.portlet.bookmarks.model.BookmarksEntry<br />com.liferay.portlet.bookmarks.model.BookmarksEntryModel<br />com.liferay.portlet.bookmarks.model.BookmarksFolder<br />com.liferay.portlet.bookmarks.model.BookmarksFolderModel<br />Hibernate类生成针对各个模型类的映射。这样当模型类跨层配置而Hibernate不是的时候允许一个N层的架构。<br />com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryHBM<br />com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderHBM<br />添加、更新、删除、查找、移动和计算Hibernate entries的持久方法作为默认的持久化机制被生成。<br />com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryPersistence<br />com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderPersistence<br />生成的帮助类调用持久化方法。默认的，帮助类调用Hibernate持久化方法来更新数据库。你可以在portal。properties中重写，而且只要扩展了默认的持久化类就可以设置自己的持久化类。这意味着可以自定义在哪里保存你的数据。它可以是一个传统的数据库，或者LDAP服务器，或者其他。<br />com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryUtil<br />com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderUtil<br />池类也被创建成最小的对象，行为也可以在portal。properties中修改。<br />com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryPool<br />com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderPool<br />扩展了PrincipalBean的POJO实现持有业务逻辑，确认调用者信息，可以被远程调用。调用getUserId()返回当前用户id。调用getUser()返回代表当前用户的用户模型。扩展POJO实现的Session EJB实现了PrincipalSessionBean。<br />比如，这些类允许你删除一个书签入口或者文件夹，当且仅当你是这个入口或者文件夹的创建者。<br />这些类只有在它们不存在的时候才能被生成。<br />com.liferay.portlet.bookmarks.service.impl.BookmarksEntryServiceImpl<br />com.liferay.portlet.bookmarks.service.impl.BookmarksFolderServiceImpl<br />帮助类是基于POJO实现生成的。它们帮助保存开发者的时间和显示错误(polluted)的代码。与其写好几行代码来寻找合适的Session EJB包装或者POJO实现，你可以简单的使用BookmarksEntryServiceUril。addEntry来调用BookmarksEntryServiceImpl。addEntry中的等价方法。<br />BookmarksEntryServiceUril 调用BookmarksFolderServiceFactory来查找实现BookmarksEntryService的类。BookmarksFolderServicesFactory根据Spring和portal。properties的配置来决定是否加载Session EJB包装或者POJO实现。Session EJB扩展了POJO实现。<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryServiceEJB<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryServiceEJBImpl<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryServiceHome</p>
		<p>com.liferay.portlet.bookmarks.service.spring.BookmarksEntryService<br />com.liferay.portlet.bookmarks.service.spring.BookmarksEntryServiceFactory<br />com.liferay.portlet.bookmarks.service.spring.BookmarksEntryServiceUtil</p>
		<p>com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderServiceEJB<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderServiceEJBImpl<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderServiceHome</p>
		<p>com。Liferay.portlet.bookmarks.service.spring.BookmarksFolderService<br />com。Liferay.portlet.bookmarks.service.spring.BookmarksFolderServiceFactory<br />com。Liferay.portlet.bookmarks.service.spring.BookmarksFolderServiceUtil<br />通道(Tunneling)类使得开发者可以通过80端口调用POJO实现。本文档的V部分针对这个给出了一个例子。<br />com.liferay.portlet.bookmarks.service.http.BookmarksEntryServiceHttp<br />com.liferay.portlet.bookmarks.service.http.BookmarksFolderServiceHttp<br />Soap类被生成，以便开发者通过80端口调用POJO实现。Soap比通道(tunneling)慢，因为tunneling请求流是二进制格式的。Soap比tunneling灵活，因为客户端类不局限于Java。<br />com.liferay.portlet.bookmarks.service.http.BookmarksEntryServiceSoap<br />com.liferay.portlet.bookmarks.service.http.BookmarksFolderServiceSoap<br />没有扩展PrincipalBean的POJO实现类用来持有业务逻辑，不用确认调用者的信息，可以被本地调用。这些类的存在使得业务逻辑可以很容易的被其他工程集成。<br />这些类只有在先前不存在的情况下才会被生成。<br />com.liferay.portlet.bookmarks.service.impl.BookmarksEntryLocalServiceImpl<br />com.liferay.portlet.bookmarks.service.impl.BookmarksFolderLocalServiceImpl<br />帮助类也一并生成。<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryLocalServiceEJB<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryLocalServiceEJBImpl<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryLocalServiceHome</p>
		<p>com.liferay.portlet.bookmarks.service.spring.BookmarksEntryLocalService<br />com.liferay.portlet.bookmarks.service.spring.BookmarksEntryLocalServiceFactory<br />com.liferay.portlet.bookmarks.service.spring.BookmarksEntryLocalServiceUtil</p>
		<p>com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderLocalServiceEJB<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderLocalServiceEJBImpl<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderLocalServiceHome</p>
		<p>com.liferay.portlet.bookmarks.service.spring.BookmarksFolderLocalService<br />com.liferay.portlet.bookmarks.service.spring.BookmarksFolderLocalServiceFactory<br />com.liferay.portlet.bookmarks.service.spring.BookmarksFolderLocalServiceUtil<br />有一些用户需要远程调用本地的Service类，所以远程Service类的本地副本也一并被生成。<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryRemoteServiceEJB<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryRemoteServiceEJBImpl<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksEntryRemoteServiceHome</p>
		<p>com.liferay.portlet.bookmarks.service.spring.BookmarksEntryRemoteService<br />com.liferay.portlet.bookmarks.service.spring.BookmarksEntryRemoteServiceFactory<br />com.liferay.portlet.bookmarks.service.spring.BookmarksEntryRemoteServiceUtil</p>
		<p>com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderRemoteServiceEJB<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderRemoteServiceEJBImpl<br />com.liferay.portlet.bookmarks.service.ejb.BookmarksFolderRemoteServiceHome</p>
		<p>com.liferay.portlet.bookmarks.service.spring.BookmarksFolderRemoteService<br />com.liferay.portlet.bookmarks.service.spring.BookmarksFolderRemoteServiceFactory<br />com.liferay.portlet.bookmarks.service.spring.BookmarksFolderRemoteServiceUtil<br />很多人刻意避免Session EJB因为它很重和需要大量的编码。我们的构建脚本证明你可以在复用中保持Session EBJ的优势，这样可以在付出和回报上保持很好平衡。<br />Spring给予Liferay额外的弹性。 开发者利用Liferay Portal，可以在一个Servlet容器中测试他们的POJO实现;而利用Liferay Portal企业版，可以在一个应用服务器部署成产品。<br />V、SAOP、RMI和Tunneling<br />所有的远程POJO实现都通过SOAP、RMI和我们自己的通道(Tunneling)类暴露给外部世界。<br />我们并不是简单的这样做因为Web Service还是一个困顿(buzz)的世界，但是我们发现它确实对集成有用。接下来是一个公司平衡这些资源的例子。<br />3 sixteen是一家将快速创建和运作的T恤公司。他们看到Liferay，想利用集成的购物 portlet。但是他们认为Liferay作为一个处于时尚前沿的T恤公司站点太难看了。为了解决这个问题，他们决定将他们的网站分为两个站点:一个手册站点和一个购物站点。<br />www。3sixteen。com 成为一个构建在Flash上面的漂亮的站点。my。3sixteen。com则是使用Liferay分发的购物站点。这两个站点分别放在不同的Linux系统主机上，所有的目的放在不同的宿主上。<br />他们还需要构建一个邮件列表来收集所有感兴趣的客户的邮件地址。为实现这个，他们再Flash站点增加了一个JSP弹出窗口(pop up box)，这样可以告诉Portal服务器在Address Book Portlet中将邮件地址增加到联系列表(contact)。<br />下面是一个JSP片断，显示3sixteen的用户如何利用ABContactServiceHttp增加一个联系列表。<br /> <br />ABContactServiceHttp调用ABContactServiceUtil的addContact。这个调用通过80端口发送，被<a href="http://my/">http://my</a>。3sixteen。com/tunnel/servlet/AuthTunnelServlet接收。应用服务器确认认证匹配，然后处理ABContactServiceUtil，就好像ID为joe_bloggs的用户在调用addContact。然后ABContactServiceUtil调用ABContactServiceImpl来完成实际工作。你可以通过查看JavaDocs里面的源代码来查看这个逻辑。<br />现在Joe Bloggs可以登录到portal，在Address Book portlet可以看到他已经有一个新的联系列表。所有被包含的portlet都有这个性能因为这些帮助类已经生成。这意味着你可以撰写applet或者任何Java应用来操作那些包含你的业务逻辑的Session EJB。假如有人持有你的密码那么这会是一个安全问题，所以你可以通过修改配置文件portal。properties来限制通道(Tunnel)Servlet只监听特定的端口。<br />你也可以通过SOAP和RMI操作Session EJB。我们将尽快提交更多这方面的例子。<br />VI 应用服务器<br />Liferay是从底层构建的，可以被应用服务器所用。下面是一个Portal例子列表，显示portal连接数据库以及展示Liferay的性能。<br /><a href="http://demo.liferay.net/">http://demo.liferay.net</a><br /><a href="http://my.ccuc.net/">http://my.ccuc.net</a><br /><a href="http://my.3sixteen.com/">http://my.3sixteen.com</a><br /><a href="http://portal.liferay.com/">http://portal.liferay.com</a><br /><a href="http://www.gatewayfriends.org/">http://www.gatewayfriends.org</a><br /><a href="http://www.jasonandiris.com/">http://www.jasonandiris.com</a><br />每个Portal中的用户在其他Portal中没有信息保留。他们用域名分隔开，根据公司编号存在于各自的空间内。<br />查看Multiple Portal获取细节信息，了解如何在一台机器上部署多个Portal实例。</p>
		<p>作者 : eamoi @ Aljoin Software<br />Dev2dev ID: educhina <br />Blog地址:<br /><a href="http://spaces.msn.com/members/eamoi/">http://spaces.msn.com/members/eamoi/</a><br /><a href="http://blog.sina.com.cn/u/1183534285">http://blog.sina.com.cn/u/1183534285</a><br /><a href="/eamoi/">http://www.blogjava.net/eamoi/</a><br /></p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/60949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">谈笑有鸿儒</a> 2006-07-31 10:22 <a href="http://www.blogjava.net/badboyryan/articles/60949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Liferay的Portlet Session处理(2) </title><link>http://www.blogjava.net/badboyryan/articles/60944.html</link><dc:creator>谈笑有鸿儒</dc:creator><author>谈笑有鸿儒</author><pubDate>Mon, 31 Jul 2006 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/articles/60944.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/60944.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/articles/60944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/60944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/60944.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
				<tbody>
						<tr>
								<td bgcolor="#e8e8e8" height="30">
										<div align="center">
												<font color="#ff0000" size="4">
														<strong>Portal开源实现-Liferay的Portlet Session处理(2)</strong>
												</font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<!--内容开始-->
										<p>
												<br />二、LIFERAY中的实现</p>
										<p>LIFERAY在构建ActionRequestImpl和RenderRequestImpl时，会设置PORTLET SESSION，如下代码所示：<br />public RenderRequestImpl(HttpServletRequest req, Portlet portlet,<br />        CachePortlet cachePortlet,<br />        PortletContext portletCtx,<br />        WindowState windowState, PortletMode portletMode,<br />        PortletPreferences prefs, String layoutId) {<br />   ...<br />  _req = dynamicReq;<br />  _portlet = portlet;<br />  _cachePortlet = cachePortlet;<br />  _portalCtx = new PortalContextImpl();<br />  _portletCtx = portletCtx;<br />  _windowState = windowState;<br />  _portletMode = portletMode;<br />  _prefs = prefs;<br />  _ses = new PortletSessionImpl(<br />   _req.getSession(), _portletName, _portletCtx);<br />   ...<br /> }<br />从兰色的部分（  _ses = new PortletSessionImpl(_req.getSession(),_portletName, _portletCtx);  ）我们可以看到，这个PORTLET SESSION其实就是PORTAL SYSTEM的 SESSION 对象。<br />所以无论request调用getSession()或者getPortletSession()都将获取Portal 系统的SESSION 对象，而无论该PORTLET  是或者不是属于PORTAL SYSTEM上下文。而且即使不同PORTAL APPLICATION的PORTLET也将使用同一个SESSION 对象（PORTAL 系统）。<br />也就是说，对于某一个PORTLET来说，如果有对其的SESSION进行的操作，并没有真正的在该APPLICATION上下文中的SESSION进行操作，而是在PORTAL系统上下文的SESSION中进行操作。</p>
										<p>而且LIFERAY提供getPortletSession来获取PortletSession对象，而不是getSession()方法，所以即使getPortletSession()可以获取正确的Session对象，开发人员由于习惯问题，也因使用getSession()而得不到。</p>
										<p>另外如果调用request.getSession(true)还可能会出现错误，因为LIFERAY在包含某一个PORTLET内容是，调用PortletRequestDispatcherImpl.include()方法，该方法将生成PortletServletRequest 和PortletServletResponse，请见如下代码:</p>
										<p>PortletServletRequest portletServletReq = new PortletServletRequest(<br />    httpReq, reqImpl, pathInfo, queryString, requestURI,<br />    servletPath);</p>
										<p>   PortletServletResponse portletServletRes =<br />    new PortletServletResponse(<br />     resImpl.getHttpServletResponse(), resImpl);<br />而PortletServletRequest的构造函数是如下定义的：<br />public PortletServletRequest(HttpServletRequest req,<br />         RenderRequest renderRequest, String pathInfo,<br />         String queryString, String requestURI,<br />         String servletPath) {</p>
										<p>  super(req);</p>
										<p>  _ses = req.getSession();<br />  _renderRequest = renderRequest;<br />  _pathInfo = pathInfo;<br />  _queryString = queryString;<br />  _requestURI = requestURI;<br />  _servletPath = servletPath;<br /> }<br />所以其SESSION依然是PORTAL系统上下文的。然后问题就出在这里，PortletServletRequest实现了getSession()方法，但是没有实现getSession(boolen create)方法，如果用户在此阶段调用getSession(true)的话，在某些情况下就会抛出NullPointerException</p>
										<p>原因见如下代码（请注意我添加的注释部分）<br />//ApplicationHttpRequest：   </p>
										<p> public HttpSession getSession(boolean create) {</p>
										<p>        if (crossContext) {<br />            <br />            // There cannot be a session if no context has been assigned yet<br />            if (context == null)<br />                return (null);</p>
										<p>            // Return the current session if it exists and is valid<br />            if (session != null)<br />                return (session.getSession());<br />     // 我的注释：这里将获取PORTAL系统的SESSION对象。<br />            HttpSession other = super.getSession(false);<br />            if (create &amp;&amp; (other == null)) {<br />                // First create a session in the first context: the problem is<br />                // that the top level request is the only one which can <br />                // create the cookie safely<br />                other = super.getSession(true);<br />            }<br />            if (other != null) {<br />                Session localSession = null;<br />                try {<br />                    // 我的注释：this context did not have the session with session id. It can just be found in the Portal<br />                    // context. So here it will return a null value.<br />                    localSession =<br />                        context.getManager().findSession(other.getId());<br />                    localSession.access(); //我的注释：Here, localSession is null. So it throws a NullPointException.<br />                } catch (IOException e) {<br />                    // Ignore<br />                }<br />                if (localSession == null) {<br />                    localSession = context.getManager().createEmptySession();<br />                    localSession.setNew(true);<br />                    localSession.setValid(true);<br />                    localSession.setCreationTime(System.currentTimeMillis());<br />                    localSession.setMaxInactiveInterval<br />                        (context.getManager().getMaxInactiveInterval());<br /></p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/badboyryan/aggbug/60944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">谈笑有鸿儒</a> 2006-07-31 10:09 <a href="http://www.blogjava.net/badboyryan/articles/60944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Portlet Session处理-转载</title><link>http://www.blogjava.net/badboyryan/articles/60943.html</link><dc:creator>谈笑有鸿儒</dc:creator><author>谈笑有鸿儒</author><pubDate>Mon, 31 Jul 2006 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/articles/60943.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/60943.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/articles/60943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/60943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/60943.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
				<tbody>
						<tr>
								<td bgcolor="#e8e8e8" height="30">
										<div align="center">
												<font color="#ff0000" size="4">
														<strong>Portal开源实现-Liferay的Portlet Session处理(1)</strong>
												</font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<!--内容开始-->
										<p>一、规范中的SESSION描述</p>
										<p>（PortletSession objects must be scoped at the portlet application context level. Each portlet application has its own distinct PortletSession object per user session. The portlet container must not share the PortletSession object or the attributes stored in it among different portlet applications or among different user sessions.）<br />上面这段话是portlet规范里的一段。很明白的可以看出，每个Portlet Application应该在Process Action和Render的时候应该拥有自己私有的Session对象，来为当前用户服务。也就是说，如果某一个用户在一个PORTAL系统中操作不同的PORTLET，而且这些PORTLET属于不同的PORTLET APPLICATION，则，这个用户将操作多个SESSION对象，用户在每个PORTLET中操作SESSION时，这个SESSION都将是属于该PORTLET所在的上下文的私有SESSION 对象。比如，用户当前页面有三个PORTLET，每个PORTLET都属于不同的PORTLET APPLICATION。则当该用户在第一个PORTLET里面有对SESSION的操作后，该PORTLET所属的APPLICATION将为这个用户生成一个SESSION；当该用户又操作第二个PORTLET中的SESSION时，该上下文有会对此用户产生一个新的SESSION对象；第三个依然如此。加上PORTAL系统的SESSION，也就是该用户实际和四个SESSION在大交道。</p>
										<p>另外要说明一点的是，PORTLET APPLICATION和WEB APPLICATION的关系。规范中有如下的定义：<br />（Portlets, servlets and JSPs are bundled in an extended web application called portlet application. Portlets, servlets and JSPs within the same portlet application share class loader, application context and session. ）<br />这说明PORTLET APPLICATION其实就是一个WEB APPLICATION。规范中还有一段话更是说明了这个问题，同时也强调了PORTLET SESSION 和普通的该APPLICATION的SESSION的关系：<br />（A Portlet Application is also a Web Application. The Portlet Application may contain servlets and JSPs in addition to portlets. Portlets, servlets and JSPs may share information through their session. The PortletSession must store all attributes in the HttpSession of the portlet application. A direct consequence of this is that data stored in the HttpSession by servlets or JSPs is accessible to portlets through the PortletSession in the portlet application scope. Conversely, data stored by portlets in the PortletSession in the portlet application scope is accessible to servlets and JSPs through the HttpSession. If the HttpSession object is invalidated, the PortletSession object must also be invalidated by the portlet container. If the PortletSession object is invalidated by a portlet, the portlet container must invalidate the associated HttpSession object.）</p>
										<p>最后一点要说明的是怎样得到PORTLET SESSION对象。规范中有这样一个例子：<br />PortletSession session = request.getSession(true);<br />URL url = new URL(“http://www.foo.com“);<br />session.setAttribute(“home.url”,url,PortletSession.APPLICATION_SCOPE);<br />session.setAttribute(“bkg.color”,”RED”,PortletSession.PORTLET_SCOPE);</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/badboyryan/aggbug/60943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">谈笑有鸿儒</a> 2006-07-31 10:07 <a href="http://www.blogjava.net/badboyryan/articles/60943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>