??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩一区二区三区在线视频,国产欧美精品久久久,欧美精选视频一区二区http://www.aygfsteel.com/realzar/皇家撒拉哥萨zh-cnSun, 06 Jul 2025 20:02:00 GMTSun, 06 Jul 2025 20:02:00 GMT60http://blog.csdn.net/chenyun2000/category/60121.aspxhttp://www.aygfsteel.com/realzar/archive/2006/08/16/63845.html开源爱好?/dc:creator>开源爱好?/author>Wed, 16 Aug 2006 03:27:00 GMThttp://www.aygfsteel.com/realzar/archive/2006/08/16/63845.htmlhttp://www.aygfsteel.com/realzar/comments/63845.htmlhttp://www.aygfsteel.com/realzar/archive/2006/08/16/63845.html#Feedback0http://www.aygfsteel.com/realzar/comments/commentRss/63845.htmlhttp://www.aygfsteel.com/realzar/services/trackbacks/63845.htmlhttp://blog.csdn.net/chenyun2000/category/60121.aspx

]]>
Jetspeed-2 心得隨筆(5)(?-Security http://www.aygfsteel.com/realzar/archive/2006/07/17/58617.html开源爱好?/dc:creator>开源爱好?/author>Mon, 17 Jul 2006 09:22:00 GMThttp://www.aygfsteel.com/realzar/archive/2006/07/17/58617.htmlhttp://www.aygfsteel.com/realzar/comments/58617.htmlhttp://www.aygfsteel.com/realzar/archive/2006/07/17/58617.html#Feedback2http://www.aygfsteel.com/realzar/comments/commentRss/58617.htmlhttp://www.aygfsteel.com/realzar/services/trackbacks/58617.htmlJetspeed2 Security介紹的官斚w結:
[url]http://portals.apache.org/jetspeed-2/multiproject/jetspeed-security/[url]

J2使用JAAS的來處理security有關的問。以之前裝在Tomcat上的J2ZQ可以由c:\tomcat\conf\Catalina\localhost\jetspeed.xml及C:\tomcat\webapps\jetspeed\WEB-INF\web.xml看到有關JAAS Realm及login的設定?

大致上來說,JAAS包含Principal、Permission、Policy三個概c在J2中有user、role、group三種Principal。而Permission基本上有page、portletQtab{等Q當然也可以增加自訂的Permission。至於PolicyQJ2並沒有用JAAS的policy檔,而是使用自帶的RdbmsPolicyQ也是把Policy的資a存在資料n中;而透過"適當"的實作和a定QJ2也可以用相關App Server的JAAS?

底下是官方的security元g架構圖:

在J2中,核心的部份就?J2 Security Coarsed Services"裡的4個Manager元g。J2的JAAS login module實際上是使用UserManager來進行authenticationQUserManager透過OJB自資料n中取出user的資料例如UserPrincipal、Crendential{並進行authorization.

畉過UserManager認證完成以後QJ2會同時將此User相對應的所有Principal取出並徏立此User的Subject。此後,當SecurityValve埯時,會呼叫JAAS的Subject.doAsPrivileged(Subject,PrivilegedAction,AccessControlContext)進行有關authorization的動作。有興趣的可以參考org.apache.jetspeed.security.impl.AbstractSecurityValve的原始碼?

J2在security的部份也提供了SPI的設a供開發人員加入自訂的認證方式,例如使用LDAPQ參考底下官方的連結http://portals.apache.org/jetspeed-2/multiproject/jetspeed-security/ldap.html可以知道如何使用LDAP來進行J2上的認證?

關於J2Q其實還有很多部份值得介紹Q例如Bridge、Profiler{等。可惜這些部䆾弟並不是十分的了解Q期待日後有更多高手能夠J2做更多的介紹Q小弟在此先向大家跪啦!!Orz



]]>
Jetspeed-2 心得隨筆(4)-Portal Page的呈?/title><link>http://www.aygfsteel.com/realzar/archive/2006/07/17/58610.html</link><dc:creator>开源爱好?/dc:creator><author>开源爱好?/author><pubDate>Mon, 17 Jul 2006 09:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/realzar/archive/2006/07/17/58610.html</guid><wfw:comment>http://www.aygfsteel.com/realzar/comments/58610.html</wfw:comment><comments>http://www.aygfsteel.com/realzar/archive/2006/07/17/58610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/realzar/comments/commentRss/58610.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/realzar/services/trackbacks/58610.html</trackback:ping><description><![CDATA[ <span id="wmqeeuq" class="javascript" id="text140002">先看一下在JSR168中提到的Portal pageQ可以了解一個Portal Page上大概有哪些elementQ?<br /><img src="http://www.javaworld.com.tw/jute/gallery/d/2/d2F5eW91bmc=/1136447867343.png" border="0" /><br /><br />OK...進入本次主題 <br /><br /><b>PSML</b>: <br />PSML的全名是Portal Structure Markup Language。J2用PSML來定Portal內的各種resourceQ包括Page、Folder、Link、Security、Menus{等Q有關J2的PSML詳細介紹在此<a class="ilink" target="_blank">http://portals.apache.org/jetspeed-2/guides/guide-psml.html</a>?<br /><br />這裡要特別提一下PSML Page。在J2中,一個PSML Page׃表一個Portal pageQ其根元素為<page>Q裡面指定了這個Portal page所包含的portlet及排列方?ex: 2行或3?、這個Portal page所使用的樣?E後會提到的<b>layout</b>)還有這個Portal page的外觀(E後會提到的<b>decoration</b>){等?<br /><br />另外一個要特別說明的是在PSML Page中所使用?lt;fragment>這個tag。fragment有portlet和layout二種Q用type這個屬性來區別;<fragment type="portlet">代表一個portletQ?lt;fragment type="layout">代表這個page所用的layoutQ然而不是哪一EfragmentQname屬性的值都應該依照"portlet-app-id::portlet-id"的格式?<br /><br />以之前範例中的Sample.psmlZQ根元素?lt;page>Q所以這是一個PSML PageQ第一?lt;fragment>是layout fragmentQ指定了這個page所使用的layoutQname屬性的值為"jetspeed-layouts::VelocityTwoColumns"。第二?lt;fragment>是例的echo portletQname屬性的值為"sample::EchoPortlet"Q就W合之前所描述的格式?<br /><br />事實上,layout fragment其實也是portlet。看一下C:\tomcat\webapps\jetspeed\WEB-INF\apps\裡有一個jetspeed-layouts目錄Q就是J2內部的一個Portlet application。因?jetspeed-layouts::VelocityTwoColumns"會對到這個目錄下portlet-id為VelocityTwoColumns的portlet。總之,<b>J2的layout也是portlet</b>Q如果再研究一下,其實還是個Velocity Bridge的portlet. <br /><br /><b>layout:</b><br />J2中的<b>layout</b>指的是用來排列Portal page中各個portlet的樣ѝ預a的情況下,J2用Velocity來實?b>layout</b>?<br /><br /><b>decoration:</b><br />J2中的<b>decoration</b>是用來裝飾Portal page和portlet使其觀Q分為layout-decoration和portlet-decoration兩種。layout-decoration負K一整個Portal page(因此叫page-decoration)Q而portlet-decoration負K每一個Portlet fragment。預a的情況下,J2用Velocity和CSS來實?b>decoration</b>。當J2在呈現一Portal page時,會依照這個Portal page指定?b>layout</b>來排列這個page上的各個portletQ並且用這個page所指定的layout-decoration和portlet-decoration來美化這個page和所有的portlet。有?b>decoration</b>的細可參?a class="ilink" target="_blank">http://portals.apache.org/jetspeed-2/guides/guide-decorators.html</a><br /><br /><b>Aggregator:</b><br />在J2中,一個Portal page的request最後通常會傳i一?b>Aggregator</b>Q然後由<b>Aggregator</b>負K跟Portal page內包含的所有portlet溝通並聚合各個portlet fragment以產生整個Portal page。以之前舉例?i>jetspeed-pipeline</i>來說(C:\tomcat\webapps\jetspeed\WEB-INF\assembly\pipelines.xml)Q可以看?i>aggregatorValve</i>這個bean被注入了<i>org.apache.jetspeed.aggregator.PageAggregator</i>這?b>Aggregator</b>Q再參考C:\tomcat\webapps\jetspeed\WEB-INF\assembly\aggregation.xml中,可已知道這個bean的實作是org.apache.jetspeed.aggregator.impl.PageAggregatorImpl?<br /><br />來看一下這個PageAggregatorImpl的中用來產生Portal page的方?部䆾省略修改): <br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre><font class="java-reserved_word"><b>public</b></font><font class="java-reserved_word"><b>void</b></font> build( RequestContext context )<font class="java-bracket">{</font><font class="java-comment">//取得requested page</font> ContentPage page=context.getPage(); <font class="java-comment">//取得 root fragment</font> ContentFragment root = page.getRootContentFragment(); <font class="java-comment">//aggregate及render各個PortletQ基本上render的結果都寫到context?/font> aggregateAndRender(root, context, page);   <font class="java-comment">//結果寫入response</font> context.getResponse().getWriter().write(root.getRenderedContent()); <font class="java-bracket">}</font></pre></td></tr></tbody></table><br /><br />首先要注意一下傳入的是一個J2的RequestContext物gQ基本上可以視為是用來存N次request盔R資訊的一個contextQ此外,可以把ContentFragement物g視為portlet。而其中第6行取得root fragmentQ實際上是取得前面所說的layout fragmentQ也是"jetspeed-layouts::VelocityTwoColumns"這個portlet?<br /><br />接著再看一下第9行的aggregateAndRender()Ҏ(gu)(部䆾省略修改)Q?<br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre><font class="java-reserved_word"><b>protected</b></font><font class="java-reserved_word"><b>void</b></font> aggregateAndRender( ContentFragment f, RequestContext context, ContentPage page )<font class="java-bracket">{</font>   Iterator children = f.getContentFragments().iterator(); <font class="java-reserved_word"><b>while</b></font> (children.hasNext())<font class="java-bracket">{</font> ContentFragment child = (ContentFragment) children.next(); <font class="java-comment">//遞迴</font> aggregateAndRender(child, context, page); <font class="java-bracket">}</font><font class="java-comment">// 開始真正做render的動作,基本上render的結果都寫到context?/font> renderer.render(f, context); <font class="java-comment">//renderer是org.apache.jetspeed.aggregator.impl.PortletRendererImpl</font><font class="java-comment">//加上decoration</font> addStyle(context, f.getDecorator(),ContentFragment.PORTLET); <font class="java-bracket">}</font></pre></td></tr></tbody></table><br /><br />׃面的codeQ可以了解到J2先把整個page上所有的portlet由外到內串v來,再由內到外一個一個做render的動作,而每render完一個portletQ就加上應的decorationQ直到做完整個page?<br /><br />在第12行中Qrender的動作實際上是renderer透過Pluto來呼叫portlet(實際上是ContentFragment物g被包成portlet window)的renderҎ(gu)。PortletRendererImpl.render()這個方法裡使用了常見的Worker Thread和Observer樣式Q以達到render多個portlet的功能,有興的不妨研究一下?<br /><br />那如果想要新加外觀??最單的方式,是先參考J2的layout portlet寫自已的layoutQ然後加入decoration。講起來Ҏ(gu)Q不過layout可是不太Ҏ(gu)寫的Q因為牽扯到的技術還dQ而且J2也要有一定了解;但是如果能做ZQ安裝就不會太麻煩。也aq以後J2紅v來以後,會有各式各樣的外觀可以玩吧...<img alt="Cool" src="http://www.javaworld.com.tw/jute/images/smiles/smile_cool.gif" width="15" /><br /><br />其他參考資料: <br />Portal Design Doc : <a class="ilink" target="_blank"><font color="#004080">http://portals.apache.org/jetspeed-2/guides/guide-portal-design.html</font></a><br />介J2中有關Portal Page的一些概?<br /><br />Jetspeed Power Tool (JPT) : <a class="ilink" target="_blank"><font color="#004080">http://portals.apache.org/jetspeed-2/guides/guide-jpt.html</font></a><br />開發layout和decoration時會用到 </span> <br /> <img src ="http://www.aygfsteel.com/realzar/aggbug/58610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/realzar/" target="_blank">开源爱好?/a> 2006-07-17 17:06 <a href="http://www.aygfsteel.com/realzar/archive/2006/07/17/58610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jetspeed-2 心得隨筆(3)-Overview http://www.aygfsteel.com/realzar/archive/2006/07/17/58609.html开源爱好?/dc:creator>开源爱好?/author>Mon, 17 Jul 2006 09:05:00 GMThttp://www.aygfsteel.com/realzar/archive/2006/07/17/58609.htmlhttp://www.aygfsteel.com/realzar/comments/58609.htmlhttp://www.aygfsteel.com/realzar/archive/2006/07/17/58609.html#Feedback0http://www.aygfsteel.com/realzar/comments/commentRss/58609.htmlhttp://www.aygfsteel.com/realzar/services/trackbacks/58609.htmlJetspeed1是我接觸到第一個Portal Server。可惜其獨特的架構,我一直沒辦法接受。後來因為工作上的需要,弄了很久的WebSphere Portal ServerQ卻^是有一E被IBM的感覺。最q和Jetspeed2相處一陣子後,覺得J2M錯的Q儘release的比較慢Q可是架構、功能和速度個h都覺得滿意。寫下一些個h心得Q希望有更多能h加入J2Q一起開g些有用的元g和管理設定的portletQ讓J2完美?

p希望J2能超WPS...哈哈?

J2的feature很多Q請務必連至http://portals.apache.org/jetspeed-2/features.html瀏覽一下。另外對Spring、Velocity、JAASQJSR168的了解是一定要的?

OKQ碎唸完畢。今天介紹一下J2的一些觀念,如果有錯誤,請大家不吝指正?
(文章中提到的一些檔案\徑,是依照之前寫的範例?

先來一張官方的overview程

在這張圖中QJ2是位於Engine的部份,而Container是Pluto Portlet ContainerQPortlet是自已寫的PortletQ所以這張圖正好對照JSR168中的Portal--Portlet Container--Portlet的概c要特別注意的是Q圖中在Engine和Container之間有很多個雙向的頭Q這代表整個流E可能會在這裡來來回回地執行?
x這圖大概可以這樣說明:
1 request送至server後由JetspeedServlet(org.apache.jetspeed.JetspeedServlet)接收

2 JetspeedServlet透過Jetspeed(org.apache.jetspeed.Jetspeed)取得ComponentManagerQ然後透過ComponentManager取得RequestContextComponent(org.apache.jetspeed.request.JetspeedRequestContextComponent)

3 RequestContextComponent會針這個request建立一個RequestContext(org.apache.jetspeed.JetspeedRequestContext)Q並且讓這個request和新建的RequestContext能互相參?

4 呼叫Engine(org.apache.jetspeed.JetspeedEngine)的service()Ҏ(gu)Q這個方法會把剛剛徏立的RequestContext傛_Q這樣後面的元件才能?

5 在service()Ҏ(gu)中,Engine會依據request的目標URL來取得相應的Pipeline(org.apache.jetspeed.pipelineJetspeedPipeline)來處理。Pipeline使用了chain of responsibility的patternQ是׃堆Valve(org.apache.jetspeed.pipeline.valve.Valve)串v來的

6 各個Valve依序埯Q其中某些Valve會和Container動作Q某些Valve會負責產生要response的portal頁面。在這個過E中QContiner會執行相關的PortletQ並結果返回至PipelineQ也是Valve chain中?

7 產生的portal頁面傛_iuserQ流E結?/font>


׃面的介紹Q應該可以體會到Pipeline在J2中是非常重要的元件。這裡附上Pipeline的官方UML圖做參?


而J2本n是Spring-based的架構,主要的Springa定檔都?C:\tomcat\webapps\jetspeed\WEB-INF\assembly"下。JetspeedServlet在init時會建立Spring容器並載入這些a定檔,而之前提到的ComponentManager可以透過name或class在Spring容器中尋N要的component。有關J2的componentQ請務必參?a class="ilink" target="_blank">http://portals.apache.org/jetspeed-2/guides/guide-components.html及原始碼?

來看一下目錄中的pipelines.xml。這個XML是用來組合各個Pipeline和設定各Pipeline和其應的URL。先看一下最後一Dbean id="pipeline-map"的部份,在這邊可以看到URL和其相對應的Pipeline。另外找到bean id="jetspeed-pipeline"這一D,可以看到這個Pipeline中Valve的組合,而這個Pipeline也是default的PipelineQ有興趣的不妨參考這䆾XML把這個Pipeline中的Valve的原始碼扑ֈM,大致了解一下每個Valve在做啥,還蠻有幫助的?

如果依照之前所寫的echo portletQ其FORM的action URL起頭?portalQ而Engine會用此做為key?pipeline-map"中找?jetspeed-pipeline"這個Pipeline來處理?

底下這個是J2附的Valve官方圖Q大家參考一?
 


]]>
Jetspeed-2 心得隨筆(2)-開發一個簡單的Portlethttp://www.aygfsteel.com/realzar/archive/2006/07/17/58607.html开源爱好?/dc:creator>开源爱好?/author>Mon, 17 Jul 2006 09:03:00 GMThttp://www.aygfsteel.com/realzar/archive/2006/07/17/58607.htmlhttp://www.aygfsteel.com/realzar/comments/58607.htmlhttp://www.aygfsteel.com/realzar/archive/2006/07/17/58607.html#Feedback0http://www.aygfsteel.com/realzar/comments/commentRss/58607.htmlhttp://www.aygfsteel.com/realzar/services/trackbacks/58607.html這個portlet有一個textƄ位輸入字串Qsubmit後會在上方出珑։剛入的字串?

