2006/11/28

談美 by 朱光潛

美學在理性主義當道的現代社會中,總是無法受到重視,小朋友們會學英文、學算數、學畫畫、學鋼琴,但到了中學時代以後,升學成了唯一的一件事,漸漸地,大家學會算圓錐曲線、學會語文的修辭,但忘記了小時候塗鴉的快樂,所以很多人都跟我一樣,繪畫只停留在幼稚園的程度,也忘記了怎麼欣賞美的事物。

談美這本書,是新文化運動後的作品,在朱自清的序中,就提到當時大家只知道不斷複製西洋名畫,卻不懂得美感究竟是什麼。其實每一個人的人生,都是一件唯一的藝術作品,大家每天會琢磨塑造這件作品,但每一個人的功力用心不同,結果就跟著不一樣,有些即能稱上是一件藝術品,有些就不行。人生可分成實用、科學、美感三種活動的綜合體,只有這三者平均發展,才有一個美滿的人生。

作者朱光潛在書中明確說明美感的定義,然後將一般人的誤解一一解釋排除,例如美感不是快感,美感不是聯想(因美感不該帶有理性思考,他是純粹直覺的),考證與批評不是欣賞,自然並不是美,遊戲是藝術的雛形,美感一定有想像加上情感,再加上配合的格律。學習從模仿開始,想要學一門藝術,就得先學它書特殊的筋肉技巧。

一般人只會在面對大自然,或是看到帥哥美女,就認為這是美的東西,發出讚嘆之語。然而作者告訴我們,事物的表面不能決定美醜,重要的是每一個人自己怎麼觀察,怎麼欣賞,在感受到美的境界的一瞬間,會忘記自己的存在,進入美感的世界。

作者以作詩為例,討論創造與模仿的差異,學習一項藝術,要先學會該項藝術的技巧,而學習是從模仿開始的,思想離不開語言,語言離不開喉舌的動作,所以雖然作文得先學會朗誦,朗誦既久,則古人之聲就能在喉舌上留下痕跡,等到下筆時,自然就能因襲這活動,而創作出詩文,這個道理,直到現在才瞭解。因為學生時代總是以紙筆的考試為主,自然而然就習慣以默讀的方式,配合筆寫讀書,而現在來看,這長久的習慣,對學習詩文創作來說,卻是一種慢性毒藥。

家裡的小朋友會跟著大人念詩或三字經,往往念了一兩個星期,他就能記熟那些詩文的音韻,自然而然就默記下來了,而我們還只能透過眼睛,然後唸出文字,無法背誦,我想這就是學習語言的黃金時期在3~5歲的原因吧!

美感不在外物上,而在每一個人自己觀察事物的角度與方法,當忘卻自我、沈醉的事物形象的那一瞬間,美感油然而生,而自己也彷彿置身於另一個世界。

軟體的美感存在於Pattern的技巧上,Pattern是軟體設計常見的樣式,在一步一步重構的過程中,軟體工藝品也逐漸顯露出美的形體,當忘記自己的時候,聯繫軟體與程式設計師的,就是藝術的美。

2006/11/20

品牌思考很簡單-只要跟15個哲學大師借腦 by 湯姆.布勞恩

從書本的名稱,就知道內容是以哲學的角度來觀察品牌思考。「哲學」對一般人來說是種沈重的高談闊論,沒有很多人喜歡討論一些看起來就是真理的哲學問題,例如「價值觀是什麼?」「真實世界的組成是什麼?」「人的認知世界是什麼?」這樣的問題。但這些奇怪的哲學問題,都是在討論「人」以什麼角度、要以什麼態度面對這個世界,建構自己的價值觀與生活態度,才能真正地瞭解人的世界。

這15個西洋哲學大師,各有其傳誦於世的經典理論,這本書把這些理論套用在品牌管理上,因為品牌只存在於「人」身上,透過哲學思考的引導,我們就能更深入瞭解與掌握品牌管理的哲學。

博士的英文是Doctor of Philosophy(Ph.D.),在維基百科的解釋說道,哲學博士並不一定修讀「哲學」,而是指博士對其知識範疇的理論、內容及發展等都具有相當的認識,能獨力進行研究,並在該範疇內對學術界有所建樹。但更深層地來看,我們可說所有科學的根源都是哲學,也就是根源於一般人的思考方式。

以下以章節目錄為順序,列出閱讀過程中圈點的話。
# 1 赫拉克利特斯——一個起點
思考課題:品牌的經營必須立足於不斷變動的基礎上。
世界永遠處於變動的狀態下
變動的狀態可適用於萬物之上
品牌只存在於消費者的腦子裡,虛幻無常,不可以視為穩定的假象,沒有任何事物是理所當然的

