[portlet] Portlet 2.0 (JSR-286) 仕様ナナメ読み

今頃かよ!というツッコミは勘弁してください。

1 Preface

2 Overview

2.3 What is a Portlet Container?

portal (コンテンツをaggregateする) と portlet container (portletを走らせる) は別のコンポーネントと考える。実際は一つの製品であることが多いけど。

2.5 Compatibility

Portlet 1.0 動く

2.6 Major changes introduced with V 2.0

Events, Public render parameters, Resource serving, Portlet filter どれも結構重要ですね

2.6.1 Clarifications that may make V1.0 Portlets Non-compliant

Portlet 1.0 が動かない問題があったら、念のためここをチェック

3 Relationship with the Servlet Specification

3.2 Using Servlet Application Lifecycle Events

PortletContext is tied to SevletContext. PortletSession is tied to HttpSession. なので、ServletContext/HttpSessionのlifecycle listeners をポートレットにも使える。リクエストのAttribute : javax.portlet.lifecycle_phase で、ポートレットリクエストかどうか判別できる。

4 Portlet Concepts

4.2.2 Portal Page Request Sequence

ブラウザ -> Portal -> PortletContainer経由で Portlet(s) ... [fragments]生成、return -> Portalがfragmentsを集めてPageを作る -> ブラウザへ

4.3 Portlets and Web Frameworks

JSFとか他のフレームワークともうまくやれるはずだぜ。デフォルトはJSPだぜ。ワイルドだろう?

5 The Portlet Interface and Additional Life Cycle Interfaces

Portletインターフェースが基本。EventPortlet、ResourceServingPortletもある。で、全部をimplementsしたGenericPortletを継承しとけば概ねよし。

5.1 Number of Portlet Instances

ポートレット定義ひとつにつき、ポートレットインスタンスVMにひとつだけ。

5.2 Portlet Life Cycle
5.2.1 Loading and Instantiation

ポートレットのロード、インスタンス化は、ポートレットの開始時(=デプロイ時、だろう)、もしくは一回目のリクエスト処理前に行う。つまりどっちでもいい。

5.2.2 Initialization

Portlet.init()で、PortletConfigを使って初期化。

5.2.3 End of Service

ポートレットが不要になれば、Portlet.destroy()を呼んで終了処理。リクエストが処理中の場合は終わるまで待つ。が、タイムアウトを決めても良い。

5.3 Portlet Customization Levels
5.3.1 Portlet Definition and Portlet Entity

Portlet Definition は preference attributes を持つ。preference object と ポートレットの関連を portlet entity と呼ぶ。うーむ。

5.4 Request Handling

Action Request -> Portlet.processAction()
Render Request -> Portlet.render()
Event Request -> EventPortlet.processEvent()
Resource Request -> ResourceServingPortlet.serveResource()
Action Request からは、複数のevent、renderが発生するかもしれない。Render Request からは複数のrenderが発生するかもしれない。
キャッシュが効いている場合、renderやserveResourceは呼ばれないかもしれない。

5.4.1 Action Request

何か状態を変化させるアクションを実行する。
リダイレクトしていい。portlet mode、window state 変えていい。ActionResponseにrender parameter をセットしていい。ActionResponse.setEvent()でイベントを発行していい。

5.4.2 Event Request

イベントを受け取り、ポートレット間通信を行う。

5.4.3 Render Request

RenderResponse.getWriter() 経由でコンテンツを出力する。
状態の変化を行ってはだめです。

5.4.4 Resource Request

ResourceResponse.getWriter()/getPortletOutputStream() 経由でコンテンツを出力する。

5.4.5 GenericPortlet

いろいろdispatchできる

5.4.6 Multithreading Issues During Request Handling

同じインスタンスにマルチスレッドアクセスされます。気をつけよう!

5.4.8 Thread Safety

request/response オブジェクトはスレッドセーフではありません。processActionやrenderの外に持ち出して共有しないようにしよう。

6 Portlet Config

PortletConfigは、まあ普通にconfigを取ってくるのに使う。

7 Portlet URLs

ポートレットが自分にアクセスするためのリンクを作って、出力コンテンツに埋め込みたい場合、PortletResponseのcreateActionURL/createRenderURL/createResourceURLメソッドを使う。

7.1 Portlet URLs

Render URL は idempotent でよろしく。フォームのサブミットとかには使わない。

7.1.1 BaseURL interface

要するにこういう風に使う。

