ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久久久久久一区,中文有码在线观看,麻豆成人avhttp://www.aygfsteel.com/zhuyan/category/20906.htmlJAVAå¯å‘è€?/description>zh-cnWed, 28 Mar 2007 06:34:03 GMTWed, 28 Mar 2007 06:34:03 GMT60pluto1.1安装在TOMCAThttp://www.aygfsteel.com/zhuyan/articles/106855.html朱岩朱岩Wed, 28 Mar 2007 01:50:00 GMThttp://www.aygfsteel.com/zhuyan/articles/106855.htmlhttp://www.aygfsteel.com/zhuyan/comments/106855.htmlhttp://www.aygfsteel.com/zhuyan/articles/106855.html#Feedback0http://www.aygfsteel.com/zhuyan/comments/commentRss/106855.htmlhttp://www.aygfsteel.com/zhuyan/services/trackbacks/106855.html

Installing the Pluto 1.1 Binary Build

About Pluto Distributions

There are a number of distributions to choose from depending on your needs.

  • pluto-current-bundle - Provides Pluto and Tomcat bundled together. If you are getting started with Pluto, this is the distribution you want.
  • pluto-current-bin - Provides the Pluto libraries, portal and testsuite web applications.
  • pluto-current-container-bin - Provides the Pluto container libraries only.
  • pluto-current-src - Provides the Pluto source code; requires that you build and deploy Pluto on your own.
  1. Download the Pluto 1.1 binary distribution named pluto-current-bundle from a distribution site.
  2. Unzip the binary distribution into a directory.
    1. <PLUTO-1.1-HOME> will be the top level directory.
  3. Execute startup.bat (Windows) or startup.sh (Unix) in <PLUTO-1.1-HOME>/bin.
    1. Use shutdown.bat/shutdown.sh to stop the portal
  4. Browse to http://localhost:8080/pluto/portal
  5. Login as the user pluto (password=pluto).

Building Pluto from Source

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.

Obtaining Pluto 1.1 Source Code

The Pluto project uses the Subversion version control system. If you're new to Subversion, you can check out the online book 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). Web Access to Subversion To browse the Pluto 1.1 source code, you can use the ViewCVS web interface to Subversion. This is current at all times. Normal Subversion Access 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.

Check out from Subversion

Again, anyone can do this. To check out the latest distribution of Pluto 1.1 (trunk) to a directory called 'pluto' use this command:
svn checkout https://svn.apache.org/repos/asf/portals/pluto/trunk/ pluto
To check out Pluto 1.1.1 source to the 'pluto' directory use this command:
svn checkout https://svn.apache.org/repos/asf/portals/pluto/tags/pluto-1.1.1 pluto
Zipped up Pluto source distributions can also be downloaded from a distribution mirror.

Building Pluto with Maven 2

If this is your first time building Pluto with Maven 2, edit ~/.m2/settings.xml and add the <pluginGroups> element:
<settings>
  ...
  <pluginGroups>
    <pluginGroup>org.apache.pluto</pluginGroup>
  </pluginGroups>
  ...
</settings>
            
If you don't have org.apache.pluto specified as a <pluginGroup>, then the pluto:install will fail.

<PLUTO-1.1-SRCHOME> is the local directory where the Pluto 1.1 source distribution has been checked out or unzipped into.

$> cd <PLUTO-1.1-SRCHOME>
$> mvn install
$> mvn pluto:install -DinstallDir=path/to/appserver
          

The install goal is a built in Maven 2 lifecycle which builds the project artifacts and installs them into the Maven repository.

The pluto:install 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 here.

If installing to a directory that contains spaces, installDir needs to be enclosed within quotes:

C:\pluto> mvn pluto:install -DinstallDir="C:\Program Files\Apache Software Foundation\Tomcat 5.5"
          

Installing Pluto Manually

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 (mvn install) be run from <PLUTO-1.1-SRCHOME>.

Step 1:

$> cd <PLUTO-1.1-SRCHOME>
$> mvn install
          

Step 2: Copy the following to <TOMCAT_HOME>/shared/lib:

  • castor-1.0.jar
  • portlet-api-1.0.jar
  • pluto-container-1.1.1.jar
  • pluto-descriptor-api-1.1.1.jar
  • pluto-descriptor-impl-1.1.1.jar
  • pluto-taglib-1.1.1.jar
