﻿<?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-JAVA流通桥-文章分类-Portal文章</title><link>http://www.blogjava.net/zhuyan/category/20906.html</link><description>JAVA启发者</description><language>zh-cn</language><lastBuildDate>Wed, 28 Mar 2007 06:34:03 GMT</lastBuildDate><pubDate>Wed, 28 Mar 2007 06:34:03 GMT</pubDate><ttl>60</ttl><item><title>pluto1.1安装在TOMCAT</title><link>http://www.blogjava.net/zhuyan/articles/106855.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Wed, 28 Mar 2007 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/106855.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/106855.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/106855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/106855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/106855.html</trackback:ping><description><![CDATA[
		<div class="section">
				<h2>Installing the Pluto 1.1 Binary Build</h2>
				<div class="highlightBox">
						<h4>About Pluto Distributions</h4>
						<p>There are a number of distributions to choose from depending on your needs. 
</p>
						<ul>
								<li>
										<strong>pluto-current-bundle</strong> - Provides Pluto and Tomcat bundled together. If you are getting started with Pluto, this is the distribution you want. 
</li>
								<li>
										<strong>pluto-current-bin</strong> - Provides the Pluto libraries, portal and testsuite web applications. 
</li>
								<li>
										<strong>pluto-current-container-bin</strong> - Provides the Pluto container libraries only. 
</li>
								<li>
										<strong>pluto-current-src</strong> - Provides the Pluto source code; requires that you build and deploy Pluto on your own. </li>
						</ul>
				</div>
				<ol type="1">
						<li>Download the Pluto 1.1 binary distribution named <strong>pluto-current-bundle</strong> from a <a href="http://www.apache.org/dyn/closer.cgi/portals/pluto/">distribution site</a>. 
</li>
						<li>Unzip the binary distribution into a directory. 
<ol type="1"><li>&lt;PLUTO-1.1-HOME&gt; will be the top level directory. </li></ol></li>
						<li>Execute startup.bat (Windows) or startup.sh (Unix) in &lt;PLUTO-1.1-HOME&gt;/bin. 
<ol type="1"><li>Use shutdown.bat/shutdown.sh to stop the portal </li></ol></li>
						<li>Browse to <a href="http://localhost:8080/pluto/portal">http://localhost:8080/pluto/portal</a></li>
						<li>Login as the user pluto (password=pluto). </li>
				</ol>
		</div>
		<a name="Building Pluto from Source">
		</a>
		<div class="section">
				<h2>Building Pluto from Source</h2>Maven 2 is utilized as the project management and build system for Pluto 1.1. Pluto currently provides Maven plugins which can be used to install the Pluto Portal, assemble portlet applications, deploy applications, and publish portlet applications to the Pluto Portal. <a name="Obtaining Pluto 1.1 Source Code"></a><div class="section"><h3>Obtaining Pluto 1.1 Source Code</h3>The Pluto project uses the <a href="http://subversion.tigris.org/">Subversion</a> version control system. If you're new to Subversion, you can check out the <a href="http://svnbook.red-bean.com/">online book</a> about Subversion. Note that we are currently using Subversion 1.3.x (there are separate versions of the book covering the different versions of Subversion). <b>Web Access to Subversion</b> To browse the Pluto 1.1 source code, you can use the <a href="http://svn.apache.org/viewcvs.cgi/portals/pluto/trunk?root=Apache-SVN">ViewCVS web interface</a> to Subversion. This is current at all times. <b>Normal Subversion Access</b> Anyone can check code out of Subversion anonymously. However, you need to specify a username and password in order to update the Subversion repository, and only Pluto committers have the permissions to do that. We run Subversion over standard HTTPS, so hopefully you won't have problems with intervening firewalls. 