# 2 蘇格拉底——詰問的藝術
思考課題:定義品牌價值觀與品牌策略,不可忽略慎密嚴謹的重要性。
道德哲學關注的核心是理解我們行為的動機
思想背後有兩個驅動力:為了追求真理而不斷質疑發問,不屈不撓地探求理解真理而影響我們的行為
起點是不斷提問,終點是造成行為的改變
不要把事物是為理所當然,以積極態度謹慎提問,獲得更深入的理解,只要感覺起來不像真理,就不要輕易接受

# 3 柏拉圖——勘透表象
思考課題:你的品牌必須要有兩種本質:變與不變,不斷變化的表象經驗界,與恆常不變的真實理型界。
理型論
一切事物都在形成的過程當中,沒有任何事物是存在的
必須把重點放在品牌能夠成為什麼,而不在於品牌是什麼。在形成的過程中,一邊不斷變化品牌的虛幻面,一邊賦予品牌存在理由的不變事物(價值觀)
柏拉圖的洞穴迷思:直接經驗中的品牌,也只反映出某種真實的表象而已
成功的品牌必須同時「合乎當下」又「恆久不變」

# 4 亞里斯多德——結構的重要性
思考課題:絕對要問品牌的目的是什麼,才能勝過其他品牌。
在經驗界中檢視品牌,並問「品牌存在究竟有什麼意義?」
決定的要素不是零件的物質特徵,而是車子的結構與形式。車輛的形式是品牌的核心
品牌四因:物質因、動力因、形式因、目的因
是什麼、來自哪裡、看起來什麼模樣、能夠造成什麼效果

柏拉圖的無形價值觀 vs 亞里斯多德的功能性利益(目的)

# 5 笛卡兒——理性的應用
思考課題:找出維繫品牌與消費者之間關係的原因,你必須深入消費者的腦子。
Cogito ergo sum 我思,故我在
我們是否能夠確知任何事物?
數學,內部一致性,概念科學
品牌管理的基礎:若X則Y,思考方法必須奠基於無可置疑的前提之上,在這個基礎上建構知識的過程,必須完全透明而可供人檢視
世界存於兩個層面之上:物質的層面、思想的層面
品牌就是想法
「為甚麼」
笛卡兒的二元論,消費者內心的世界、看得見摸得著的世界
竭盡全力找出品牌中無可置疑的核心,也就是維繫品牌與消費者關係的原因,了解消費者內心深處的動機及思考過程,然後就可以循著理性與邏輯逐步發展

# 6 史賓諾莎與萊布尼茲——系統性的方法
思考課題:品牌的陳述必須不斷加以證實。
史賓諾莎:在一個完全依循數學原理和確定性而運行的世界中,哪裡有「上帝」存在的空間
否認物質與心智之間有所區別
笛卡兒:人有軀殼與靈魂 史賓諾莎:每個人都是一個統一的實體,身體與靈魂只是談論一個人的兩種方式而已,不能分開

萊布尼茲:分析陳述(可為真或偽)、綜合陳述(真偽取決於陳述本身以外的事實)
談論品牌時,要區分確實為真的陳述,和我們自己希望為真的陳述。如果是綜合陳述,就得不斷加以證實

# 7 洛克——經驗主義的傳統
思考課題:無論如何,一定要緊緊把握住品牌的特色。
我們對於一切所擁有的知識,都是透過意識的經驗(智識上、情感上、感官上),這些輸入都稱為「觀念」
經驗主義:觀念原本存在於外在,透過感官傳遞到大腦(內在),然後才組合成有意義的東西

經驗主義 vs 純粹理性主義

品牌建構的重點不在解譯消費者最初的動機,而在創造(對消費者來說)有意義的觀念
所有品牌都有客觀、主要屬性(可測量的),還有次要屬性,取決於品牌與每一個消費著之間的關係,消費者的主觀經驗

創造品牌特色,和世界的現況保持一致

# 8 休謨——理性的限制
思考課題:把注意力放在消費者的感受與情感上,不要讓自己成為品牌理論的奴隸!
英國經驗主義的高峰
一切都是知覺,所有知識來自於經驗。品牌是高度主觀的實體,奠基於各種感官提示之上
世界是一堆個人知覺與經驗的組合,沒有任何證據證明,這一切之間都互有因果關係
可能性
品牌管理的關鍵是感受、情感、愛好,而不是思想
沒有任何事物是確定的,因此我們應該隨時都在實驗
理性有其限制,把注意力放在消費者的感受與情感上

# 9 盧梭——感受的重要性
思考課題:品牌關乎感受與情感,品牌的力量來自於能夠遠離理性。
社會契約論:人生而自由,卻無往不在枷鎖之中。人民的「全體意志」概念
愛彌兒:教育是一種發展過程,受「自然」引導,而不是刻意培育
以自然取代理性,訴諸情感而不是理性,情感價值是品牌塑造的中心
人希望能夠與群體的情感表達保持一致的慾望 -> 微觀行銷,沒有一體通用的產品