PortletURL url = response.createRenderURL();
url.setParameter(“customer”,”foo.com”);
url.setParameter(“show”,”summary”);
writer.print(“<A HREF=\””);
url.write(writer);
writer.print(”\”>Summary</A>”);

toString() 使うなよー。

7.2.1 PortletURLGenerationListener Interface

これで、URLをごりごりいじくれそう

8 Portlet Modes

VIEW, EDIT, HELP

8.5 GenericPortlet Render Handling

GenericPortletのrenderデフォルト実装は、doView, doEdit, doHelpへのディスパッチです。

9 Window States

NORMAL, MAXIMIZED, MINIMIZED

10 Portlet Context

10.1 Scope of the Portlet Context

1ポートレットにつき1PortletContextインスタンス

10.2 Portlet Context functionality

PortletContextから、init param, attribute, resource, request dispatcher にアクセスできる。javadoc見た方が早いか

10.3 Relationship with the Servlet Context

PortletContextとそのポートレットのServletContextからアクセスできるデータは基本的に同じ

10.4 Portlet Container Runtime Options

以下のオプションがある

10.4.1 Runtime Option javax.portlet.escapeXml
10.4.2 Runtime Option javax.portlet.renderHeaders
10.4.3 Runtime Option javax.portlet.servletDefaultSessionScope
10.4.4 Runtime Option javax.portlet.actionScopedRequestAttributes

trueにすると、processActionでPortletRequest.setAttribute()を呼んでセットしたattirbuteが、後続のrenderでgetAttribute()を使って読み取れるようになる。デフォルトはfalse。JBoss PortletBridgeはこれを使ってないようだが?

11 Portlet Requests

processAction, processEvent, serveResource, render で受け取るRequestオブジェクトのことです。

11.1.1.2 Action and Event Request Parameters

Action/Event Requestのパラメータは後続のRender Requestには伝播しない。ActionからEventの場合も同じ。渡したければ、StateAwareResponse.setRenderParameter()を使う。

11.1.1.3 Render Request Parameters

このへんのパラメータの扱いが結構分かりにくい。

If a portlet receives a render request that is the result of a client request targeted to
another portlet in the portal page, the parameters should be the same parameters as of the
previous render request from this client.

同じページの別ポートレットへのリクエストの結果、renderされる場合は、同一クライアントからの前回のrender requestと同じパラメータが使われる。つまり、前のパラメータを覚えている。

If a portlet receives an event that is the result of a client request targeted to another portlet
in the portal page, the parameters should be the same parameters as of the previous render
request from this client.

同じページの別ポートレットへのリクエストの結果、eventを受け取る場合は、同一クライアントからの前回のrender requestと同じパラメータが使われる。つまり、前のパラメータを覚えている。

If a portlet receives a render request following an action or event request as part of the
same client request, the parameters received with render request must be the render
parameters set during the action or event request.

Action/Eventの後続のrender request の場合、パラメータはAction/Eventによりセットされたもの。

If a portlet receives a render request that is the result of invoking a render URL targeting
this portlet the render parameters received with the render request must be the parameters
set on the render URL if these were not changed by the portlet as a result of an container
event received for this render URL.

render URLの実行からrender requestを受けた場合、パラメータはrender URLにセットされたもの。(Eventで変更されるケースを除く)

他のポートレットへのパラメータは見えない。(見たければ public render parameter)

Note that render parameters get automatically cleared if the portlet receives a
processAction or processEvent call and need to be explicitly re-set on the response of
such a lifecycle call.

processAction/processEventが呼ばれると、render parameterはクリアされる。

11.1.2 Public Render Parameters

Public Render Parameter はライフサイクルメソッドのどれでも使える processAction, processEvent, render, and serveResource. DDに書くのが面倒くさいね。にちゃんと書いておかないとだめ。

The portlet
container is free to only provide a subset of the defined public render parameters to
portlets that are not target of a render URL as storing of render parameters is only
encouraged, but not mandated for portal / portlet container implementations.

なんだこのいいかげんな感じは。

getParameter()はpublic parameter と private parameter (つまりsetParameterでセットしたもの)の両方を返す。

It is up to the portal implementation to decide which portlets may share the same public
render parameters.

ここも怪しいな、おい。

11.1.4 Request Attributes

PortletRequest.USER_INFO とか

11.1.5 Request Properties

getPropertyもあんのか。portal/portlet-container specific properties and, if available, the headers of the HTTP client request が取れます。