<h3>Check out from Subversion</h3>Again, anyone can do this. To check out the latest distribution of Pluto 1.1 (trunk) to a directory called 'pluto' use this command: <pre>svn checkout https://svn.apache.org/repos/asf/portals/pluto/trunk/ pluto</pre>To check out Pluto 1.1.1 source to the 'pluto' directory use this command: <pre>svn checkout https://svn.apache.org/repos/asf/portals/pluto/tags/pluto-1.1.1 pluto</pre>Zipped up Pluto source distributions can also be downloaded from a <a href="http://www.apache.org/dyn/closer.cgi/portals/pluto/">distribution mirror</a>. </div><a name="Building Pluto with Maven 2"></a><div class="section"><h3>Building Pluto with Maven 2</h3>If this is your first time building Pluto with Maven 2, edit <code>~/.m2/settings.xml</code> and add the &lt;pluginGroups&gt; element: 
<div class="source"><pre>&lt;settings&gt;
  ...
  &lt;pluginGroups&gt;
    &lt;pluginGroup&gt;org.apache.pluto&lt;/pluginGroup&gt;
  &lt;/pluginGroups&gt;
  ...
&lt;/settings&gt;
            </pre></div>If you don't have <code>org.apache.pluto</code> specified as a <code>&lt;pluginGroup&gt;</code>, then the <code>pluto:install</code> will fail. 
<p></p><p><code>&lt;PLUTO-1.1-SRCHOME&gt;</code> is the local directory where the Pluto 1.1 source distribution has been checked out or unzipped into. </p><p></p><div class="source"><pre>$&gt; cd &lt;PLUTO-1.1-SRCHOME&gt;
$&gt; mvn install
$&gt; mvn pluto:install -DinstallDir=path/to/appserver
          </pre></div><p></p><p>The <code>install</code> goal is a built in Maven 2 lifecycle which builds the project artifacts and installs them into the Maven repository. </p><p>The <code>pluto:install</code> goal will take the resulting artifacts and properly deploy them within the configured Tomcat installation. Currently, the Pluto 1.1 install has been tested on Tomcat 5.5.9, 5.5.17 and 5.5.20. The Tomcat 5 archive can be found <a href="http://archive.apache.org/dist/tomcat/tomcat-5/archive">here</a>. </p><p>If installing to a directory that contains spaces, <code>installDir</code> needs to be enclosed within quotes: </p><p></p><div class="source"><pre>C:\pluto&gt; mvn pluto:install -DinstallDir="C:\Program Files\Apache Software Foundation\Tomcat 5.5"
          </pre></div><p></p></div><a name="Installing Pluto Manually"></a><div class="section"><h3>Installing Pluto Manually</h3><p>This section documents the manual installation of Pluto into Tomcat. It replaces the pluto:install goal, but requires that the built-in Maven 2 install goal (<code>mvn install</code>) be run from <code>&lt;PLUTO-1.1-SRCHOME&gt;</code>. </p><p><b>Step 1:</b></p><div class="source"><pre>$&gt; cd &lt;PLUTO-1.1-SRCHOME&gt;
$&gt; mvn install
          </pre></div><p></p><p><b>Step 2:</b> Copy the following to <code>&lt;TOMCAT_HOME&gt;/shared/lib</code>: 
