Portlet學習分析筆記

來源:互聯網
上載者:User
Portlet學習分析筆記

         關於Portlet的一些概念性的文字網路上很多,Google或是百度一下可以很容易搜尋到,下面我把自己覺得容易混淆和模糊的幾個知識點做下簡單介紹:
1、Portlet Request & URL

      在一個 Portal 頁面中,通常都包含了多個 Portlet ,在一個時刻使用者只能與一個 Portlet 互動,當使用者向一個 Portlet 發出請求(例如點擊了“ submit ”按鈕),整個 Portlet 頁面將會重新構成。在這個過程中,是否有與使用者互動的 Portlet 處理方式顯然是不同的,而且使用者沒有與之互動的 Portlet 顯然不應該接收到使用者的請求參數。
   因此 JSR168 規範中將對 Portlet 的請求分為 Action 和 Render 兩種。 Portlet 在收到 Action 請求,擷取使用者所提交的資訊,進行相應的處理;受到 Render 請求後,則產生頁面代碼。當使用者向一個 Portlet 發出請求,該請求被 Portlet 容器接受, Portlet 容器再調用相應 Portlet 的 processAction() 方法;等到 processAction() 方法執行完畢後, Portlet 容器再調用所有 Portlet 的 render()
方法,並將這些方法所返回的內容組合形成一個頁面返回給用戶端。在上述過程中,所有 Portlet 的 render() 方法的調用次序在規範中沒有規定,既可能是有順序的串列調用,也可能是多線程的同步調用,依賴於廠商的具體實現。

       為了接受使用者請求,一個 Portlet 需要有一個指向其自身的 URL ,例如用在 HTTP FORM 的 ACTION 欄位。但是與 Servlet 不同的是, Portlet 不是一個完整的頁面而只是頁面的一部分,一個 Portlet 可以出現在多個頁面中,所以 Portlet 無法綁定具體的 URL 。在 JSR168 規範中定義了 PortletURL 介面,通過該介面可以得到指向 Portlet 自身的 URL ,對應兩種使用者請求有兩種產生 URL 的方法:
q?4k2@*v_rk*l
一、for render():
PortletURL url = response.createRenderURL();
www.portalfan.com&S        A(`L v(s
url.setParameter(“customer”,”foo.com”);
url.setParameter(“show”,”summary”); !g{f#vk^
writer.print(“<A HREF=\””+url.toString()+”\”>Summary</A>”);

4x_kUS/^![
二、for processAction():
`kTi3O
PortletURL url = response.createActionURL();
url.setParameter(“paymentMethod”,”creditCardInProfile”);
url.setWindowState(WindowState.MAXIMIZED);
www.portalfan.com1x"p VfH
writer.print(“<FORM METHOD=\”POST\” ACTION=\””+ url.toString()+”\”>”);
(r/aI iI(v/i
  上面的代碼我們可以看到,除了得到 URL 外,還可以在其中加入參數。另外由於 Portal 伺服器廠商通常都會利用 URL 增加一些產品相關的參數,因此強烈建議在 Portlet 中提交使用者請求採用 POST 方式。

2、 Portlet Modes & Window States
在 Portal 應用中,使用者通常需要設定、調整 Portlet 的顯示方式,對此 JSR168 同樣做出了規定。分別有 Portlet Modes 和 Window States 。
Portlet Modes 說明 Portlet 目前所執行的功能模式,規範要求 Portal 伺服器必須支援以下三種模式:
www.portalfan.com\        k6k7cWk
)e-[_lj rq&sI
q
VIEW ——內容顯示,通常為預設模式 
EDIT ——編輯相關的設定
HELP ——顯示協助資訊
除此之外可以Portal伺服器可以實現自訂的模式。portal愛好者0XLqXP5iv J

每個 Portlet 在 Portal 頁面中就是一個“視窗”,類似於 MS Windows 、 XWindo 等視窗系統 Portlet 也有自己的視窗狀態( Window States ),規範要求 Portal 伺服器必須支援以下三種視窗狀態 :

NORMAL ——普通 portlet 視窗,在這個狀態下通常是與其它 Portlet 共用 Portal 頁面;
portal愛好者t8u/O/F;F
MAXIMIZED ——最大化 portlet 視窗,獨佔 Portal 頁面;

J&?'X$az9u_eJ
MINMIZED ——最小化 portlet 視窗 #la|M@!YP?2N g
除此之外可以Portal伺服器可以實現自訂的視窗狀態         
在規範中對這些特性進行定義,使得 Portlet 開發人員無需關心這方面實現細節,另外在 processAction() 和 render() 方法中開發人員都可以通過 getPortletMode() 和 getWindowState() 等方法獲得當前 Portlet 的情況從而決定相關操作。

3、Preferences & User Information say?d
  Portal 應用一個重要功能就是“個人化”,一方面 Portal 伺服器需要根據使用者的不同顯示不同的 Portlet ,另一方面同一個 Portlet 也會根據使用者的偏好顯示不同的內容。這就要求 Portlet 需要儲存一些使用者的相關資訊,例如一個股票即時資訊的 Portlet 會根據使用者所關注的股票顯示相應的資訊。
  每個 Portlet 都可能有自己相應的個人化資訊, JSR168 規範提供了 PortletPreferences 介面來操縱這些資訊。   
PortletPreferences 介面提供讀取、設定屬性的方法,如下:
PortletPreferences prefs = req.getPreferences();
String[] symbols = prefs.getValues(”preferredStockSymbols”,
l&Fnew String[]{”ACME”,”FOO”});
www.portalfan.com*J4WF2WI qg
#f_,[$j({6M

d,NG1r(`*NUp
  在 JSR168 規範中 PortletPreferences 是使用者相關的,也就是通過 getPreferences() 獲得的對象是與當前登入使用者綁定的, PortletPreferences 不會在使用者之間共用屬性。
lg4a {^a2zb q        ]
        PortletPreferences 提供了一個基本的讀取、設定個人化屬性的途徑,使得 Portlet 無需依賴具體的資料儲存環境(例如資料庫聯結、表結構等等)就可以實現個人化並能夠在不同的 Portal 伺服器之間移植。但是不應該使用 PortletPreferences 來替代一般的資料庫功能。
       在實現個人化功能中經常需要擷取各種使用者資訊,例如使用者姓名、地址等等。因此 JSR168 也提供了一個擷取使用者資訊的途徑,如下:SK2B7KK
~}
n%R3I
Map userInfo = (Map) request.getAttribute(PortletRequest.USER_INFO);
String givenName = (userInfo!=null) ? (String) userInfo.get(“user.name.given”) : “”;

String lastName = (userInfo!=null) ? (String) userInfo.get(“user.name.family”) : “”; 
  所獲得的 Map 對象是一個唯讀對象,不能更改。但是使用者資訊應該包含什麼內容不在 JSR168 規範的範圍,事實上目前還沒有關於訪問使用者資訊的 Java 標準, JSR168 提到在以後形成訪問使用者資訊的 Java 標準時,當前的機制就會被取代。

4、Sessions K5u{g|)Q
w
portal愛好者SS"uu+~`
  作為一個 Web 應用程式組件, Portlet 同樣有 Session 這個機制用於跟蹤使用者操作,而與一般的 Web 應用程式所不同的是 Portlet 的 Session 屬性有兩種範圍:fi
PORTLET_SCOPE:屬性只能被設定它的Portlet訪問
APPLICATION_SCOPE:屬性可以被同一個Portal應用中的所有Portlet訪問
4VgU\;F

PortletSession session = request.getSession(true);
URL url = new URL(“http://www.foo.com”);

session.setAttribute(“home.url”,url,PortletSession.APPLICATION_SCOPE);
session.setAttribute(“bkg.color”,”RED”,PortletSession.PORTLET_SCOPE);  

5、Request Dispatch & Portlet Tag
  在實現 Portlet 應用時,開發人員往往會利用 Servlet 、 JSP 等資源,起碼會有兩個目的會這樣做: 為了利用現有的資源,簡單地將已經寫好的 Servlet 、 JSP 應用轉換成 Portlet ;  方便 Portlet 的表現層開發。 Portlet 規範類似於 Servlet 規範,在表現層開發上遠遠不如 JSP ,因此需要利用 JSP 來開發介面。JSR168
提供了類似 Servlet RequestDispatcher 的介面來實現利用 Servlet 、 JSP 等資源的功能。
例子如下: portal愛好者.c
oJ#m|7SJ,M2vh
String path = "/raisons.jsp?orderno=5";
portal愛好者'J0q|lh:Vu&[']
PortletRequestDispatcher rd = context.getRequestDispatcher(path); rd.include(renderRequest, renderResponse);  
當一個 JSP 頁面需要作為 Portlet 應用的一部分, JSP 開發人員需要獲得相關的 Portlet 資訊,為此 JSR168 提供了相應的 JSP Tag 來實現相關的功能。通過相應的 Portlet Tag , JSP 開發人員可以獲得相應的 Portlet Request/Response 對象,產生 ActionURL 或者 RenderURL 等等。

5、緩衝qB&gWN(N_
www.portalfan.com/yza"x1g-PB1C
  在前面中我們知道,使用者每次向Portal 應用發送一個請求,該頁面中所有的 Portlet 都會被 Portlet 容器調用 render() 方法來產生相應內容。但是只有一個 Portlet 才會處理使用者請求,其它不處理使用者請求的 Portlet 可能每次的顯示內容都是不變的。

因此 JSR168 定義了緩衝機制來提供 Portal 應用的效率。在 portlet.xml 中可以定義緩衝的失效時間,如下:
portal愛好者)y2C$\7m.E
<portlet> R`Xh M5co i
...
<expiration-cache>300</expiration-cache>
...
</portlet> 
這樣 Portlet 容器在調用 Portlet 的 render() 方法之前就會檢查有緩衝是否已經有效,如果有效話就直接使用緩衝內容。 Portlet 緩衝是跟用戶端相關的,不同的用戶端訪問同一個 Portlet 分別有自己的緩衝而不會混淆。JSR168 對緩衝機制的實現不是強制性的, Portal 伺服器廠商可以自行決定是否實現這個特性。

6、CSS Style Definition
  在一個 Portlet 應用中,所有 Portlet 應該具有顯示上的一致性,例如使用相同的字型等等。為了到達這一點, JSR168 定義了一套 CSS 元素名稱, Portlet 開發人員都應該採用這套 CSS 來產生顯示內容。這套 CSS 定義主要包含了 Fonts 、 Message (例如警示、通知等等)、 Sections 、 Forms 。

7、Portlet VS Servlet
  Portlet 和 Servlet 是十分類似的,只是由於 Servlet 無法達到 Portal 應用的要求 JCP 才定義了新的 Portlet 規範,為了儘可能與現有的 Servlet 結合達到重複使用的目的, portlet 的規範利用了 Servlet 的規範,許多觀念都很相似的。在講述了 Portlet 的特性後,我們再來看看他們直接的異同。相似之處:]3b        AC|Z2g
Portlet 也是 Java 技術的 web 組件 z&MBh[]        T6sEy
Portlet 也是有特定的 container 在管理
Portlet 可以動態產生各種內容 &X3Z$r0]W9J)_
Portlet 的生命週期由 container 所管理 bf;YKx
Portlet 和用戶端的互動是通過 request/response 的機制wZ

不同之處: portal愛好者 D(e9g$MA2W{L
Portlet 只產生 markup 資訊片段,不是完整的網頁檔案
Portlet 不會和 URL 有直接的關係
用戶端必須通過 Portal 系統才能和 Portlet 互動
Portlet 有一些定義好的 request 處理, action request 以及 render request
Portlet 預設定義 portlet modes 及視窗狀態
Portlet 可以在同一個 portal 網頁之中存在多個

Portlet有的功能而Servlet沒有:
Portlet 能夠存取及儲存永久設定檔及定製資料
Portlet 可以存取使用者資料
Portlet 具有 URL 的重寫功能夠在它的內容中動態建立連結
Portlet Session 的屬性擁有兩個不同的範圍: application-scope 及 portlet-scope

Portlet不具備而Servlet提供的功能
Servlet 具有設定輸出的文字編碼 ( character set encoding) 方式
Servlet 可以設定 HTTP 輸出的 header
Servlet 才能夠接收客戶對 portal 發出的 URL 請求
----------------------------------------------------2007-07-11更新

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.