# 10 康德——平衡的觀點
思考課題:在品牌行銷當中,只要改變思考方式,就能夠改變消費者及市場。
結合了理性與經驗主義,終結了「形上學」的辯論,明確指出我們根本無法證明上帝存在(也無法證明不存在)
「純粹理性批判」
我們只能知道我們能夠知道的事情,受限於我們能夠知道的事物範圍,受限於理解的儀器(感官與心智功能),所有儀器都負責一項特定任務
別輕易假設自己能夠知道的事情,等同於該項總和。任何研究都只代表部份看法
我們在世界裡所看見的關聯,就是讓人生可以管理的要素,這些關聯奠基於我們內在的思想架構,關聯取決於主體而不是客體的性質
世界沒有客觀的範疇,只要改變對他們的思考方式,就能夠改變消費者、市場及品牌的分類範疇,
最重大的改變,通常來自於對「範疇」的認知變化,例如切割市場的方式


# 11 黑格爾——過程的優先性
思考課題:品牌行銷的關鍵在於搶先達到下一個重要的「合題」。
系統化的變動過程,把歷史視為過程
過程不但具有潛在的結構,也有最終的目的,變化不是單純為了變化而變化,而是不斷朝一個目標前進
生命的本質Geist透過歷史過程,逐步朝向徹底和諧與自知的最終狀態前進
右翼:希特勒 左翼:馬克思(唯物史觀)
要邁向前進,唯一的方式就是解決目前的衝突與緊張:辯證過程
正題 -> 反題 -> 合題
試著把若干互相衝突競爭的性質、價值觀、優點放在一起,站在當今的時代精神的先鋒地位,恰是時候
搶先達到下一個重要的合題

# 12 尼采——價值的創造
思考課題:價值觀是品牌的核心。要成為「超級品牌」,就得盤據符合這些價值觀的領域。
世界是一個實體,一個我們能夠完整經驗的實體,沒時間理會存在於我們理解範圍之外的世界,也沒有時間理會上帝,「上帝已死」
不是設法讓現存的價值觀與現況產生關聯,就是要創造新的價值觀
品牌想要建立獨特性,唯有創造自己的價值體系
「權力意志」,對這方面徹底發揮潛力的人,稱為「超人」,如果品牌展現出這種完全按照本身心意而行的意志,稱為「超級品牌」
精明的競爭者會重新定義市場與市場規則
價值觀是品牌的核心,品牌都將成為有機體

# 13 維根斯坦——把品牌視為工具
思考課題:品牌的意義是其各種用途與價值觀的總和。以這種方式管理「意義」,就是現代品牌管理的精髓所在。
把品牌視為圖像
知覺、思想、語言及表達的關係,語言的中心地位,意義圖像理論
不論是圖像還是現實世界,都具備有同樣的「邏輯形式」
品牌「代表」了某一件事物
品牌行銷者必須確保自己的品牌代表不只一件事物
把品牌視為工具 -> 品牌成長策略


# 14 存在主義——把品牌視為個體
思考課題:品牌存在主義為我們提供了另一副可用來看待成長機會的哲學鏡片。
齊克果、沙特
過程與體系都是不存在的,只有個體才存在
對於任何哲學性的事物的理解,都必須奠基於對個體如何以及為何存在的瞭解
存在主義就是探討個人如何透過自己所做的決定,而為自己的人生賦予意義
海德格
品牌是一個個體,重點不在於賦予品牌意義,而在於賦予其生命
創造一個品牌世界,「體驗行銷」
為品牌賦予自由,給予品牌自由發展與自我表現的空間


#15 波普——尋求更佳的模型
思考課題:不要再抱持確定性的觀點。我們應該隨時尋求更佳的新思考方式來取代現有的方式。
向確定的知識說再見
一旦模型出現不足之處,一定會再出現另一個新的知識架構
顯著的確定性只是人類思想的產物,不是客觀事實
沒有理論能被證明為正確,但任何理論都可以被證明為偽
培養批判的文化,批判是進步的起點

# 16 眺望未來——哲學在品牌塑造中的真正角色
大多數人在大部分的時候,都是已可辨識的實體加以思考
人生就是把這些實體找出來,並組合成多少令人滿足的狀態
我們的思考過程,主要適合於建構關聯
品牌創造慾望,不只單純滿足慾望
品牌塑造主要就是關於一般人的思考方式

2006/11/17

Portlet JSR-168 Note

Portlet JSR-168 Note

************************
PLT.5 The Portlet Interface
PLT.5.1 Number of Portlet Instances
每個portlet container針對每一個portlet definition,只能產生一個object

PLT.5.2 Portlet Life Cycle
portlet的life cycle透過javax.portlet.Portlet裡的init, processAction, render, destory methods來處理

PLT.5.2.1 Loading and Instantiation
portlet container在啟動時或是portlet被呼叫時,負責loading and instantiating portlets