1. 延續之前的設定,c:\tomcat\shared\lib\portlet-api-1.0.jar加入CLASSPATH

2. EchoPortlet.java :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package sample;
 
import java.io.IOException;
 
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.PortletSession;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
 
publicclass EchoPortlet extends GenericPortlet{protectedvoid doView(RenderRequest renderRequest, RenderResponse renderResponse)throws PortletException, IOException {
        renderResponse.setContentType("text/html");
        
        String jspName = "/jsp/echo.jsp";
       
        PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(jspName);
        rd.include(renderRequest, renderResponse);
  }
 
  /* (non-Javadoc)
   * @see javax.portlet.GenericPortlet#processAction(javax.portlet.ActionRequest, javax.portlet.ActionResponse)
   */publicvoid processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws PortletException, IOException {
    PortletSession session=actionRequest.getPortletSession();
    session.setAttribute("LAST_TYPED_STRING",actionRequest.getParameter("input")) ;
  }}
 


3. echo.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" session="true" import="javax.portlet.PortletSession"%>
<%@ taglib uri='/WEB-INF/portlet.tld' prefix='portlet'%>
<portlet:defineObjects/>
<portlet:actionURL var="action" />
<p></p>
<%
PortletSession  portletSession=renderRequest.getPortletSession();
String lastTypedString=(String)portletSession.getAttribute("LAST_TYPED_STRING");
if(lastTypedString!=null&&lastTypedString.length()>0){
%>
  The string you typed is:<b><%=lastTypedString%></b>
  <br/>
<%}%>
  <form action="<%=action%>" method="post">
    <input type="text" name="input" id="input" />
    <input type="submit" value="submit" />
  </form>
 
