今頃かよ!というツッコミは勘弁してください。
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
4 Portlet Concepts
5 The Portlet Interface and Additional Life Cycle Interfaces
Portletインターフェースが基本。EventPortlet、ResourceServingPortletもある。で、全部をimplementsしたGenericPortletを継承しとけば概ねよし。
5.2 Portlet Life Cycle
5.2.1 Loading and Instantiation
ポートレットのロード、インスタンス化は、ポートレットの開始時(=デプロイ時、だろう)、もしくは一回目のリクエスト処理前に行う。つまりどっちでもいい。
5.2.2 Initialization
Portlet.init()で、PortletConfigを使って初期化。
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.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
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.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()で、キャッシュレベルを指定
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 ね。あんまり使わないかなあ
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をバインドするとき、
- APPLICATION_SCOPE
- PORTLET_SCOPE
の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.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.4 The forward Method
RequestDispatcher.forward()もできる。
19.5 Servlet filters and Request Dispatching
ディスパッチの時にServletFilterは使える
20 Portlet Filter
20.2.1 Filter Lifecycle
リクエストがくる前に、PortletFileterインスタンスを生成、init()で初期化する。
20.2.5 Defining the Target Lifecycle Method for a Portlet Filter
filterが適用されるライフサイクルメソッドに応じて、
ACTION_PHASE -> processActionに適用。ActionFilterをimplementsEVENT_PHASE -> processEventに適用。EventFilterをimplementsRENDER_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
23 Portlet Applications
WARのモジュールとして見たときの話。A portlet application is a web application
23.2 Relationship to PortletContext
portlet application と PortletContextは1対1
24 Security
だいたいservletと同じ
25 Packaging and Deployment Descriptor
スキーマとか
26 Portlet Tag Library
JSPのひとドゾー
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
B Markup Fragments
base, body, frame, frameset, head, html and title を使っちゃダメ。
D User Information Attribute Names
http://www.w3c.org/TR/P3P から derive された Attribute。実際よく使われているのかどうかは不明。