</p><ul><li>castor-1.0.jar 
</li><li>portlet-api-1.0.jar 
</li><li>pluto-container-1.1.1.jar 
</li><li>pluto-descriptor-api-1.1.1.jar 
</li><li>pluto-descriptor-impl-1.1.1.jar 
</li><li>pluto-taglib-1.1.1.jar </li></ul><b>Step 3:</b> Copy the following to <code>&lt;TOMCAT_HOME&gt;/common/endorsed</code>: 
<ul><li>xercesImpl-2.6.2.jar 
</li><li>xmlParserAPIs-2.6.2.jar </li></ul><b>Step 4:</b> Copy the following to <code>&lt;TOMCAT_HOME&gt;/conf/Catalina/localhost</code>: 
<ul><li>&lt;PLUTO_SRCHOME&gt;/pluto-portal/src/main/resources/pluto.xml 
</li><li>&lt;PLUTO_SRCHOME&gt;/pluto-testsuite/src/main/resources/testsuite.xml </li></ul><b>Step 5:</b> Copy the following to <code>&lt;TOMCAT_HOME&gt;/webapps</code>: 
<ul><li>&lt;PLUTO_SRCHOME&gt;/pluto-portal/target/pluto-portal.war 
</li><li>&lt;PLUTO_SRCHOME&gt;/pluto-testsuite/target/pluto-testsuite.war </li></ul></div><a name="Installing Pluto with a Windows EXE"></a><div class="section"><h3>Installing Pluto with a Windows EXE</h3>The NSIS Installer is not yet complete, but we hope to have a fully functional one soon. Anyone is more than welcome to assist us in this process. </div><a name="Configuring Source-Built Pluto for Application Scope PortletSession Attributes"></a><div class="section"><h3>Configuring Source-Built Pluto for Application Scope PortletSession Attributes</h3>To be able to use application-scoped <code>PortletSession</code> attributes in Pluto, modify the Connector element for port 8080 in <code>&lt;TOMCAT_HOME&gt;/conf/server.xml</code> by adding the following attribute and value: emptySessionPath="true". </div><a name="Configuring User and Role in the Pluto Source Build"></a><div class="section"><h3>Configuring User and Role in the Pluto Source Build</h3>The Pluto Testsuite portlet application needs the role '<code>pluto</code>' to run the Security Mapping Test. So before starting tomcat, you should edit <code>&lt;TOMCAT_HOME&gt;/conf/tomcat-users.xml</code>, add the role '<code>pluto</code>', and add a user in that role. The simplest way to do this is to edit add the '<code>pluto</code>' role to the '<code>tomcat</code>' user's record. Here is a sample <code>tomcat-users.xml</code> file: 
<div class="source"><pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;tomcat-users&gt;
  &lt;role rolename="pluto"/&gt;
  &lt;role rolename="tomcat"/&gt;
  &lt;role rolename="role1"/&gt;
  &lt;user username="tomcat" password="tomcat" roles="tomcat,pluto"/&gt;
  &lt;user username="role1" password="tomcat" roles="role1"/&gt;
  &lt;user username="both" password="tomcat" roles="tomcat,role1"/&gt;
&lt;/tomcat-users&gt;
        </pre></div></div><a name="Starting the Portal"></a><div class="section"><h3>Starting the Portal</h3>Now you are ready to use the Pluto Portal built from source. Start up tomcat by running <code>startup.bat</code> (for windows) or <code>startup.sh</code> (for *nix) in <code>&lt;TOMCAT_HOME&gt;/bin</code>, and browse to <code>http://localhost:8080/pluto/portal</code>. Login to Pluto using the user and password you just created in <code>tomcat-users.xml</code>. If you added the 'pluto' role to the 'tomcat' user's record, you can login as 'tomcat/tomcat'. </div></div>