<p></p>


4. Portlet.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<portlet-app id="sample">
        <portlet id="EchoPortlet">
                <portlet-name>Echo Portlet</portlet-name>
                <portlet-class>sample.EchoPortlet</portlet-class>
 
                <expiration-cache>30</expiration-cache>
                <supports>
                        <mime-type>text/html</mime-type>
                        <portlet-mode>view</portlet-mode>
                </supports>
                <supported-locale>en-US</supported-locale>
                <portlet-info>
                        <title>EchoPortlet</title>
                        <short-title>EchoPortlet</short-title>
                        <keywords>EchoPortlet</keywords>
                </portlet-info>
                
        </portlet>
</portlet-app>


5. web.xml

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>Sample</display-name>
</web-app>


6. 準備sample.war檔,i構如下 ( portlet.tld 可從c:\tomcat\webapps\jetspeed\WEB-INF 拯 ):



7. sample.war拷到 C:\tomcat\webapps\jetspeed\deploy ?

8. 以admin這個x號登入JetspeedQ點選左方的"Jetspeed Administrative Portlets"

9. 點選上方?PALM"(Portlet Application Lifecycle Management)Q可以看到已Edeploy的portlet applicationQ?剛剛的sample應該在也在其中。可以從這裡undeploy / delete 不用的portlet application?