PLT.5.2.2 Initialization
container以implement javax.portlet.PortletConfig 的唯一物件,透過javax.portlet.Portlet裡的init初始化portlet,並提供定義裡的ResourceBundle。PortletConfigImpl也必須提供描述portlet runtime environment(context物件, implements java.portlet.PortletContext)的access介面

PLT.5.2.2.1 Error Conditions on Initialization
initiallization時,portlet可能會throw UnavailableException或PortletException,這時候就必須要呼叫portlet的destroy
在portlet初始化失敗後,可以再次重新嘗試初始化,但必須在等待一段時間之後
初始化時的RuntimeException要以PortletException的方式處理

PLT.5.2.2.2 Tools Considerations

PLT.5.2.3 Portlet Window
preferences objects是以定義中的初始值初始化,container要提供客製化preferences物件的機制
當portlet放入portal page中,就有一個配置的preferences object,portlet跟preferences object合在一起稱為portlet window,由container負責維護他們之間的關係
管理配置pref objects與產生portlet window的方式交由container implementation,也可提供進階功能,例如階層式管理pref objects

PLT.5.2.4 Request Handling
javax.portlet.Portlet定義了processAction, render兩個methods
當container呼叫portlet的processAction時,request會參考action request,當container呼叫render時,request會參考render request
通常client的request是由portlet產生的URL trigger,稱為portlet URLs,一個portlet URL會指向一個特定的portlet。portlet URL有兩種,action URLs 或 render URLs
當client request經由action URL被trigger時,container要先處理目標portlet的processAction,然後再處理其他portlet的render。當client request經由render URL被trigger時,container就執行所有portlet的render
如果portlet有caching功能,container可選擇不執行render,而使用cached content

PLT.5.2.4.1 Action Request
在處理action request時,portlet會以action request裡的參數更新自己的state
Portlet裡的processAction有兩個參數,ActionRequest, ActionResponse
ActionRequest提供access許多參數資訊的介面,action request, window state, portlet mode, portal context, portlet session, portlet preferences data
在處理actio request的時候,portlet可以讓container重導到某個特定的URL
portlet在處理action request時,會在ActionResponse中改變portlet mode與window state,portlet mode會影響render的結果

PLT.5.2.4.2 Render Request
Portlet的render有兩個參數,RenderRequest, RenderResponse
RenderRequest提供許多參數的存取介面,render request, window state, portlet mode, portal context, portlet session, portlet preferences data
portlet由RenderResponse的writer產生content,也可以交給servlet或jsp處理

PLT.5.2.4.2.1 GenericPortlet
render會set title(在定義中)並執行doDispatch
doDispatch幫忙根據portlet mode處理request,doView:處理VIEW, doEdit:處理EDIT, doHelp:處理HELP
如果portlet的window state為MINIMIZED,則render不會執行任何一個render methods

PLT.5.2.4.3 Multithreading Issues During Request Handling
container負責處理concurrent requests的問題,Portlet developer也要在processAction與render中處理concurrent的問題

PLT.5.2.4.4 Exceptions During Request Handling
portlet可能會throw PortletException, PortletSecurityException, UnavailableException
PortletException表示處理request時發生錯誤,container必須要停止繼續執行該portlet,但其他portlet還是要繼續處理render。
PortletSecurityException表示request因user沒有足夠的權限被中止
UnavailableException表示portlet暫時或永久不能處理request
RuntimeException的處理方式跟PortletException一樣

PLT.5.2.4.5 Thread Safety
request跟response object都不保證thread safe

PLT.5.2.5 End of Service
當container因記憶體不足或shutdown的時候,可呼叫destroy後結束portlet object


************************
PLT.6 Portlet Config
PLT.6.1 Initialization Parameters
PortletConfig的getInitParameterNames, getInitParameter會傳回portlet定義中的initialization parameter names/values

PLT.6.2 Portlet Resource Bundle
在定義中的裡有title, short-title, keywords
如果有定義com.foo.myApp.QuotePortlet,container必須要產生ResourceBundle提供大家使用,render method會使用PortletConfig裡的ResourceBundle取回ResourceBundle裡定義的title資料

************************
PLT.7 Portlet URLs
portlet需要產生參考到自身的portlet的URL,作為content的一部分
PLT.7.1 PortletURL
portlet會藉由RenderResponse裡的createActionURL與createRenderURL產生PortletURL介面的實作,createActionURL產生action URLs,createRenderURL產生render URLs
因為有些container會產生一些狀態碼放在URL上,portlet開發人員不應該自己寫form並使用HTTP GET method取得資料
portlet可以在PortletURL中加入自己的參數,setParameter與setParameters
container必須要 "x-www-form-urlencoded"對參數名字與值編碼,但developer不需要encode parameter names/values
ex: PortletURL url = response.createRenderURL();
url.setParameter("customer", "foo.com");
url.setParameter("show", "summary");
writer.print("Summary");