11.1.6 Request Context Path

ポータルに対するリクエストのContextPathではなく、ポートレットそのもののContextPathです。

11.2 ClientDataRequest Interface

ClientDataRequestはActionRequest/ResourceRequestの親interfaceです。RenderRequest/EventRequestは関係ない。アップロード時のinputStreamとか取れる。

12 Portlet Responses

12.1 PortletResponse Interface
12.1.1 Response Properties

同じく、vendor specific information to the portal/portlet-container、 http headerをportal->クライアントに送る。

12.1.2 Encoding of URLs

他のリソースへのリンクを作る場合は PortletResponse.encodeURL()を使おう。

12.2 StateAwareResponse Interface

StateAwareResponseはActionResponse/EventResponseの親interfaceです。setRenderParameter、setPortletMode、setWindowState、setEventできる。

12.3 ActionResponse Interface
12.3.1 Redirections

sendRedirectできる

12.5 MimeResponse Interface

MimeResponseはRenderResponse/ResourceResponseの親interfaceです。

12.5.2 Output Stream and Writer Objects

OutputStreamやWriterに書き出したり

12.5.4 Setting Markup Head Elements

addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, org.w3c.dom.Element)で、マークアップのheadにdom elementをくっつけたりできる

12.6.2 Next possible portlet modes

こういうの忘れそう

13 Resource Serving

リソースのリンクは次の2パターン

  • PortletResponse.encodeURL() によるダイレクトリンク。Portal外のリソースへのリンクも含む
  • ResourceURLによる、ポートレットResourceServingPortlet.serveResource()から提供するリソース。
13.1 ResourceServingPortlet Interface

serveResource()による出力以外に、renderしてはいけない。HTTP GETのときはserveResource()でportletの状態を変化させてはだめ。POST/PUT/DELETEならよし。Figure 13-1 Resource Request Handling Sequence わかりやすい。

13.3 Access to Request and Response Headers

setProperty/addPropertyで、HTTP headerを送ろう

13.5 Access to the Resource ID

ResourceURL.setResourceID()で指定したIDをResourceRequest.getResourceID()で取り出して、出力するリソースを決める。

13.7 Caching of Resources

ResourceURL.setCacheability()で、キャッシュレベルを指定

13.8 Generic Portlet Support

serveResource()に限らず、GenericPortletのデフォルト実装はAPIの使い方の参考になるはず

14 Serving Fragments through Portlets

Ajaxとかで、マークアップの一部を送るケースの話。状態の更新などを伴わないレスポンスの場合、serveResouce()で行う。更新を伴う場合は、portlet仕様では決められていない。

15 Coordination between portlets

みんな大好きポートレット間通信。

  • PortletSessionのアプリケーションスコープ (chapter18)
  • public render parameter
  • event
15.1 Public Render Parameters

複数のポートレットに同じrender用情報を与えたいときに適している。

15.2 Portlet Events

ポートレット間で、あれやったらこれ、みたいに処理シーケンスがあるならこっち。この機構を使って、各ポートレットをWebアプリの画面コンポーネントのように使いたくなる気持ちはわかる。

15.2.2 Receiving Events

receiveする場合、やっぱりDDに定義が必要。めんどくさい。

15.2.4.2 Events not declared in the Deployment Descriptor

DDに書いてなくてもsendはしてもいい。

15.2.7 GenericPortlet support

GenericPortletのデフォルト実装は@ProcessEvent(qname=)アノテーションがついているメソッドにディスパッチすること。

15.3 Predefined Container Events

WSRP用に定義済みイベントがいくつかあるよ

16 Portal Context

PortletContext じゃなくて PortalContext ね。あんまり使わないかなあ

17 Portlet Preferences

ユーザ毎に保持できるPortletの設定。コンテナが永続化する。

18 Sessions

みんな大好きセッション。

18.1 Creating a Session

"the same portlet application"という言葉が出てくるけど、要するに「同じWAR」ということ。chapter23で説明されている。"the same portlet application"のポートレットはセッションを共有します。

18.2 Session Scope

セッションはportlet application毎で、ユーザ毎です。PortletSessionオブジェクトそのものは「1リクエスト内」でしか有効ではありません。リクエスト毎にgetPortletSessionで取得する必要があります。

18.3 Binding Attributes into a Session

attributeをバインドするとき、