10. 接著點選上方的Portal Site ManagerQ會出現整個site目前的結構。點?Root Folder"這個節點,x會出?Folder Details"的portlet?

11. 點選下方?[Add Page]"Q然後在"Name"?Title"?Short Title"都入SampleQ然後按"Save"?

12. 回到首頁Q應該可以看到多了一?Sample"的tabQ在C:\tomcat\webapps\jetspeed\WEB-INF\pages下也多了一個Sample.psml的檔

13. R輯Sample.psml如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<page id="/Sample.psml" hidden="false" version="">
    <title>Sample</title>
    <short-title>Sample</short-title>
    <defaults layout-decorator="tigris" portlet-decorator="tigris"/>
    <fragment id="P-1082c720c8c-10000" type="layout" name="jetspeed-layouts::VelocityTwoColumns">
    
      <fragment id="28825252" type="portlet" name="sample::EchoPortlet">
        <property layout="TwoColumns" name="row" value="0" />
        <property layout="TwoColumns" name="column" value="0" />
      </fragment>
      
    </fragment>
</page>
 


14. 點選那個Sample 的tabQPortlet載入後應該就可以看到?



]]>
Portlet API参考实现的U密http://www.aygfsteel.com/realzar/archive/2006/07/16/58404.html开源爱好?/dc:creator>开源爱好?/author>Sun, 16 Jul 2006 03:26:00 GMThttp://www.aygfsteel.com/realzar/archive/2006/07/16/58404.htmlhttp://www.aygfsteel.com/realzar/comments/58404.htmlhttp://www.aygfsteel.com/realzar/archive/2006/07/16/58404.html#Feedback0http://www.aygfsteel.com/realzar/comments/commentRss/58404.htmlhttp://www.aygfsteel.com/realzar/services/trackbacks/58404.html
概要
    在Stefan Hepper和Stephan Hesmer的portletpd文章的第二部分中Q作者把着W点从Portlet API的基概要介绍转移CPortlet API的参考实?RI reference implementation也就是Pluto)的细节描q。作者还提供了一pdportlet的实例来说明怎样扩展Portlet API的标准函数?br />企业portal提供商用可插的用户接口lgQportletsQ向信息pȝ提供表示层。不q的是,以前的提供商都只定义了自qportlet APIQ在整个行业之中互不相容。ؓ了标准化整个行业q程QJava团体发布了Java规范要求(JSR)168:Portlet规范?br />    q篇pd文章的第一部分介绍了JSP 168的细节。第二部分重Ҏ(gu)在portlet API的参考实玎ͼRIQ上Q也是Pluto。此外还提供了一个portlet的实例,读者可以通过q个实例来学习?br />    文章W一节描qCRI的体pȝ构,包括portlet容器的可拆卸性的概念和怎样在其他项目中重用portlet容器。第二节介绍了RI的安装和使用Q以及怎样快速配|portlet。其中文章还包括一个逐步深入的实例?br />注意Q你可以通过文章之后的资源链接下载原代码

Pluto的体pȝ?/b>
    让我们先来看一下Pluto的体pȝ构和一些基本的概念。我们先要的说明portal的参考实现和portlet容器在整个portal体系l构中的位置。接下来我们在细节方面研IPluto的体pȝ构。最后,我们看一下在portlet容器里很有趣的:portlet 展开?br />