PLT.7.1.1 Including a Portlet Mode or a Window State
portlet URL 必須要包含portlet mode的參數,PortletURL裡有setWindowState, setPortletMode兩個methods
ex: PortletURL url = response.createActionURL();
url.setParameter("paymentMethod", "creaditCard");
url.setWindowState(WindowState.MAXIMIZED);
writer.print("< FORM METHOD=\"POST\" ACTION=\""+ url.toString()+"\" >");

portlet不能設定未定義的PortletMode,會產生PortletModeException
portlet不能設定未定義的WindowState,會產生WindowStateException

PLT.7.1.2 Portlet URL security
PortletURL.setSecure可指定為HTTPS or HTTP,如果未指定,則跟current request一樣


************************
PLT.8 Portlet Modes
VIEW, EDIT, HELP

PLT.8.1 VIEW Portlet Mode
Portlet一定要support VIEW mode,overriding doView

PLT.8.2 EDIT Portlet Mode
Portlet不一定要支援EDIT mode
overriding doEdit

PLT.8.3 HELP Portlet Mode
Portlet不一定要支援HELP mode
overriding doHelp

PLT.8.4 Custom Portlet Modes
Portal廠商可以自己定義自己的mode,要寫在定義檔裡的custom-portlet-mode裡面,在PLT.A裡面有建議提供的自訂Portlet Modes
ex:

Creates content for Cut and Paste
clipboard


Provides administration functions
config


PLT.8.5 GenericPortlet Render Handling
GenericPortlet實作的render method會將request dispatch到doView, doEdit, doHelp,如果Portlet提供自訂modes,則必須要override doDispatch

PLT.8.6 Defining Portlet Modes Support
ex:

text/html
edit
help
...


text/vnd.wap.wml
help
...


***********************
PLT.9 Window States
window state代表portal page上可填寫的content畫面空間大小
標準有三種window states: NORMAL, MAXIMIZED, MINIMIZED

PLT.9.1 NORMAL Window State
PLT.9.2 MAXIMIZED Window State
PLT.9.3 MINIMIZED Window State
PLT.9.4 Custom Window States
ex:

Occupies 50% of the portal page
half_page



*****************
PLT.10 Portlet Context
PortletContext定義了portlet執行中的時候,Portlet application中的portlet能做什麼事情,例如使用PortletContext,portlet能夠log events, obtain portlet application resources, set/store attributes for other portlets/servlets

PLT.10.1 Scope of the Portlet Context
在containter中PortletContext的實作instance只會有一個

PLT.10.2 Portlet Context functionality
透過PortletContext,能夠 access context initialization parameters, retrieve/store context attributes, obtain static resources, obtain a request dispatcher to include servlets/JSPs

PLT.10.3 Relationship with the Servlet Context
context-wide initialization parameters跟servlet context的一樣
context attributes跟servlet context一起共用,透過PortletContext跟ServletContext取得的initialization parameters會完全一樣
透過ServletContext跟PortletContext存取的attributes都一樣

??? PortletContext必須處理ServletContext中所提供的temporary working directory (Servlet spec 2.3 javax.servlet.context.tempdir)

PLT.10.4 Correspondence between ServletContext and PortletContext methods
PortletContext必須仿照ServletContext提供 getAttribute, getAttributeNames, getInitParameter, getInitParameterNames, getMimeType, getRealPath, getResource, getResourcePaths, getResourceAsStream, log, removeAttribute, setAttribute


*********************
PLT.11 Portlet Requests
PLT.11.1 PortletRequest Interface
PortletRequest提供ActionRequest與RenderRequest共用的功能

PLT.11.1.1 Request Parameters
如果portlet收到client端的request,URL必須要encode(PortletURL),request object的parameters必須要是"x-www-form-urlencoded" decoded
containter不能從action request傳遞參數給後續的render requests,如果portlet需要這樣作,則必須要在ActionRespponse裡的processAction中使用setRenderParameter or setRenderParameters

portlet不可以取得傳遞到別的portlet中的參數

取得參數的介面methods: getParameter, getParameterNames, getParameterValues, getParameterMap

PLT.11.1.2 Extra Request Parameters
containter可以在portlet URL上增加參數,幫助route/process request
以"javax.portlet."為prefix的參數,保留給container使用

PLT.11.1.3 Request Attributes
JSP/servlet透過PortletRequestDispatcher分享使用request attributes
PortletRequest可以set, obtain, remove參數,methods: getAttribute, getAttributeNames, setAttribute, removeAttribute

以"javax.portlet."為prefix的attributes,保留給container使用

PLT.11.1.4 Request Properties
HTTP client request裡的headers可透過 PortletRequest的getProperty, getProperties, getPropertyNames取得

PLT.11.1.5 Request Context Path
context path是portlet app被deploy時的路徑,path不能以"/"開頭,不能以"/"結尾

PLT.11.1.6 Security Attributes
PortletRequest裡的 getAuthType, getRemoteUser, getUserPrincipal, isUserInRole, isSecure