<img src ="http://www.blogjava.net/zhuyan/aggbug/106855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-03-28 09:50 <a href="http://www.blogjava.net/zhuyan/articles/106855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Pluto初始化流程</title><link>http://www.blogjava.net/zhuyan/articles/106714.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Tue, 27 Mar 2007 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/106714.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/106714.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/106714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/106714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/106714.html</trackback:ping><description><![CDATA[
		<div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px">
				<h2>Pluto初始化流程<a title="永久链接：Pluto控制流程" href="http://billy.javaeye.com/blog/35388"></a></h2>
		</div>
		<div style="MARGIN-TOP: 5px; MARGIN-LEFT: 15px">
				<b>关键字:</b>   Pluto Portal 门户     </div>
		<div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px; OVERFLOW: auto">
				<table width="100%">
						<tbody>
								<tr>
										<td>
												<p>
														<font face="Arial">
																<br />一、初始化流程</font>
												</p>
												<p>
														<font face="Arial">  //Servlet初始化<br />  Pluto.PortalImpl.Servlet.init()</font>
												</p>
												<p>
														<font face="Arial">     // ServiceManager初始化<br />     ServiceManager.init()</font>
												</p>
												<p>
														<font face="Arial">        ConfigService.init()  // 配置服务</font>
												</p>
												<p>
														<font face="Arial">        LogService.init()  // 日志服务</font>
												</p>
												<p>
														<font face="Arial">        FactoryManagerService.init()  // 工厂管理器</font>
												</p>
												<p>
														<font face="Arial">        PortletDefinitionRegistryService.init()  // Portlet定义注册表</font>
												</p>
												<p>
														<font face="Arial">        PortletEntityRegistryService.init()  // Portlet实体注册表</font>
												</p>
												<p>
														<font face="Arial">        PageRegistryService.init() // Page注册表</font>
												</p>
												<p>
														<font face="Arial">        //注，以上服务都读取同名的properties配置文件.</font>
												</p>
												<p>
														<font face="Arial">     // 初始化Portlet容器, 容器实现类在ConfigService.properties中指定<br />     PortletContainerFactory.getPortletContainer().init()</font>
												</p>
												<p>
														<font face="Arial">二、请求处理流程 </font>
												</p>
												<p>
														<font face="Arial">  Pluto.PortalImpl.Servlet.doGet()</font>
												</p>
												<p>
														<font face="Arial">    1. 创建PortalEnvironment;</font>
												</p>
												<p>
														<font face="Arial">    2. 查找ActionWindow;</font>
												</p>
												<p>
														<font face="Arial">    2a. 如找到ActionWindow, 则为Action<br />            执行PortletContainer.processPortletAction();<br />            重定向输出.</font>
												</p>
												<p>
														<font face="Arial">    2b. 找不到ActionWindow, 则为Render, 读取Page定义。<br />            RootFragment root = PageRegistry.getRootFragment();<br />            root.service(servletRequest, servletResponse);</font>
												</p>
												<p>
														<font face="Arial">    3. 处理完毕;</font>
												</p>
												<p>
														<font face="Arial">  // 处理Fragment, RootFragment与Pageregistry.xml文件关联, 后者定义了页面的布局<br />  Pluto.portalImpl.Aggregation.RootFragment.service()</font>
												</p>
												<p>
														<font face="Arial">    // 服务前置处理。<br />    1. preService(request, response);</font>
												</p>
												<p>
														<font face="Arial">    // 包含与当前fragment同名的jsp文件，当前为RootFragment。<br />    2. RequestDispatcher rd = getServletConfig().getServletContext().<br />                                getRequestDispatcher(BASE_ROOT+jspName);<br />       rd.include(request, response);</font>
												</p>
												<p>
														<font face="Arial">    // 服务后置处理<br />    3. postService(request, response);</font>
												</p>
												<p>
														<font face="Arial">  // Pageregistry.xml<br />  〈portal〉  // 对应RootFragment<br />    〈fragment name="navigation" <br />        class="org.apache.Pluto.portalImpl.aggregation.navigation.TabNavigation"〉<br />    〈/fragment〉</font>
												</p>
												<p>
														<font face="Arial">    〈fragment name="test" type="page"〉  // 对应PageFragment<br />        〈navigation〉<br />            〈title〉Test〈/title〉<br />            〈description〉...〈/description〉<br />        〈/navigation〉</font>
												</p>
												<p>
														<font face="Arial">        〈fragment name="row" type="row"〉  // 对应RowFragment<br />            〈fragment name="col1" type="column"〉   // 对应ColumnFragment<br />                〈fragment name="p1" type="portlet"〉   // 对应PortletFragment<br />                    〈property name="portlet" value="3.1"/〉<br />                〈/fragment〉<br />                〈fragment name="p2" type="portlet"〉  // 对应PortletFragment<br />                    〈property name="portlet" value="4.1"/〉<br />                〈/fragment〉<br />            〈/fragment〉<br />        〈/fragment〉<br />    〈/fragment〉<br />  〈/portal〉</font>
												</p>
												<p>
														<font face="Arial">   // 上面的层次结构十分清楚，其中fragment与Fragment的子类对应，上面的定义中包括RootFragment, <br />        PageFragment, RowFragment, ColumnFragment和PortletFragment，除了PortletFragment外，<br />        其它Fragment的处理大致上是一样的，<br />   Iterator childIterator = fragment.getChildFragments().iterator();</font>
												</p>
												<p>
														<font face="Arial">   // 遍历子fragment, 并调用其服务方法。<br />   while (childIterator.hasNext()) {<br />       Fragment subfragment = (Fragment)childIterator.next();<br />       if (subfragment instanceof AbstractNavigationFragment)<br />       {<br />           subfragment.service(request, response);<br />           break;<br />       }<br />  }</font>
												</p>
												<p>
														<font face="Arial">三、Portal处理流程</font>
												</p>
												<p>
														<font face="Arial">  先来看看Portlet的初始化, 主要是从配置文件中读取Portlet定义。<br />  PortletFragment.init()</font>
												</p>
												<p>
														<font face="Arial">      // 读取Portlet的实体Id, 在pageregistry.xml中由portlet属性指定.<br />      String portletEntityId = getInitParameters().getString("portlet");</font>
												</p>
												<p>
														<font face="Arial">      // 读取Portlet实体. portlet实体在portletentityregistry.xml中定义.<br />      PortletEntity portletEntity = PortletEntityRegistry.getPortletEntity(...);</font>
												</p>
												<p>
														<font face="Arial">      // portletentityregistry.xml<br />      〈portlet-entity-registry〉<br />        〈application id="3"〉  // 对应PortletApplicationEntity<br />           〈definition-id〉testsuite〈/definition-id〉<br />           〈portlet id="1"〉  // 对应PortletEntity<br />              〈definition-id〉testsuite.TestPortlet1〈/definition-id〉<br />              〈preferences〉<br />                  〈pref-name〉TestName4〈/pref-name〉<br />                  〈pref-value〉TestValue4〈/pref-value〉<br />                  〈read-only〉true〈/read-only〉<br />              〈/preferences〉<br />          〈/portlet&gt;<br />       〈/application&gt;<br />       〈application id="4"〉<br />          〈definition-id&gt;testsuite〈/definition-id〉<br />          〈portlet id="1"〉<br />              〈definition-id&gt;testsuite.TestPortlet2〈/definition-id〉<br />              〈preferences〉<br />                  〈pref-name〉TestName4〈/pref-name〉<br />                  〈pref-value〉TestValue4〈/pref-value〉<br />                  〈read-only〉true〈/read-only〉<br />              〈/preferences〉<br />          〈/portlet〉<br />       〈/application〉<br />     〈/portlet-entity-registry〉<br />      //要注意这里的applicationid和portletid与pageregistry中的portletid的对应关系。</font>
												</p>
												<p>
														<font face="Arial">  // Portlet服务<br />  PortletFragment.service()</font>
												</p>
												<p>
														<font face="Arial">      //load protlet<br />      PortletContainer.portletLoad(...)</font>
												</p>
												<p>
														<font face="Arial">        // 1.取得PortletDefinition, 从portletentityregistry中定义的application中读取portlet定义.<br />        PortletDefinition def = portletWindow.getPortletEntity().getPortletDefinition();</font>
												</p>
												<p>
														<font face="Arial">        // portlet.xml<br />        〈portlet-app〉   // 对应PortletApplicationDefinition<br />           〈portlet〉     // 对应PortletDefinition<br />              〈description〉TestSuiteDescription〈/description〉<br />              〈portlet-name〉TestPortlet1〈/portlet-name〉<br />              〈display-name〉Test Portlet #1〈/display-name〉</font>
												</p>
												<p>
														<font face="Arial">              〈portlet-class〉org.apache.Pluto.portalImpl.portlet.TestPortlet〈/portlet-class〉</font>
												</p>
												<p>
														<font face="Arial">              〈init-param&gt;<br />                  〈name〉config〈/name〉<br />                  〈value〉/WEB-INF/testsuite-config.xml〈/value〉<br />              〈/init-param〉</font>
												</p>
												<p>
														<font face="Arial">              〈supports〉<br />                  〈mime-type〉text/html〈/mime-type〉<br />                  〈portlet-mode〉VIEW〈/portlet-mode〉<br />                  〈portlet-mode〉EDIT〈/portlet-mode〉<br />                  〈portlet-mode〉HELP〈/portlet-mode〉<br />              〈/supports〉</font>
												</p>
												<p>
														<font face="Arial">              〈portlet-info〉<br />                    〈title〉Test Portlet #1〈/title〉<br />                    〈short-title〉Test #1〈/short-title〉<br />                    〈keywords〉Test,Testing〈/keywords〉<br />              〈/portlet-info&gt;</font>
												</p>
												<p>
														<font face="Arial">              〈security-role-ref〉<br />                  〈role-name〉PlutoTestRole〈/role-name〉<br />                  〈role-link〉tomcat〈/role-link〉<br />              〈/security-role-ref〉<br />           〈/portlet〉<br />        〈portlet-app〉</font>
												</p>
												<p>
														<font face="Arial">        // 2.取得PortletInvoker<br />        PortletInvoker invoker = PortletInvokerAccess.getPortletInvoker(def);</font>
												</p>
												<p>
														<font face="Arial">        // 3.执行load操作<br />        invoker.load(renderRequest, renderResponse)</font>
												</p>
												<p>
														<font face="Arial">      // render Portlet<br />      PortletContainer.renderPortlet(...);</font>
												</p>
												<p>
														<font face="Arial">        // 1. 取得PortletInvoker<br />        PortletInvoker invoker = PortletInvokerAccess.getPortletInvoker(...);</font>
												</p>
												<p>
														<font face="Arial">        // 2. 执行render操作。<br />        invoker.render(renderRequest, renderResponse);</font>
												</p>
												<p>
														<font face="Arial">      // 处理Title, support modes, </font>
												</p>
												<p>
														<font face="Arial">  // Portlet调用.<br />  ProtletInvoker.invoke(...)</font>
												</p>
												<p>
														<font face="Arial">      // 取得Portlet应用的dispatcher.<br />      ServletDefinition servletDefinition = portletDefinition.getServletDefinition();<br />      ServletContext servletContext = servletConfig.getServletContext();<br />      RequestDispatcher dispatcher = servletDefinition.getRequestDispatcher(servletContext);</font>
												</p>
												<p>
														<font face="Arial">      // 设置属性, METHOD_ID为别对应load, render和action。<br />      servletRequest.setAttribute(Constants.METHOD_ID, methodID);<br />      servletRequest.setAttribute(Constants.PORTLET_REQUEST, portletRequest);<br />      servletRequest.setAttribute(Constants.PORTLET_RESPONSE, portletResponse);</font>
												</p>
												<p>
														<font face="Arial">      // 调用Portlet  <br />      dispatcher.include(servletRequest, servletResponse);</font>
												</p>
												<p>
														<font face="Arial">四、Portlet处理流程</font>
												</p>
												<p>
														<font face="Arial">  在Portlet应用的web.xml中，定义了PortletServlet为Portlet的Servlet，它由dispatch方法统一进行请求处理.</font>
												</p>
												<p>
														<font face="Arial">  PortletServlet.dispatch(...)</font>
												</p>
												<p>
														<font face="Arial">     // 设置portletConfig.<br />     request.setAttribute(org.apache.Pluto.Constants.PORTLET_CONFIG, portletConfig);</font>
												</p>
												<p>
														<font face="Arial">     Integer method_id = (Integer)request.getAttribute(Constants.METHOD_ID);<br />     if (method_id == Constants.METHOD_RENDER)<br />     {<br />         renderRequest = (RenderRequest)request.getAttribute(Constants.PORTLET_REQUEST);<br />         renderResponse = (RenderResponse)request.getAttribute(Constants.PORTLET_RESPONSE);</font>
												</p>
												<p>
														<font face="Arial">         // prepare container objects to run in this webModule<br />         prepareRenderRequest(renderRequest, request);<br />         prepareRenderResponse(renderResponse, request, response);</font>
												</p>
												<p>
														<font face="Arial">         portletClass.render(renderRequest,renderResponse);<br />     }<br />     else if (method_id==org.apache.Pluto.Constants.METHOD_ACTION)<br />     {<br />         actionRequest = (ActionRequest)request.getAttribute(Constants.PORTLET_REQUEST);<br />         actionResponse = (ActionResponse)request.getAttribute(Constants.PORTLET_RESPONSE);</font>
												</p>
												<p>
														<font face="Arial">         // prepare container objects to run in this webModule<br />         prepareActionRequest(actionRequest, request);<br />         prepareActionResponse(actionResponse, request, response);</font>
												</p>
												<p>
														<font face="Arial">         portletClass.processAction(actionRequest,actionResponse);<br />     }<br />     else if (method_id == org.apache.Pluto.Constants.METHOD_NOOP)<br />     {<br />         //nothing to do<br />     }<br />     //注: portletClass即为portlet的具体实现类。</font>
												</p>
												<p>
														<font face="Arial">     至此，请求就由portlet进行处理了。</font>
												</p>
												<p>
														<font face="Arial">从上面的流程可以看出，Pluto就是将请求分派到页面上的各个portlet，portlet根据method执行相应操作，</font>
												</p>
												<p>
														<font face="Arial">最后由Pluto将它们处理的结果按特定布局进行显示。</font>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.blogjava.net/zhuyan/aggbug/106714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-03-27 17:11 <a href="http://www.blogjava.net/zhuyan/articles/106714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Pluto是一个满足Portlet API规范的Portlet容器的实现</title><link>http://www.blogjava.net/zhuyan/articles/105752.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Fri, 23 Mar 2007 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/105752.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/105752.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/105752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/105752.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/105752.html</trackback:ping><description><![CDATA[
		<p>Pluto是一个满足Portlet API规范的Portlet容器的实现，它为开发者提供了一个运行 portlets的工作平台。然而，如果没有一个驱动器（driver），也就是Portal，的支持的话， 运行和测试Portlet容器将非常之麻烦。Pluto本身也提供了一个简单的Portal模块，该模块仅 仅是为了满足Portlet容器和JSR 168的需要而写的。如果你需要一个成熟的Portal，请参考 <a class="newWindow" title="New Window" href="http://jakarta.apache.org/jetspeed/site" target="_blank">Jetspeed</a>项目。Jetspeed项目关注的是Portal本身，而不是Portlet容器。 </p>
		<p>图1是Portal的基本体系结构图。Portal Web Application处理客户的请求，从客户的当前 页中提取出portlets，然后调用portlet容器来获得每一个portlet的内容。Portal通过 Portlet容器的Invoker API来访问portlet容器。这些API是portlet容器的主要调用接口， 它们为Portal提供了一些基于请求的方法来调用portlet。容器的使用者（<i>即Portal，译者 注</i>）必须实现portlet容器的Container Provider SPI（Service Provider Interface）回调接口，来为portlet容器提供与Portal相关的信息。最后，portlet容器通 过Portlet API调用所有的portlets。 </p>
		<p>
				<img alt="" src="http://people.apache.org/~zheng/pluto/chinese/developer/images/portal_arch.jpg" />
				<br />
				<br />
				<b>图1：一个集成了Pluto的简单Portal</b>
				<br />
				<br />
		</p>
		<div class="section">
				<a name="Portlet容器">
				</a>
				<h2>Portlet容器</h2>
				<p>Portlet容器是portlets的运行时环境，也是每一个Portal的核心组件。Portlet容器需要获 取有关Portal本身的一些信息，还必须重用Portal的一些基本代码。因此，Portlet容器可以 保证自己与其它的Portal组件之间是完全分开的。也就是说，你可以把一个独立的Portlet容器 插入到任何一个Portal中去，只要它可以满足Portlet容器的要求，比如实现了所有的SPI。 </p>
				<p>Portlet容器的Invoker API（也被称为进入点）是Portlet容器的主要调用接口。这些API包 含Portlet容器的生命周期控制方法（init()，destroy()）和基于请求的调用方法 （initPage()，performTitle()，portletService()等等）。由于Portlet容器最终是 去调用一个portlet，故这些方法的签名和Portlet API的主要portlet接口很类似，除了一个 须额外传入的portlet ID。Portlet容器可以通过这个额外传入的portlet ID参数来决定调用 哪一个portlet。 </p>
				<p>除了可以使用Invoker API来调用Portlet容器外，Portal还必须实现Portlet容器定义的SPI。 因此，参考实现引入了“容器服务”的概念：容器服务用来定义一些能够在容器中注册的可插的组件， 这些组件要么提供一些基本的功能，要么对容器进行扩展。Pluto参考实现定义了下面这些内建的 容器服务（前四个是运行Portlet容器所必须实现的，而第五个则是可选的）： </p>
				<p>
				</p>
				<ul>
						<li>
								<b>Information Provider（信息提供者）</b>：为Portlet容器提供关于Portal及 其框架的信息。通过该接口只能够获得一些已知的或存在Portal中的信息。这些信息包括带 导航状态（navigational state）的URL生成、portlet上下文（portlet context）、 portlet模式（portlet mode）和窗口状态（window state）控制。 
</li>
						<li>
								<b>Factory Manager（工厂管理者）</b>：定义了如何通过工厂获得一个实现（一般的 Portal应该已经实现了这样的接口）。 
</li>
						<li>
								<b>Log Service（日志服务）</b>：定义了输出日志的方法（一般的Portal应该已经实 现了这样的接口）。 
</li>
						<li>
								<b>Config Service（配置服务）</b>：定义了如何获得配置值（一般的Portal应该已 经实现了这样的接口）。 
</li>
						<li>
								<b>Property Manager（属性管理者，可选）</b>：该服务让Portal可以获得JSR 168 规范中定义的属性的值。 </li>
				</ul>
				<p>
				</p>
				<p>严格的说，Portlet Object Model（Portlet对象模型）也是一个SPI，但与其它的SPI相比， 它处在一个特殊的位置上。因此我们不把它看成是容器服务的一部分，因为它处理所有的portlet 对象，并包含了一些混杂的接口。 </p>
				<p>
						<img alt="" src="http://people.apache.org/~zheng/pluto/chinese/developer/images/pluto_arch.jpg" />
						<br />
						<br />
						<b>图2：Portlet容器的体系结构</b>
						<br />
						<br />
				</p>
		</div>
		<div class="section">
				<a name="Portlet的部署">
				</a>
				<h2>Portlet的部署</h2>
				<p>Portlet容器是构建在Servlet容器之上的，所以它可以重用Servlet容器的许多功能。为了达到 这一点，portlet容器必须把一些servlet的属性注入到每一个portlet应用的war文件中，如 图3所示。Portlet组件的部署器将在原先的war文件中注入一个新的或者修改过的web.xml，再 为每个portlet注入一个servlet包裹器，以此作为调用点。然后，portlet部署器将把这个修 改过的war文件传给应用服务器的部署器，以此来把它部署到应用服务器的系统中。当一个 portlet被调用时，portlet容器将调用注入的servlet包裹器，把这作为被部署的portlet的 war文件的进入点。 </p>
				<p>
						<img alt="" src="http://people.apache.org/~zheng/pluto/chinese/developer/images/portlet_deployment.jpg" />
						<br />
						<br />
						<b>图3：参考实现中portlet的部署</b>
						<br />
						<br />
				</p>
		</div>
		<div class="section">
				<a name="Pluto和WSRP标准">
				</a>
				<h2>Pluto和WSRP标准</h2>
				<p>JSR 168规范和Web Service for Remote Portlets（WSRP）标准有高度的一致性。这两 个同时出现的标准都发布了开放源码的实现，它们的实现都完成了在相应的规范中定义的所有必要 功能。这两个标准都把能很好的互相协作作为它们共同的目标。因此，WSRP portlets在 portlet容器中既可以作为消费者运行，也可以作为生产者运行。 </p>
				<p>Pluto项目必须支持在一个Portal中运行多个portlet容器。因此，Pluto Portlet容器可以 被多次初始化。更重要的是，它可以以不同的方式运行，每个portlet容器都使用一个不同的SPI 实现。 </p>
		</div>
<img src ="http://www.blogjava.net/zhuyan/aggbug/105752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-03-23 10:37 <a href="http://www.blogjava.net/zhuyan/articles/105752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>