目的:
開(kāi)發(fā)一個(gè)符合JSR-168標準的Portlet應用,將其部署到Jetspeed2上。熟悉Portlet應用的開(kāi)發(fā)過(guò)程和了解Jetspeed2對Portlet應用的支持情況。
背景資料:
JSR-168標準:由Java Community Process(JCP)于2003年10月7日發(fā)布的Portlet Specification 1.0最終版本。定義了Portlet應用的標準接口。獲得業(yè)界的廣泛支持。
內容:
1、Portlet應用代碼
本文中的介紹的Portlet應用是由IBM developerworks提供的一個(gè)簡(jiǎn)單Hello World示例。包括了doView方法顯示一個(gè)jsp頁(yè)面。使用Portlet中的processAction方法處理jsp中From表單提交的數據,并把得到的數據放到一個(gè)Java Bean中,該Java Bean又被放到PortletSession中供jsp文件調用。具體說(shuō)明和源碼下載可參見(jiàn):
2、編輯打包
在編輯時(shí)需要兩個(gè)標準類(lèi)庫:portlet-api-1.0.jar和pluto-1.0.1.jar。
注意:在打包時(shí)不要將這兩個(gè)類(lèi)庫包含進(jìn)去。因為在Tomcat/shared/lib里已經(jīng)有了,不然就會(huì )報Cannot create Portlet instance錯誤。
使用JDK的jar命令把項目文件打包成web archive 文件。
3、發(fā)布
將打包生成的HelloWorld.war文件拷貝到/jetspeed/WEB-INF/deploy目錄下即可。系統會(huì )自動(dòng)部署到Portal中。
4、調用
在頁(yè)面編輯狀態(tài)下,點(diǎn)擊新增Portlet會(huì )出現“Portlet選擇器”。里面會(huì )新增一個(gè)“HelloWorld portlet”應用。選中后確定就可將其添加到頁(yè)面中。
除此之外還有個(gè)更簡(jiǎn)單的辦法可以顯示portlet。在/jetspeed/WEB-INF/pages目錄下的default-page.psml文件中增加一個(gè)fragment定義。
<fragment id="dp-19" type="portlet" name="HelloWorld::HelloWorldPortlet">
<property name="row" value="6"/>
<property name="column" value="0"/>
</fragment>
其中:
id 為任意項
name 為${portlet.application.id}和${portlet.name}的組合。
${portlet.application.id}是實(shí)際的war文件名;${portlet.name}為在portlet.xml中定義的<portlet-name>。
row ,column為頁(yè)面中的位置。
5、錯誤及解決方法
將應用部署到頁(yè)面后發(fā)現不能正常顯示,報Portlet is Not Available錯誤。
經(jīng)過(guò)對日志分析,原來(lái)jetspeed2不支持PropertyManager容器服務(wù)。在代碼里使用了renderRequest.getProperty("wps.markup")獲得這個(gè)初始化參數的值。
修改程序通過(guò)初始化來(lái)獲得參數的值。
private static String defaultMarkupSource = "";
/**
* Initialize portlet configuration.
*/
public void init(PortletConfig config) throws PortletException
{
super.init(config);
defaultMarkupSource = config.getInitParameter("wps.markup");
}
private static String getJspFilePath(RenderRequest request, String jspFile)
{
//String markup = request.getProperty("wps.markup");
String markup = defaultMarkupSource;
if (markup == null)
{
markup = getMarkup(request.getResponseContentType());
}
return JSP_FOLDER + markup + "/" + jspFile + "." +
getJspExtension(markup);
}
重新編譯部署,應用即可正常顯示。
總結:
Jetspeed2.0支持JSR-168標準,Portlet應用可方便地部署到Jetspeed2.0上,操作非常便捷。應用可正常運行。不足之處就是不支持Property Manager服務(wù),造成一些Portlet應用的移植困難。
參考資料:
楊江,《Hello World,一個(gè)簡(jiǎn)單的JSR 168 portlet》,