getAuthType: portal使用的authentication scheme, ex: BASIC_AUTH, DIGEST_AUTH, CERT_AUTH, FORM_AUTH,如果USER沒有authenicated,則getAuthType會return null

getRemoteUser: 回傳java.security.Principal物件

isUserInRole: 表示user內含於某個特定角色中

isSecure: request是否是以HTTPS傳送

PLT.11.1.7 Response Content Types
portlet可透過getResponseContentType取得default content type
getResponseContentTypes中要回傳container支援的所有content types

getResponseContentType可回傳 *

PLT.11.1.8 Internationalization
container要決定user產生reponse時使用的locale,container可以使用request中的 Accept-Language header訊息,PortletRequest.getLocale會回傳container選擇的locale

PLT.11.1.9 Portlet Mode
PortletRequest.getPortletMode容許portlet取得目前的 portlet mode
PortletRequest.isPortletModeAllowed 可決定是否支援某個portlet mode

PLT.11.1.10 Window State
PortletRequest.getWindowState 回傳目前的window state
PortletRequest.isWindowStateAllowed 可判斷是否可使用某個window state

PLT.11.2 ActionRquest Interface
ActionRequst extends PortletRequest,用在Portlet.processAction中

PLT.11.2.1 Retrieving Uploaded Data
input stream在client request中包含HTTP POST data(除了 application/x-www-form-urlencoded之外)時很有用
ActionRequest.getReader, getPortletInputStream 可取得POST data資料,可能會throw IllegalStateException

ActionRequest提供四個method處理input stream: getContentType, getCharacterEncoding, setCharacterEncoding, getContentLength,如果POST data是 application/x-www-form-urlencoded 這種type,則getReader/getPortletInputStream 會throw IllegalStateException

PLT.11.3 RenderRequest
目前RenderRequest沒有定義任何methods

PLT.11.4 Lifetime of the Request Objects
每一個request objects只在processAction or render method裡面可以使用


**********************
PLT.12 Portlet Response
PLT.12.1 PortletResponse Interface
PortletResponse定義ActionResponse, RenderResponse共用介面

PLT.12.1.1 Response Properties
PortletResponse.setProperty, addProperty

portlet要使用encodeURL建立URLs


PLT.12.2 ActionResponse Interface
ActionResponse extends PortletResponse,由Portlet.processAction使用,提供 redirect, set render parameters, change window state, change portlet mode 的功能

PLT.12.2.1 Redirections
sendRedirect必須要指定一個 fully qualified URL,否則會傳回 IllegalArgumentException

如果在ActionResponse.setPortletMode, setWindowState, setRenderParameter, setRenderParameters後面呼叫sendRedirect,就會 throw IllegalArgumentException

PLT.12.2.2 Portlet Modes and Window State Changes
setPortletMode可改變current portlet mode,如果指定一個不支援的mode,就會 throw PortletModeException

setWindowState可改變window state,如果指定一個不支援的state,就會throw WindowStateException

sendRedirect之後呼叫setPortletMode, setWindowState,就會 throw IllegalArgumentException

PLT.12.2.3 Render Parameters
ActionResponse.setRenderParameter, setRenderParameters設定render parameters

PLT.12.3 RenderResponse Interface
RenderResponse extends PortletResponse,用在Portlet.render

PLT.12.3.1 Content Type
RenderResponse.setContentType要跟PortletRequest.getResponseContentType吻合,否則會忽略設定值

getWriter, getPortletOutputStream呼叫前,就要先呼叫setContentType

PLT.12.3.2 Output Stream and Writer Objects
RenderResponse 將content寫入 OutputStream, or Writer

PLT.12.3.3 Buffering
RenderResponse.getBufferSize, setBufferSize, isCommitted, reset, resetBuffer, flushBuffer

getBufferSize: returns the size of the underlying buffer being used

setBufferSize:

isCommitted: 表示所有response bytes已經回傳給client

flushBuffer: 強制flush contents

reset: clear data in the buffer

PLT.12.3.4 Namespace encoding
getNamespace提供portlet保證回傳唯一字串的method(在整個portal page中唯一),必須在一次render request中,呼叫幾次都回傳一樣的字串

PLT.12.3.5 Portlet Title
由container決定是否要支援自訂title
setTitle在每次portlet commit output前一定要被呼叫一次

PLT.12.4 Lifetime of Response Objects
每一個response object只在processAction, render裡面才能使用


******************
PLT.13 Portal Context
PortalContext 提供整個portal的資料,portlet可以呼叫

getPortalInfo: return portal vendor/version資料

getProperty, getPropertyNames: return portal properties

getSupportedPortletModes: return supported porlet modes

getSupportedWindowStates: return supported window states

getPortalContext: 從request object中取得 PortalContext object


**************************
PLT.14 Portlet Preferences
PLT.14.1 PortletPreferences Interface
portlet 可以在processAction過程中,修改preferences attributes