Step 3: Copy the following to <TOMCAT_HOME>/common/endorsed:
  • xercesImpl-2.6.2.jar
  • xmlParserAPIs-2.6.2.jar
Step 4: Copy the following to <TOMCAT_HOME>/conf/Catalina/localhost:
  • <PLUTO_SRCHOME>/pluto-portal/src/main/resources/pluto.xml
  • <PLUTO_SRCHOME>/pluto-testsuite/src/main/resources/testsuite.xml
Step 5: Copy the following to <TOMCAT_HOME>/webapps:
  • <PLUTO_SRCHOME>/pluto-portal/target/pluto-portal.war
  • <PLUTO_SRCHOME>/pluto-testsuite/target/pluto-testsuite.war

Installing Pluto with a Windows EXE

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.

Configuring Source-Built Pluto for Application Scope PortletSession Attributes

To be able to use application-scoped PortletSession attributes in Pluto, modify the Connector element for port 8080 in <TOMCAT_HOME>/conf/server.xml by adding the following attribute and value: emptySessionPath="true".

Configuring User and Role in the Pluto Source Build

The Pluto Testsuite portlet application needs the role 'pluto' to run the Security Mapping Test. So before starting tomcat, you should edit <TOMCAT_HOME>/conf/tomcat-users.xml, add the role 'pluto', and add a user in that role. The simplest way to do this is to edit add the 'pluto' role to the 'tomcat' user's record. Here is a sample tomcat-users.xml file:
<?xml version="1.0" encoding="utf-8"?>
<tomcat-users>
  <role rolename="pluto"/>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat,pluto"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
</tomcat-users>
        

Starting the Portal