の2種類のスコープがある。APPLICATION_SCOPEの場合、同じportlet applicationのポートレット間で共有できる。PORTLET_SCOPEは当該ポートレットのみ。APPLICATION_SCOPEの場合、並行アクセスがありうるので、同期化に注意。HttpSessionBindingListener使える。

18.4 Relationship with the Web Application HttpSession

PortletSessionに入れているものはHttpSessionから見える

18.5.2 Rendering phase

renderのときにPortletSessionを変更するな

18.6 Reserved HttpSession Attribute Names

HttpSessionのattributeのプリフィックスに"javax.portlet."を使います

18.7 Session Timeouts
18.8 Last Accessed Times
18.9 Important Session Semantics

だいたいServletと同じです的な。

19 Dispatching Requests to Servlets and JSPs

MVCのVがServlet/JSPの場合、PortletRequestDispatcherでディスパッチします

19.3 The Include Method

PortletRequestDispatcher.include()でServlet/JSPの出力をポートレットの出力にincludeする。何回呼んでもいい。

19.3.2 Included Request Attributes

以下、呼び出し先のServlet/JSPで使えるattribute、メソッドなど

19.4 The forward Method

RequestDispatcher.forward()もできる。

19.5 Servlet filters and Request Dispatching

ディスパッチの時にServletFilterは使える

20 Portlet Filter

20.2.1 Filter Lifecycle

リクエストがくる前に、PortletFileterインスタンスを生成、init()で初期化する。宣言につき1インスタンス。削除される前にdestroy()が呼ばれる。

20.2.5 Defining the Target Lifecycle Method for a Portlet Filter

filterが適用されるライフサイクルメソッドに応じて、を記述し、XYZFilterをimplementsする。複数指定、複数implementsしてよし。

  • ACTION_PHASE -> processActionに適用。ActionFilterをimplements
  • EVENT_PHASE -> processEventに適用。EventFilterをimplements
  • RENDER_PHASE -> renderに適用。RenderFilterをimplements (ここEventFilterて誤植になってる)
  • RESOURCE_PHASE -> serveResourceに適用。ResourceFilterをimplements

21 User Information

通常ユーザ情報はポータル製品独自で管理すると思われるが。。。

21.1 Defining User Attributes

The deployment descriptor of a portlet application must define the user attribute names the portlets use. えっ

21.3 Important Note on User Information

ユーザ情報のJava標準が無いので、簡単なものを決めときました、的な話。これは使わないのでは。。。?

22 Caching

(秒)、(private/public)が指定できる。privateはユーザ毎、publicはユーザ共有のキャッシュ。プログラムで動的に変更可能。

23 Portlet Applications

WARのモジュールとして見たときの話。A portlet application is a web application

23.1 Relationship with Web Applications

portlet部分以外は普通にservlet containerに処理される

23.2 Relationship to PortletContext

portlet application と PortletContextは1対1

23.5 Portlet Application Classloader

Servlet Container と同じ ClassLoader を使う

24 Security

だいたいservletと同じ

25 Packaging and Deployment Descriptor

スキーマとか

26 Portlet Tag Library

JSPのひとドゾー

26.1 defineObjects Tag

JSPからアクセスできるPortletオブジェクト

26.2 actionURL Tag
<portlet:actionURL copyCurrentRenderParameters=”true”
  windowState=”maximized” portletMode=”edit” name=”editStocks”>
  <portlet:param name=”page” value=”1”/>
</portlet:actionURL>
26.3 renderURL Tag
<portlet:renderURL portletMode=”view” windowState=”normal”>
  <portlet:param name=”showQuote” value=”myCompany”/>
  <portlet:param name=”showQuote” value=”someOtherCompany”/>
</portlet:renderURL>
26.4 resourceURL Tag
<portlet:resourceURL id=”icons/mypict.gif” var=”iconsURL”/>
<img src="<%=iconsURL%>” >

27 Leveraging JAXB for Event payloads

EventのペイロードにはJAXBを使う。

28 Technology Compatibility Kit Requirements

これはスルー

以下、appendix

A Custom Portlet Modes

カスタムなのに「これを使え」というリストがある。about、config、edit_defaults、preview、print。確かに使いそう。

B Markup Fragments

base, body, frame, frameset, head, html and title を使っちゃダメ。

C CSS Style Definitions

OASIS Web Services for Remote Portlets Technical Committee による推奨style

D User Information Attribute Names

http://www.w3c.org/TR/P3P から derive された Attribute。実際よく使われているのかどうかは不明。

E Deployment Descriptor Version 1.0

F TCK Assertions