methods: getNames, getValue, setValue, getValues, setValues, getMap, isReadOnly, reset, store

ex:
PortletPreferences prefs = req.getPreferences();
String[] symbols =prefs.getValues("preferredStockSymbols",new String[]{"ACME","FOO"});
String url = prefs.getValue("quotesFeedURL",null);
int refreshInterval =Integer.parseInt(prefs.getValue("refresh","10"));

如果是read-only,則當setValue, reset時,會throw ReadOnlyException

store: 儲存修改後的PortletPreferences,如果在render中呼叫store,則會throw IllegalStateException

PLT.14.2 Preference Attributes Scopes

PLT.14.3 Preference Attributes definition



PreferredStockSymbols
FOO
XYZ
true


quotesFeedURL
http://www.foomarket.com/quotes




PLT.14.3.1 Localizing Preference Attributes
portlet spec沒有定義localizaing preference attributes

PLT.14.4 Validating Preference values

...

com.foo.portlets.XYZValidator



一個implements PreferencesValidator的class,必須要有thread safe manner
store必須要呼叫validator,可能會throw ValidatorException


*********************
PLT.15 Sessions
PortletSession介面

PLT.15.1 Creating a Session
PLT.15.2 Session Scope
PortletSession必須要scoped at the portlet application context level

PLT.15.3 Binding Attributes into a Session
PortletSession定義了兩個scope: APPLICATION_SCOPE, PORTLET_SCOPE
APPLICATION_SCOPE: 所有portlet可以使用的資料,javax.portlet.p.?,ID是container提供的id,一定要有?字元,ATTRIBUTE_NAME是用來設定PORTLET_SCOPE物件
PORTLET_SCOPE: 在一個portlet window中可以使用的資料

ex:
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);

要得知有沒有物件新增或移除自Session,就要implements HttpSessionBindingListener,PortletSesionUtil提供判斷是否為PORTLET_SCOPE的物件,decodeAttributeName可以移除container prefix


PLT.15.4 Relationship with the Web Application HttpSession
PortletSesion必須把所有attributes存在HttpSession中

PLT.15.4.1 HttpSession Method Mapping
PortletSession.getCreationTime, getId, getLastAccessedTime, getMaxInactiveInterval, invalidate, isNew, setMaxInactiveInterval跟HttpSession一樣
getAttribute, setAttribute, removeAttribute, getAttributeNames除了跟HttpSession的一樣外,還要有額外的功能: APPLICATION_SCOPE attribute names必須要一樣,PORTLET_SCOPE的attribute name要有特定的prefix,不提供SCOPE功能的變型method必須要把全部的attributes視為PORTLET_SCOPE

PLT.15.5 Reserved HttpSession Attribute Names
以"javax.portlet."開頭的attributes保留給portlet使用

PLT.15.6 Session Timeouts

PLT.15.7 Last Accessed Times

PLT.15.8 Important Session Semantics



**********************
PLT.16 Dispatching Requests to Servlets and JSPs
PortletRequestDispatcher

PLT.16.1 Obtaining a PortletRequestDispatcher
portlet只能在render裡面使用PortletRequestDispatcher
可透過PortletContext.getRequestDispatcher, getNamedDispatcher取得PortletRequestDispatcher

getRequestDispatcher要有path String當參數,path一定要以"/"開頭,並在PortletContext裡面

getNamedDispatcher以servlet String當參數

PLT.16.1.1 Query Strings in Request Dispatcher Paths
ex:
String path = "/raisons.jsp?orderno=5";
PortletRequestDispatcher rd = context.getRequestDispatcher(path);
rd.include(renderRequest, renderResponse);

PLT.16.2 Using a Request Dispatcher
PortletRequestDispatcher.include

PLT.16.3 The Include Method
在render中可能會被呼叫很多次
不應該使用RequestDispatcher.forward

PLT.16.3.1 Included Request Parameters
必須要設定這些request attributes
javax.servlet.include.request_uri
javax.servlet.include.context_path
javax.servlet.include.servlet_path
javax.servlet.include.path_info
javax.servlet.include.query_string

PLT.16.3.2 Included Request Attributes
Request Attribute Type
javax.portlet.config javax.portlet.PortletConfig
javax.portlet.request javax.portlet.RenderRequest
javax.portlet.response javax.portlet.RenderResponse

PLT.16.3.3 Request and Response objects for Included Servlets/JSPs
HttpServletRequest.getProtocol, getRemoteAddr, getRemoteHost, getRealPath, getRequestURL 必須return null
HttpServletRequest.getPathInfo, getPathTranslated, getQueryString, getRequestURI, getServletPath必須要return path and query string infos
HttpServletRequest.getScheme, getServerName,getServerPort, getAttribute, getAttributeNames, setAttribute,removeAttribute, getLocale, getLocales, isSecure, getAuthType,getContextPath, getRemoteUser, getUserPrincipal, getRequestedSessionId,isRequestedSessionIdValid 要跟PortletRequest一樣