Now you are ready to use the Pluto Portal built from source. Start up tomcat by running startup.bat (for windows) or startup.sh (for *nix) in <TOMCAT_HOME>/bin, and browse to http://localhost:8080/pluto/portal. Login to Pluto using the user and password you just created in tomcat-users.xml. If you added the 'pluto' role to the 'tomcat' user's record, you can login as 'tomcat/tomcat'.


]]>
Plutoåˆå§‹åŒ–æµ½E?/title><link>http://www.aygfsteel.com/zhuyan/articles/106714.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Tue, 27 Mar 2007 09:11:00 GMT</pubDate><guid>http://www.aygfsteel.com/zhuyan/articles/106714.html</guid><wfw:comment>http://www.aygfsteel.com/zhuyan/comments/106714.html</wfw:comment><comments>http://www.aygfsteel.com/zhuyan/articles/106714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zhuyan/comments/commentRss/106714.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zhuyan/services/trackbacks/106714.html</trackback:ping><description><![CDATA[ <div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px"> <h2>Plutoåˆå§‹åŒ–æµ½E?a title="æ°æ€¹…链接åQšPluto控制‹¹ç¨‹" ></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é…置文äšg.</font> </p> <p> <font face="Arial">     // åˆå§‹åŒ–Portlet容器, 容器实现¾cÕdœ¨ConfigService.properties中指å®?br />     PortletContainerFactory.getPortletContainer().init()</font> </p> <p> <font face="Arial">二ã€è¯·æ±‚å¤„ç†æµ½E?</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, è¯Õd–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æ–‡äšgå…Œ™”, åŽè€…定义了™åµé¢çš„布局<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æ–‡äšgåQŒå½“å‰äØ“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的孾cÕd¯¹åº”,上é¢çš„定义中包括RootFragment, <br />        PageFragment, RowFragment, ColumnFragmentå’ŒPortletFragmentåQŒé™¤äº†PortletFragment外,<br />        其它Fragment的处ç†å¤§è‡´ä¸Šæ˜¯ä¸€æ ïLš„åQ?br />   Iterator childIterator = fragment.getChildFragments().iterator();</font> </p> <p> <font face="Arial">   // é历å­fragment, òq¶è°ƒç”¨å…¶æœåŠ¡æ–ÒŽ³•ã€?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çš„åˆå§‹åŒ–, ä¸»è¦æ˜¯ä»Žé…置文äšg中读å–Portlet定义ã€?br />  PortletFragment.init()</font> </p> <p> <font face="Arial">      // è¯Õd–Portlet的实体Id, 在pageregistry.xml中由portlet属性指å®?<br />      String portletEntityId = getInitParameters().getString("portlet");</font> </p> <p> <font face="Arial">      // è¯Õd–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><br />       ã€?application><br />       〈application id="4"ã€?br />          〈definition-id>testsuiteã€?definition-idã€?br />          〈portlet id="1"ã€?br />              〈definition-id>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的对应关¾p…R€?/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><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></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åQŒå®ƒç”±dispatchæ–ÒŽ³•¾lŸä¸€˜q›è¡Œè¯äh±‚处ç†.</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">     è‡Ïx­¤åQŒè¯·æ±‚就由portlet˜q›è¡Œå¤„ç†äº†ã€?/font> </p> <p> <font face="Arial">从上é¢çš„‹¹ç¨‹å¯ä»¥çœ‹å‡ºåQŒPlutož®±æ˜¯ž®†è¯·æ±‚分‹z‘Öˆ°™åµé¢ä¸Šçš„å„个portletåQŒportletæ ÒŽ®method执行相应æ“作åQ?/font> </p> <p> <font face="Arial">最åŽç”±Plutož®†å®ƒä»¬å¤„ç†çš„¾l“果按特定布局˜q›è¡Œæ˜„¡¤ºã€?/font> </p> </td> </tr> </tbody> </table> </div> <img src ="http://www.aygfsteel.com/zhuyan/aggbug/106714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zhuyan/" target="_blank">朱岩</a> 2007-03-27 17:11 <a href="http://www.aygfsteel.com/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.aygfsteel.com/zhuyan/articles/105752.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Fri, 23 Mar 2007 02:37:00 GMT</pubDate><guid>http://www.aygfsteel.com/zhuyan/articles/105752.html</guid><wfw:comment>http://www.aygfsteel.com/zhuyan/comments/105752.html</wfw:comment><comments>http://www.aygfsteel.com/zhuyan/articles/105752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zhuyan/comments/commentRss/105752.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zhuyan/services/trackbacks/105752.html</trackback:ping><description><![CDATA[ <p>Pluto是一个满­‘³Portlet API规范的Portlet容器的实玎ͼŒå®ƒäؓ开å‘者æä¾›äº†ä¸€ä¸ªè¿è¡?portlets的工作åã^å°ã€‚然而,如果没有一个驱动器åQˆdriveråQ‰ï¼Œä¹Ÿå°±æ˜¯PortalåQŒçš„æ”¯æŒçš„è¯åQ?˜q行和测试Portlet容器ž®†éžå¸æ€¹‹éºÈƒ¦ã€‚Pluto本èín也æä¾›äº†ä¸€ä¸ªç®€å•çš„Portal模å—åQŒè¯¥æ¨¡å—ä»?仅是ä¸ÞZº†æ»¡èƒöPortlet容器和JSR 168的需è¦è€Œå†™çš„。如果你需è¦ä¸€ä¸ªæˆç†Ÿçš„PortalåQŒè¯·å‚è€?<a class="newWindow" title="New Window" target="_blank">Jetspeed</a>™å¹ç›®ã€‚Jetspeed™å¹ç›®å…Ïx³¨çš„æ˜¯Portal本èínåQŒè€Œä¸æ˜¯Portlet容器ã€?</p> <p>å›?是Portal的基本体¾pÈ»“构图。Portal Web Application处ç†å®¢æˆ·çš„请求,从客æˆïLš„å½“å‰ ™åµä¸­æå–出portletsåQŒç„¶åŽè°ƒç”¨portlet容器æ¥èŽ·å¾—æ¯ä¸€ä¸ªportlet的内å®V€‚Portal通过 Portlet容器的Invoker APIæ¥è®¿é—®portlet容器。这些API是portlet容器的主è¦è°ƒç”¨æŽ¥å£ï¼Œ 它们为Portalæä¾›äº†ä¸€äº›åŸºäºŽè¯·æ±‚çš„æ–ÒŽ³•æ¥è°ƒç”¨portlet。容器的使用者(<i>å³PortalåQŒè¯‘è€?æ³?/i>åQ‰å¿…™åÕd®žçްportlet容器的Container Provider SPIåQˆService Provider InterfaceåQ‰å›žè°ƒæŽ¥å£ï¼Œæ¥äØ“portlet容器æä¾›ä¸ŽPortal相关的信æ¯ã€‚最åŽï¼Œportlet容器é€?˜q‡Portlet API调用所有的portletsã€?</p> <p> <img alt="" src="http://people.apache.org/~zheng/pluto/chinese/developer/images/portal_arch.jpg" /> <br /> <br /> <b>å›?åQšä¸€ä¸ªé›†æˆäº†Pluto的简å•Portal</b> <br /> <br /> </p> <div id="wmqeeuq" class="section"> <a name="Portlet容器"> </a> <h2>Portlet容器</h2> <p>Portlet容器是portletsçš„è¿è¡Œæ—¶çŽ¯å¢ƒåQŒä¹Ÿæ˜¯æ¯ä¸€ä¸ªPortal的核心组件。Portlet容器需è¦èŽ· å–æœ‰å…³Portal本èín的一些信æ¯ï¼Œ˜q˜å¿…™å»é‡ç”¨Portal的一些基本代ç ã€‚因此,Portlet容器å¯ä»¥ ä¿è¯è‡ªå·±ä¸Žå…¶å®ƒçš„Portal¾l„äšg之间是完全分开的。也ž®±æ˜¯è¯ß_¼Œä½ å¯ä»¥æŠŠä¸€ä¸ªç‹¬ç«‹çš„Portlet容器 æ’å…¥åˆîC“Q何一个Portal中去åQŒåªè¦å®ƒå¯ä»¥æ»¡èƒöPortletå®¹å™¨çš„è¦æ±‚,比如实现了所有的SPIã€?</p> <p>Portlet容器的Invoker APIåQˆä¹Ÿè¢«ç§°ä¸ø™¿›å…¥ç‚¹åQ‰æ˜¯Portlet容器的主è¦è°ƒç”¨æŽ¥å£ã€‚这些APIåŒ?å«Portlet容器的生命周期控制方法(init()åQŒdestroy()åQ‰å’ŒåŸÞZºŽè¯äh±‚的调用方æ³?åQˆinitPage()åQŒperformTitle()åQŒportletService()½{‰ç­‰åQ‰ã€‚由于Portlet容器最¾lˆæ˜¯ 去调用一个portletåQŒæ•…˜q™äº›æ–ÒŽ³•的签åå’ŒPortlet API的主è¦portlet接å£å¾ˆç±»ä¼û|¼Œé™¤äº†ä¸€ä¸?™å»é¢å¤–传入的portlet ID。Portlet容器å¯ä»¥é€šè¿‡˜q™ä¸ªé¢å¤–传入的portlet ID傿•°æ¥å†³å®šè°ƒç”?哪一个portletã€?</p> <p>除了å¯ä»¥ä½¿ç”¨Invoker APIæ¥è°ƒç”¨Portlet容器外,Portal˜q˜å¿…™åÕd®žçްPortlet容器定义的SPIã€?å› æ­¤åQŒå‚考实现引入了“容器æœåŠ¡â€çš„æ¦‚念åQšå®¹å™¨æœåŠ¡ç”¨æ¥å®šä¹‰ä¸€äº›èƒ½å¤Ÿåœ¨å®¹å™¨ä¸­æ³¨å†Œçš„坿’的组ä»Óž¼Œ ˜q™äº›¾l„äšgè¦ä¹ˆæä¾›ä¸€äº›åŸºæœ¬çš„功能åQŒè¦ä¹ˆå¯¹å®¹å™¨˜q›è¡Œæ‰©å±•。Plutoå‚考实现定义了下题q™äº›å†…å¾çš?容器æœåŠ¡åQˆå‰å››ä¸ªæ˜¯è¿è¡ŒPortlet容器所必须实现的,而第五个则是å¯é€‰çš„åQ‰ï¼š </p> <p> </p> <ul> <li> <b>Information ProvideråQˆä¿¡æ¯æä¾›è€…)</b>åQšäØ“Portlet容器æä¾›å…³äºŽPortalå?其框架的信æ¯ã€‚通过该接å£åªèƒ½å¤ŸèŽ·å¾—ä¸€äº›å·²çŸ¥çš„æˆ–å­˜åœ¨Portal中的信æ¯ã€‚这些信æ¯åŒ…括带 坯Dˆªçжæ€ï¼ˆnavigational stateåQ‰çš„URL生æˆã€portlet上下文(portlet contextåQ‰ã€?portlet模å¼åQˆportlet modeåQ‰å’Œ½H—å£çжæ€ï¼ˆwindow stateåQ‰æŽ§åˆ¶ã€? </li> <li> <b>Factory ManageråQˆå·¥åŽ‚ç®¡ç†è€…)</b>åQšå®šä¹‰äº†å¦‚何通过工厂获得一个实玎ͼˆä¸€èˆ¬çš„ Portal应该已ç»å®žçŽ°äº†è¿™æ ïLš„æŽ¥å£åQ‰ã€? </li> <li> <b>Log ServiceåQˆæ—¥å¿—æœåŠ¡ï¼‰</b>åQšå®šä¹‰äº†è¾“出日志的方法(一般的Portal应该已ç»å®?çŽîCº†˜q™æ ·çš„æŽ¥å£ï¼‰ã€? </li> <li> <b>Config ServiceåQˆé…¾|®æœåŠ¡ï¼‰</b>åQšå®šä¹‰äº†å¦‚何获得é…ç½®å€û|¼ˆä¸€èˆ¬çš„Portal应该å·?¾l实çŽîCº†˜q™æ ·çš„æŽ¥å£ï¼‰ã€? </li> <li> <b>Property ManageråQˆå±žæ€§ç®¡ç†è€…,å¯é€‰ï¼‰</b>åQšè¯¥æœåŠ¡è®©Portalå¯ä»¥èŽ·å¾—JSR 168 规范中定义的属性的倹{€?</li> </ul> <p> </p> <p>严格的说åQŒPortlet Object ModelåQˆPortlet对象模型åQ‰ä¹Ÿæ˜¯ä¸€ä¸ªSPIåQŒä½†ä¸Žå…¶å®ƒçš„SPI相比åQ?它处在一个特ŒDŠçš„ä½ç½®ä¸Šã€‚å› æ­¤æˆ‘ä»¬ä¸æŠŠå®ƒçœ‹æˆæ˜¯å®¹å™¨æœåŠ¡çš„ä¸€éƒ¨åˆ†åQŒå› ä¸ºå®ƒå¤„ç†æ‰€æœ‰çš„portlet 对象åQŒåƈ包å«äº†ä¸€äº›æØœæ‚的接å£ã€?</p> <p> <img alt="" src="http://people.apache.org/~zheng/pluto/chinese/developer/images/pluto_arch.jpg" /> <br /> <br /> <b>å›?åQšPortlet容器的体¾pÈ»“æž?/b> <br /> <br /> </p> </div> <div id="wmqeeuq" class="section"> <a name="Portlet的部¾|?> </a> <h2>Portlet的部¾|?/h2> <p>Portlet容器是构建在Servlet容器之上的,所以它å¯ä»¥é‡ç”¨Servletå®¹å™¨çš„è®¸å¤šåŠŸèƒ½ã€‚äØ“äº†è¾¾åˆ?˜q™ä¸€ç‚¹ï¼Œportlet容器必须把一些servlet的属性注入到æ¯ä¸€ä¸ªportlet应用的waræ–‡äšg中,å¦?å›?所½Cºã€‚Portlet¾l„äšg的部¾|²å™¨ž®†åœ¨åŽŸå…ˆçš„waræ–‡äšg中注入一个新的或者修改过的web.xmlåQŒå† 为æ¯ä¸ªportlet注入一个servletåŒ…è£¹å™¨ï¼Œä»¥æ­¤ä½œäØ“è°ƒç”¨ç‚V€‚ç„¶åŽï¼Œportlet部çÖv器将把这个修 改过的waræ–‡äšg传给应用æœåŠ¡å™¨çš„éƒ¨çÖvå™¨ï¼Œä»¥æ­¤æ¥æŠŠå®ƒéƒ¨¾|²åˆ°åº”用æœåŠ¡å™¨çš„¾pÈ»Ÿä¸­ã€‚当一ä¸?portlet被调用时åQŒportlet容器ž®†è°ƒç”¨æ³¨å…¥çš„servletåŒ…è£¹å™¨ï¼ŒæŠŠè¿™ä½œäØ“è¢«éƒ¨¾|²çš„portletçš?waræ–‡äšg的进入点ã€?</p> <p> <img alt="" src="http://people.apache.org/~zheng/pluto/chinese/developer/images/portlet_deployment.jpg" /> <br /> <br /> <b>å›?åQšå‚考实çŽîC¸­portlet的部¾|?/b> <br /> <br /> </p> </div> <div id="wmqeeuq" class="section"> <a name="Plutoå’ŒWSRP标准"> </a> <h2>Plutoå’ŒWSRP标准</h2> <p>JSR 168规范和Web Service for Remote PortletsåQˆWSRPåQ‰æ ‡å‡†æœ‰é«˜åº¦çš„一致性。这ä¸?ä¸ªåŒæ—¶å‡ºçŽ°çš„æ ‡å‡†éƒ½å‘布了开放æºç çš„实现åQŒå®ƒä»¬çš„实现都完æˆäº†åœ¨ç›¸åº”的规范中定义的所有必è¦?功能。这两个标准都把能很好的互相åä½œä½œäØ“å®ƒä»¬å…±åŒçš„目标。因此,WSRP portletsåœ?portlet容器中既å¯ä»¥ä½œäؓ消费者è¿è¡Œï¼Œä¹Ÿå¯ä»¥ä½œä¸ºç”Ÿäº§è€…è¿è¡Œã€?</p> <p>Pluto™å¹ç›®å¿…须支æŒåœ¨ä¸€ä¸ªPortal中è¿è¡Œå¤šä¸ªportlet容器。因此,Pluto Portlet容器å¯ä»¥ 被多‹Æ¡åˆå§‹åŒ–。更é‡è¦çš„æ˜¯åQŒå®ƒå¯ä»¥ä»¥ä¸åŒçš„æ–¹å¼˜q行åQŒæ¯ä¸ªportlet容器都ä‹É用一个ä¸åŒçš„SPI 实现ã€?</p> </div> <img src ="http://www.aygfsteel.com/zhuyan/aggbug/105752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zhuyan/" target="_blank">朱岩</a> 2007-03-23 10:37 <a href="http://www.aygfsteel.com/zhuyan/articles/105752.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">½ðÌÃÏØ</a>| <a href="http://" target="_blank">ÒËÑôÏØ</a>| <a href="http://" target="_blank">ͨ½­ÏØ</a>| <a href="http://" target="_blank">´ï¶û</a>| <a href="http://" target="_blank">ǧÑôÏØ</a>| <a href="http://" target="_blank">¾ÞÂ¹ÏØ</a>| <a href="http://" target="_blank">½­ÓÍÊÐ</a>| <a href="http://" target="_blank">ƽÄÏÏØ</a>| <a href="http://" target="_blank">»¯Â¡</a>| <a href="http://" target="_blank">ÖÐÎÀÊÐ</a>| <a href="http://" target="_blank">캵ÂÏØ</a>| <a href="http://" target="_blank">ËÕÄáÌØÓÒÆì</a>| <a href="http://" target="_blank">³¤É³ÏØ</a>| <a href="http://" target="_blank">Î÷Ï¿ÏØ</a>| <a href="http://" target="_blank">Áú¾®ÊÐ</a>| <a href="http://" target="_blank">ÄÏÕÄÏØ</a>| <a href="http://" target="_blank">ÅͰ²ÏØ</a>| <a href="http://" target="_blank">ãôºéÏØ</a>| <a href="http://" target="_blank">ºù«µºÊÐ</a>| <a href="http://" target="_blank">¼ªÄ¾ÄËÏØ</a>| <a href="http://" target="_blank">°üÍ·ÊÐ</a>| <a href="http://" target="_blank">À¥Ã÷ÊÐ</a>| <a href="http://" target="_blank">È«½·ÏØ</a>| <a href="http://" target="_blank">Í¨Î¼ÏØ</a>| <a href="http://" target="_blank">±±º£ÊÐ</a>| <a href="http://" target="_blank">ÐÂç­ÏØ</a>| <a href="http://" target="_blank">»Æ¸ÔÊÐ</a>| <a href="http://" target="_blank">¶¨ÖÝÊÐ</a>| <a href="http://" target="_blank">ºâÉ½ÏØ</a>| <a href="http://" target="_blank">ãþÔ´ÏØ</a>| <a href="http://" target="_blank">±±Æ±ÊÐ</a>| <a href="http://" target="_blank">¾£ÖÝÊÐ</a>| <a href="http://" target="_blank">ÎâÖÒÊÐ</a>| <a href="http://" target="_blank">¶«·áÏØ</a>| <a href="http://" target="_blank">DZ½­ÊÐ</a>| <a href="http://" target="_blank">½­´¨ÏØ</a>| <a href="http://" target="_blank">¼Ó²éÏØ</a>| <a href="http://" target="_blank">Ó¯½­ÏØ</a>| <a href="http://" target="_blank">¹ÅÀËÏØ</a>| <a href="http://" target="_blank">ÉÐÒåÏØ</a>| <a href="http://" target="_blank">ÌÒÔ°ÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>