关于portal
       Pluto一般用来演CPortlet API如何工作以及向开发者提供一个测试portlets的实例^台。然而,如果没有驱动来运行和试portlet容器有点ȝ。Pluto的简单portallg只是架构于portlet容器Q它只满了JSR 168的基本要求。(相比之下QApache的开源项目Jetspeedp专业的多。Jetspeed着重中在了portal本n而非portlet容器之上Qƈ且更多的考虑了其他团体的需求。)
    图一描述了portal的基本体pȝ构。Portal的网l应用程序处理客LhQ从用户的当前页面得到portletsQ之后调用portlet容器以获得每个portlet的内宏Vportal使用Portlet 容器?Invoker API来访?portlet容器Q从 portal看来Qportlet 容器的主要接口是支持Zh的方法调?portlets。容器用戯惌得portal的相关信息则必须实现portlet容器的Provider SPI (Service Provider Interface)的callback接口。最l,portlet容器通过portlet API调用所有portlet?br />
IMG upload/forum/2003114165017.jpg[/IMG]

图一QPluto中的一个简单的portal的结?br />
Portlet容器
    
     Portlet容器是portlet的运行环境,也是每个portal的组成核心。它需要有关portal本n的信息,且它必须重用自n的公׃码。因此,portlet容器和其他portallg是完全分ȝ。这是_你可以将独立的portlet容器嵌入L的portalQ只要你满portlet容器的条Ӟ比方说实现所有的SPI?br />Portlet容器?Invoker APIQ或者叫入口点,扮演了portlet容器的主调用接口的角艌ӀPortlet容器的Invoker APIportlet容器的生存周期(initQdestroyQ和Zh的调用方法(initPageQ)QperformTitleQ)QportletServiceQ){等Q结合了h。因为portlet容器最后调用portlet的方法名有点cMportlet API的主portlet接口Q不同的是是否必要传递portlet定义W。正是因个附加的portlet定义W,portlet容器才能正确的调用portlet?br />    除了要用API讉Kportlet容器之外Qportalq必L展portlet容器定义的SPI。因此,RI引入了容器服务:在容器注册过的可拆卸lg提供基础功能q且可扩充。RI包含如下一些容器内的自建服务(前四个必dq行portlet容器时实玎ͼ最后一个是可选的Q:
&#61548;             信息提供器:lportlet容器提供portal和portal框架的信息。通过q个接口来获得信息和存储portal信息。这些信息包括导航栏里的URL、portlet上下文、portlet模式和窗口状态控制?br />        工厂理器:定义了怎么怎样通过工厂Ҏ(gu)来获得一个具体实现。(一个标准的portal应该已经存在一个实现。)
&#61548;        日志服务Q定义了一个日志工P一个标准的portal应该已经存在一个实玎ͼ?br />&#61548;        配置服务Q定义了怎么栯得配|参敎ͼ一个标准的portal应该已经存在一个实玎ͼ?br />&#61548;        属性管理器Q可选)Q属性管理器接口的实现允许处理JSR168规范中定义的属性?br />严格的说Qportlet对象模型也是SPI中的一部分Q只是它在SPI中占有一个特D的C。Portlet对象模型处理所有的potlet对象Q他׃个交l在一L接口集合l成。因此,不能把他和容器服务分开来考虑?br />
IMG upload/forum/2003114165335.jpg[/IMG]

图二Qportlet容器l构

Portlet的部|?/b>

   portlet 容器 架构在servlet容器之上q且增强了它的功能。ؓ了实现它,portlet 容器原始servlet 加入每一个portlet应用E序的war文g?q一Ҏ(gu)们在图三3中有所描述。部|portletlgӞ先取得原始的war文gQ然后向其中加入一个新的或者修改原有的web.xmlQƈ且加入一个servlet作ؓ一个调用点来包装每个portlet。之后, portlet的部|器Q?q个原文是Then the portlet deployment passes the modified war file to the application server deploymentQ会传递一个修改过的war文g到应用服务器Q将光|到应用服务器系l。在portlet的调用过E中,portlet容器调用dq去的servlet,作ؓ部vportlet的war文g的入口点?br />
IMG upload/forum/2003114165353.jpg[/IMG]

图三QRI中portlet的部|?br />
Pluto和WSRP标准

   正像W一部分所描述的那PJSR 168与远Eportlet|络服务Qthe Web Services for Remote Portlets (WSRP)Q标准紧密结合。几乎同时Ş成的q两U标准发布了开源实玎ͼ实现了在各自的规范中描述必要的功能。作为共有的目标Q两U标准努力能够在一h好的合作。现在,portlet容器可以很好的运行WSRP portlet?br />Pluto可以在一个portal中运行多个portlet容器。从而Pluto的portlet容器可以被初始化多次。更重要的是Q可以用不同的方式来初始化它。每一个portlet容器可以使用SPI的不同实现?br />
RI的安?/b>

   你会发现Pluto的安装过E非常简单。执行install命oQbuild目录/build下的install.bat或者install.sh。接下来安装E序会提CZ指定Tomcat的安装目录。(注意Q在MS windows下文件分隔符不是反斜杠。)
在这之后Q安装进E会创徏RI和所有portletQ安装portlet到指定的Tomcat目录。安装完成后h看文档以定完成了所有必要的手工讄工作?br />现在可以启动TomcatQ通过http://localhost:8080/pluto/portal来访问RI了?br />是q么单!

怎样部vportlet
        
      在Pluto中部|portlet和它的安装一L单。只要记住你必须首先安装了PlutoQ它正确的设|了prepareRun.properties。这是部|过E所必须的。在命o提示W下转到build目录Q输入命令deployPortlet.bat Q?用portlet war文g做参敎ͼ比如Q?br />deployPortlet.bat C:\pluto\portlets\bookmark_04\driver\bookmark_04.war

Portlet实例
     我们来看一个portlet的例子,Bookmark。它充分利用了Portlet APIq且阐明了我们学到的概念。我们以一个简单的例子开始,我们在每一节一步步扩展q个Bookmark portletQ最后我们将几乎用到所有的portlet APIQ把它做成一个高U的portlet?br />Bookmark portletQ版本一
W一个Bookmark portlet用到了Portlet API中如下的一些特性:
&#61548;        Portlet API 接口The Portlet API interface
&#61548;        Java服务器页面(jspQJavaServer Pages (JSP) pages
&#61548;        Portlet API标签库The Portlet API tag libraries
&#61548;        部v描述WDeployment descriptors
W一个Bookmark portlet的两个JSP面分别昄和编辑模式。每个JSP面只是单的昄了portlet的当前portlet模式和windwos状态。ؓ了显C些信息,我们用到了Portlet API标签库(只是部分E序代码Q请下蝲全部代码Q不然很隄解:译者注Q:

public void doView (RenderRequest request,
RenderResponse response) throws PortletException, IOException {
        response.setContentType("text/html");        
        String jspName = getPortletConfig().getInitParameter("jspView");
PortletRequestDispatcher rd =
                getPortletContext().getRequestDispatcher(jspName);
        rd.include(request,response);
    }

接下来的代码是例子中的一个简单的JSP 面Q即view.jspQ译者注Q:
<%@ page session="false" %>
<%@ page import="javax.portlet.*"%>
<%@ page import="java.util.*"%>
<%@ taglib uri=&#39;/WEB-INF/tld/portlet.tld&#39; prefix=&#39;portlet&#39;%>
<portlet:defineObjects/>

Hello,<br>
I am the bookmark portlet.<br>
<br>
Current Portlet Mode: <%=portletRequest.getPortletMode()%><br>
Current Window State: <%=portletRequest.getWindowState()%><br>
<br>

Bookmark portletQ版本二
        W二个Bookmark portletq一步深入了Portlet API 的概c除了第一例子所使用到的Portlet API Ҏ(gu),它增加了Q?br />&#61548;        动作处理Action handling
&#61548;        Portlet 参数 Portlet preferences
&#61548;        验证参数 A preferences validator
&#61548;        在部|描q符中预定义参数 Predefined preferences in the deployment descriptor
在第二个Bookmark例子里,两个新的JSP面替代了版本一中的。首先,edit.jsp允许通过portlet动作d和删除书{。在q个JSP面中输入的书签作为portlet参数存放。其ơ,view.jsp 以超链接昄Z为portlet参数存放的书{?br />Bookmark portletQ版本三
        新增用到的特性:
&#61548;        地区性部|描q符 Localizable deployment descriptor
&#61548;        资源包ResourceBundles
现在部v描述W和JSP面从资源包里(ResourceBundlesQ获得可昄的字W集Q他们都可以支持英文和d文了?br />Bookmark portletQ版本四
        最l的q个portlet例子通过portlet API传递递交参量Qrender parametersQ示范了D的概念(the navigational state concept Q。在版本四里有七个书{,但默认一只昄四个Q如囑֛所C。通过点击next和back的超链接Q用户可以导航到向前或者向后的五个书签。初始点被初始化ؓ递交参量Q得用户可以用浏览器的刷新、后退和前q按钮?br />
IMG upload/forum/2003114165559.jpg[/IMG]

Bookmark portlet版本四的界面

Portlet复习
  
   象你所看到的那Pportlet规范的参考实现包括两个部分:portal和portlet容器。Portal作ؓ一个简单的q行portlet容器的测试驱动。Portlet容器作ؓ一个能q速用到其他portalQ比如jetspeedQ里的普通组件?br />    q个portlet实例用到了许多portlet API里的很重要的概念。你可以用所有portlet API和servlet API的特性来扩展q个实例。比方说你可以用一个servlet在新H口中输出其他有用的信息Q如一个打印预览。还可以通过Http会话与portletq行交互。实际上Q因为portlet是一个强大的技术,能用他实现的功能是无Ih的?br />


]]>
Jetspeed支持中文本地?http://www.aygfsteel.com/realzar/archive/2006/07/16/58401.html开源爱好?/dc:creator>开源爱好?/author>Sun, 16 Jul 2006 03:04:00 GMThttp://www.aygfsteel.com/realzar/archive/2006/07/16/58401.htmlhttp://www.aygfsteel.com/realzar/comments/58401.htmlhttp://www.aygfsteel.com/realzar/archive/2006/07/16/58401.html#Feedback0http://www.aygfsteel.com/realzar/comments/commentRss/58401.htmlhttp://www.aygfsteel.com/realzar/services/trackbacks/58401.html本文教会大家怎么h化Jetspeed目?br />
1.让Jetspeed支持中文本地化?br />Jetspeed中支持多U语a的本地化Q偏偏没有提供中文的本地化,不知道是不是Apache开源组l对中国软g水^的歧视。不怎样Q我们中国hq要靠自q努力来改变世界对中国软g的看法。废话不_下面列出中文本地化的步骤Q?br />
Q?Q增加本地化属性文?br />在\WEB-INF\classes\org\apache\jetspeed\modules\localization目录下,存放了Jetspeed使用的本地化属性文Ӟ但是q没有中文本地化属性文件?br />打开JetspeedLocalization.propertiesQ将该属性文件中的属性值翻译ؓ中文Q保存文件到新的文gQ如1.properties。再使用转码工具Q每个jre里都自带了这个工Pnative2ascii .exe翻译完的属性文件{码成ascii~码Q?br />native2ascii 1.properties JetspeedLocalization_zh.properties?br />最后确保将q个本地化属性文件JetspeedLocalization_zh.properties攑֜该目录下?br />注:假如你的Jetspeed目中类l构已经打包部vQ请解开q些cȝ构,部v到classes目录下,方便修改Q此时应原来的jar包从lib目录下移除)?br />
Q?Q修改Jetspeed的两个配|文?br />Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />\WEB-INF\conf\TurbineResources.properties
扑ֈ相应的属性ƈ修改其|
#Velocity service
services.Velocity.input.encoding=UTF-8
#Localization service
locale.default.language=zh
locale.default.country=CN
locale.default.charset=GBK

Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />\WEB-INF\conf\velocity.properties
扑ֈ相应的属性ƈ修改其|
#template encoding
template.encoding=UTF-8

Q?Q执行完以上两步Q打开览器,讄览器的语言首选项Q就可以看到不同语种昄的页面?br />
2.让Jetspeed中的所有页面中文化
上个步骤只是让Jetspeed支持中文本地化,指的是Jetspeed中采用国际化技术制作的面可以正常昄中文?br />但是q所有的Jetspeed内部面都已l采用国际化q行处理。我们需要将所有Jetspeed内部已经制作好的面模板Q包括采用JSP技术制作的jsp面和采用Velocity制作的vm模板Q进行国际化处理。就是说Q我们需要将q些面模板中的静态英文字W串采用国际化技术对其进行封装?br />具体技术如下:
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />JSP面Q?br />面中确保加入了Q?br />
静态英文字W串替换?br />在默认本地化属性文件JetspeedLocalization.properties文g中加入:
key_name=原来的英文字W串
在中文本地化属性文件JetspeedLocalization_zh.properties文g中加入:
key_name=英文字符串的汉语译

Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />VM模板Q?br />静态英文字W串替换?l10n.key_name
在默认本地化属性文件JetspeedLocalization.properties文g中加入:
key_name=原来的英文字W串
在中文本地化属性文件JetspeedLocalization_zh.properties文g中加入:
key_name=英文字符串的汉语译

注意Q?br />Q?QJetspeedLocalization_zh.properties文g中的值必通过native2ascii转码Q而不是直接写入中文?br />Q?Q所有属性文件中的key_name不得重复出现?br />
3.Jetspeed注册文g的汉?br />q些注册文g包括Jetspeed的实体注册文Ӟ*.xregQ和Jetspeed站点l构描述文gQ?.psmlQ。这些文件的汉化媄响到Jetspeed最l显C页面中的标题和可选择资源名称的显C?br />很简单:这些文件的~码格式改ؓGBKQ然后就可以大肆修改文g中的标题、描q等字符丌Ӏ注意千万不要直接改动关键字D,如名U、id号之cȝ?br />q部分的修改涉及到Jetspeed中的具体资源Q要谨慎修改Q徏议先熟?zhn)其深d义?br />(转蝲文章请保留出处:Java?www.javajia.com))

]]>
Jetspeed目中Psml文g的数据库理 http://www.aygfsteel.com/realzar/archive/2006/07/16/58400.html开源爱好?/dc:creator>开源爱好?/author>Sun, 16 Jul 2006 03:03:00 GMThttp://www.aygfsteel.com/realzar/archive/2006/07/16/58400.htmlhttp://www.aygfsteel.com/realzar/comments/58400.htmlhttp://www.aygfsteel.com/realzar/archive/2006/07/16/58400.html#Feedback0http://www.aygfsteel.com/realzar/comments/commentRss/58400.htmlhttp://www.aygfsteel.com/realzar/services/trackbacks/58400.html
何时需要用数据库存储PSML文gQ?br />1 用户数量巨大Q?br />2 提高性能和可分布性;
3 把Jetspeed的安全性和已有的数据库l合hQ?br />4 使用一个统一、安全的数据库来巩固所有的门户信息?br />
使用数据库存储PSML文g的缺点:
1 Jetspeed的运行必M赖于数据库的q行Q?br />2 速度不快的数据库会影响Jetspeed的性能Q?br />3 增加了复杂性;
4 你必M用Jetspeed的PSML定制器来修改PSML文gQ或者需要将PSML文gq行导入导出来进行修改,或者用sql语句来操作复杂的PSML文g修改?br />
具体操作步骤Q?br />1 在数据库中徏立PSML所需要的3张表。Jetspeed中自带的Hypersonic数据库已l预先徏好了q几张表?br />
2 Jetspeed使用Torque来进行数据-值对象的操作、维?
首先~辑配置文gbuild/torque/dbpsml.propertiesQ?br />再修Ҏ(gu)据库schema文gbuild/torque/schema/dbpsml-schema.xmlQ?br />用antq行~译处理Q生成javacdsql文gQƈ执行sql文g?br />
3 配置Jetspeed使用PSML数据?br />数据库驱动cȝjar包放到特定目录下Qwebapp/WEB-INF/lib
修改配置文gwebapp/WEB-INF/conf/Torque.properties
torque.database.default.adapter=mysql
torque.dsfactory.default.connection.driver = org.gjt.mm.mysql.Driver
torque.dsfactory.default.connection.url = jdbc:mysql://localhost:3306/jetspeed
torque.dsfactory.default.connection.user =root
torque.dsfactory.default.connection.password =

4 PSML文g从文件系l导入到数据?br />在配|文件JetspeedResources.properties中更改PSML Manager属性|
services.PsmlManager.classname=
org.apache.jetspeed.services.psmlmanager.db.DatabasePsmlManagerService
services.PsmlImportManager.classname=
org.apache.jetspeed.services.psmlmanager.CastorPsmlManagerService
使用antq行导入Q?br />ant import

5 PSML文g从数据库中导出到文gpȝ
在配|文件JetspeedResources.properties中更改PSML Manager属性|
services.PsmlManager.classname=
org.apache.jetspeed.services.psmlmanager.CastorPsmlManagerService
services.PsmlImportManager.classname=
org.apache.jetspeed.services.psmlmanager.db.DatabasePsmlManagerService
services.PsmlManager.root=/tmp/psml7
使用antq行导出Q?br />ant import(转蝲文章请保留出处:Java?www.javajia.com))

]]>
jetspeed模块定制 http://www.aygfsteel.com/realzar/archive/2006/07/16/58399.html开源爱好?/dc:creator>开源爱好?/author>Sun, 16 Jul 2006 03:03:00 GMThttp://www.aygfsteel.com/realzar/archive/2006/07/16/58399.htmlhttp://www.aygfsteel.com/realzar/comments/58399.htmlhttp://www.aygfsteel.com/realzar/archive/2006/07/16/58399.html#Feedback0http://www.aygfsteel.com/realzar/comments/commentRss/58399.htmlhttp://www.aygfsteel.com/realzar/services/trackbacks/58399.html
1Q添加一个简单的模块的全q程Q?
(1)写好一个portletQTest.vm内容为:this is my test
(2)以系l管理员djetspeed,帐号admin,jetspeed
(3)点击Admin菜单
-->选择Portlet Browser
-->查看portlet模块Q在此可以参考现有的模块的配|信息)
-->选择Add Portletd新模?
-->Name下ؓ新portlet模块命名,如:Test,
-->Type选择ref
-->Parent选择CustomizerVelocity
-->Class Name可不填(d时会由Parent自动产生,产生CustomizerVelocity的相应ClassNameQ?
-->Security可不选(是模块的权限控制Q?
-->Hidden 不?
-->Application 不?
-->Cached on URL可选也可不选然后Insert Portletdportlet完成
(4)修改d好的portlet模块的其他参数添加后的portlet模块在portlet信息面版中以Imformation昄
<1>Q添加)修改Media Type
-->选择Media Types
-->Media Type 下拉框选择html
-->Add Media Type
<2>Q添加)修改模块分类QQ意增?
<3>Q添加)修改参数,可添加需要的参数参数name为templateQ其值value为portlets文g下所对应的文件如Test.vmQ则valuegؓTest 参数action为执行所对应的类Q这点可参考其他的porlet模块做法。 
q样完成添加新模块的全q程。所做的操作会自动生配|文件在/web-inf/conf/下面的local-portlets.xreg里面
2Q自已定制的portlet模块的全q程不用写psml文g直接用jetspeed本n的模块定制功能即可:以普通用L入,如:bluesky,bluesky
(1)选择右上角的Customize:旁边的html定制|页风格,wml支持无线Q手机等讑֤的网?
<1>增加菜单-->选择html-->Add Pane增加菜单-->填入Test Menu-->Apply-->Save and Apply  完成增加菜单功?
<2>增加portlet模块
-->选择html
-->选择Test Menu
-->选择Add Portlet
-->先择自已惌的模块,CoffeeLists,HelloVelocity{,pȝ列出所有能够选择的模块,可翻|?
-->然后一UApply可以了q回用户首页Q查看自已创建的Test Menu,可以看到自已选择好的portlet  模块所做的操作会自动生配|文件在WEB-INF\psml\user\bluesky
  下面反复试q两个功能可掌握jetspeed的主要结构,及模块处理方式。里面的布局控制Q界面控Ӟ角色控制Q基本上都可以通过定制Q定制出来,原理与操作过E差不多?br />(转蝲文章请保留出处:Java?www.javajia.com))

]]>
jetspeed开发实?http://www.aygfsteel.com/realzar/archive/2006/07/16/58398.html开源爱好?/dc:creator>开源爱好?/author>Sun, 16 Jul 2006 03:02:00 GMThttp://www.aygfsteel.com/realzar/archive/2006/07/16/58398.htmlhttp://www.aygfsteel.com/realzar/comments/58398.htmlhttp://www.aygfsteel.com/realzar/archive/2006/07/16/58398.html#Feedback0http://www.aygfsteel.com/realzar/comments/commentRss/58398.htmlhttp://www.aygfsteel.com/realzar/services/trackbacks/58398.html
q里假设monsys为web服务的名Uͼ其\径在webapps/下面
1,jetspeed的图片处理图片默认放在monsys/images下面Q?br />调用Ҏ(gu)Q?clink.setURI("images/test.jpg")
2,javascript处理 javascript默认攑֜monsys/javascript?br />调用Ҏ(gu)Q?clink.setURI("javascript/test.css")
3,portlets的位|位于monsys/WEB-INF/templates/vm/portlets/html下面
4,面M布局控制看JetspeedResources.properties
bottomnav.enable=true
bottomnav.vm=bottom.vm
leftnav.enable=true
leftnav.vm=left.vm
leftnav.width=10%
topnav.enable=true
topnav.vm=top.vm
topnav.logo.file=images/jetspeed-logo-1.5.gif
topnav.logo.url=
topnav.user_login.enable=true
topnav.user_creation.enable=true
topnav.my_pages.enable=true
5,portlets源代码分? portlet主要实现三个Ҏ(gu):
<1>,buildMaximizedContext最大化
<2>,buildConfigureContext昄信息
<3>,buildNormalContext正常情况,也就是所看到的正常显C时所要显C的信息
<4>,调用Ӟ在添加模块时d新参数action=portlets.GraphDailyAction
package org.apache.jetspeed.modules.actions.portlets;
import .............(N??
public class GraphDailyAction extends VelocityPortletAction {
/**
* Subclasses should override this method if they wish to
* build specific content when maximized. Default behavior is
* to do the same as normal content.
*/
protected void buildMaximizedContext(VelocityPortlet portlet, Context context, RunData rundata) {
buildNormalContext(portlet, context, rundata);
String text = (String) context.get("text");
if (text == null) {
text = "Top Record of baccarat game";
}
context.put("text", text + " (Maximized !)");
}
/**
* Subclasses should override this method if they wish to
* provide their own customization behavior.
* Default is to use Portal base customizer action
*/





protected void buildConfigureContext(VelocityPortlet portlet, Context context, RunData rundata) {
buildNormalContext(portlet, context, rundata);
setTemplate(rundata, "hello-customize");
}
/**
* q是主要部䆾
* Subclasses must override this method to provide default behavior
* for the portlet action
*/





protected void buildNormalContext(VelocityPortlet portlet, Context context, RunData rundata) {
String mode = portlet.getPortletConfig().getInitParameter("mode"); //dd模块时从配置文g传来的参?br />String searchdate = rundata.getParameters().getString("searchdate"); //取得从页面提交得到的参数
context.put("mode", mode);
context.put("searchdate", searchdate) //输出面要显C的信息,支持输出数组Q对像,及容器等形式的数?br />}
}

<5>写好源代码,q编译,参考里的:  
1,<3>所建的参数action,其gؓportlets.GraphDailyActionQ则pȝ会去执行q个c?
(转蝲文章请保留出处:Java?www.javajia.com))

]]>
վ֩ģ壺 | ƽ| ɽ| ij| Ҿ| Ǽ| | | | ƽ| | ƽ| ˮ| ľ| | | | | | | ǹ| ٲ| | | | | ˴| ߱| ï| ׼| Ϫ| | ɽ| | Զ| | | | Ѿ| ˳| |