HttpServletRequest的這些methods必須不能作用,並要return null,getCharacterEncoding, setCharacterEncoding, getContentType, getInputStream and getReader. The getContentLength method of the HttpServletRequest must return 0.

The following methods of the HttpServletRequest must be based on the properties
provided by the getProperties method of the PortletRequest interface: getHeader,getHeaders, getHeaderNames, getCookies, getDateHeader and getIntHeader

The following methods of the HttpServletRequest must provide the functionality
defined by the Servlet Specification 2.3: getRequestDispatcher, getMethod,isUserInRole, getSession, isRequestedSessionIdFromCookie, and isRequestedSessionIdFromUrl, isRequestedSessionIdFromURL


The getMethod method of the HttpServletRequest must always return "GET".

The following methods of the HttpServletResponse must return null: encodeRedirectURL
and encodeRedirectUrl. The following methods of the HttpServletResponse must be equivalent to the methods of the RenderResponse of similar name: getCharacterEncoding, setBufferSize, flushBuffer,resetBuffer, reset, getBufferSize, isCommitted, getOutputStream, getWriter, encodeURL
and encodeUrl.

The following methods of the HttpServletResponse must perform no operations: setContentType, setContentLength, setLocale, addCookie, sendError, sendRedirect, setDateHeader, addDateHeader, setHeader, addHeader, setIntHeader, addIntHeader and setStatus. The containsHeader method of the HttpServletResponse must return false.

The getLocale method of the HttpServletResponse must be based on the getLocale method of the RenderResponse.


PLT.16.3.4 Error Handling
除了IOException之外,所有Exception都要包裝PortletException

*************************
PLT.17 User Information
PLT.17.1 Defining User Attributes



User Given Name
user.name.given


User Last Name
user.name.family



User eMail
user.home-info.online.email


Company Organization
user.business-info.postal.organization




PLT.17.2 Accessing User Attributes
ex:
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") : "";

PLT.17.3 Important Node on User Information
目前沒有standard user information java api

********************
PLT.18 Caching
cache content可增加效能
PLT.18.1 Expiration Cache
ex: 300

If the expiration render invocation the cache property is set to -1, the cache does not expire.

**********************
PLT.19 Portlet Applications
PLT.19.1 Relationship with Web Applications


**********************
PLT.20 Security
PLT.20.1 Introduction
PLT.20.2 Roles
PLT.20.3 Programmatic Security
Request.getRemoteUser, isUserInRole, getUserPrincipal

getRemoteUser: return client用來認證的 user name
isUserInRole
getUserPrincipal: return java.security.Principal物件

security-role-ref

...

...

FOO
manager


...
...


PLT.20.4 Specifying Security Constaints

...

accountSummary
...

...

Secure Portlets

accountSummary


CONFIDENTIAL


...


PLT.20.5 Propagation of Security Identity in EJB

***********************
PLT.21 Packaging and Deploymenet Descriptor
/WEB-INF/portlet.xml
Portlet classes in the /WEB-INF/classes directory
Portlet Java ARchive files /WEB-INF/lib/*.jar

The following deployment descriptor values must be unique in the scope of the portlet application definition:
portlet
custom-portlet-mode
custom-window-state
user-attribute

The following deployment descriptor values must be unique in the scope of the portlet definition:
init-param
supports
preference
security-role-ref


***********************
PLT.22 Portlet Tag Library
讓JSP能include portlets,並直接使用RenderRequest, RenderResponse

container必須提供portlet tag library implementation

ex: <%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>

PLT.22.1 defineObejcts Tag
要定義以下這些變數
RenderRequest renderRequest
RenderResponse renderResponse
PortletConfig portletConfig

defineObjects不能有任何attributes與body content
ex:
<%=renderResponse.setTitle("my portlet title"); %>

PLT.22.2 actionURL Tag
actionURL產生指到目前的portlet的URL
non-required attributes:
windowState(String: non-required)
portletMode(String: non-required)
var(String: non-required): name of the exported scoped variable for the action URL
secure(String: non-required): true/ false

ex:




PLT.22.3 renderURL Tag
windowState
portletMode
var
secure
ex:





PLT.22.4 namespace Tag
ex: Foo


PLT.22.5 param Tag
name
value
ex:

*****************************
PLT.A Custom Portlet Modes
PLT.A.1 About
PLT.A.2 Config
PLT.A.3 Edit_defaults
PLT.A.4 Preview
PLT.A.5 Print

ex:

...

...

config

...

...

config

...


**************************
PLT.B Markup Fragments
Portlet產生的HTML fragments不能使用 base, body, iframe, frame, frameset, head, html, title這些tags
Portlet產生的XHTML, XHTML-Basic fragments不能使用 base, body, iframe, head, html, title這些tags


********************
PLT.C CSS Style Definitions