Posted on 2006-07-17 17:05
开源爱好者 阅读(516)
评论(0) 编辑 收藏 所属分类:
Portal
Jetspeed1是我接觸到第一個Portal Server。可惜其獨特的架構,我一直沒辦法接受。後來因為工作上的需要,弄了很久的WebSphere Portal Server,卻總是有一種被IBM欺負的感覺。最近和Jetspeed2相處一陣子後,覺得J2蠻不錯的;儘管release的比較慢,可是架構、功能和速度個人都覺得滿意。寫下一些個人心得,希望有更多能人加入J2,一起開發一些有用的元件和管理設定的portlet,讓J2完美。
由衷希望J2能超越WPS...哈哈。
J2的feature很多,請務必連至http://portals.apache.org/jetspeed-2/features.html瀏覽一下。另外對Spring、Velocity、JAAS,JSR168的了解是一定要的。
OK,碎碎唸完畢。今天介紹一下J2的一些觀念,如果有錯誤,請大家不吝指正。
(文章中提到的一些檔案路徑,是依照之前寫的範例。)
先來一張官方的overview流程
在這張圖中,J2算是位於Engine的部份,而Container是Pluto Portlet Container,Portlet就是自已寫的Portlet;所以這張圖正好對照JSR168中的Portal--Portlet Container--Portlet的概念。要特別注意的是,圖中在Engine和Container之間有很多個雙向的箭頭,這代表整個流程可能會在這裡來來回回地執行。
至於這圖大概可以這樣說明:
1 request送至server後由JetspeedServlet(org.apache.jetspeed.JetspeedServlet)接收
2 JetspeedServlet透過Jetspeed(org.apache.jetspeed.Jetspeed)取得ComponentManager,然後透過ComponentManager取得RequestContextComponent(org.apache.jetspeed.request.JetspeedRequestContextComponent)
3 RequestContextComponent會針對這個request建立一個RequestContext(org.apache.jetspeed.JetspeedRequestContext),並且讓這個request和新建的RequestContext能互相參照
4 呼叫Engine(org.apache.jetspeed.JetspeedEngine)的service()方法,這個方法會把剛剛建立的RequestContext傳入,這樣後面的元件才能使用
5 在service()方法中,Engine會依據request的目標URL來取得相對應的Pipeline(org.apache.jetspeed.pipelineJetspeedPipeline)來處理。Pipeline使用了chain of responsibility的pattern,是由一堆Valve(org.apache.jetspeed.pipeline.valve.Valve)串起來的
6 各個Valve依序執行,其中某些Valve會和Container動作,某些Valve會負責產生要response的portal頁面。在這個過程中,Continer會執行相關的Portlet,並將結果返回至Pipeline,也就是Valve chain中。
7 將產生的portal頁面傳回給user,流程結束
由上面的介紹,應該可以體會到Pipeline在J2中是非常重要的元件。這裡附上Pipeline的官方UML簡圖做參考
而J2本身是Spring-based的架構,主要的Spring設定檔都在"C:\tomcat\webapps\jetspeed\WEB-INF\assembly"下。JetspeedServlet在init時會建立Spring容器並載入這些設定檔,而之前提到的ComponentManager就可以透過name或class在Spring容器中尋找需要的component。有關J2的component,請務必參考http://portals.apache.org/jetspeed-2/guides/guide-components.html及原始碼。
來看一下目錄中的pipelines.xml。這個XML是用來組合各個Pipeline和設定各Pipeline和其對應的URL。先看一下最後一段bean id="pipeline-map"的部份,在這邊可以看到URL和其相對應的Pipeline。另外找到bean id="jetspeed-pipeline"這一段,可以看到這個Pipeline中Valve的組合,而這個Pipeline也是default的Pipeline;有興趣的不妨參考這份XML把這個Pipeline中的Valve的原始碼找到翻一翻,大致了解一下每個Valve在做啥,還蠻有幫助的。
如果依照之前所寫的echo portlet,其FORM的action URL起頭為/portal,而Engine會用此做為key由"pipeline-map"中找到"jetspeed-pipeline"這個Pipeline來處理。
底下這個是J2附的Valve官方簡圖,大家參考一下