Jetspeed JetExpress Tutorial Portal筆記4
-- portlets開(kāi)發(fā)
0. 前言
本文主要介紹基于Java Portlet API的Portlet開(kāi)發(fā)。
包括的內容:
- Eclipse集成
- Portlet編寫(xiě),portlet.xml配置
- 高級Portlet編程
說(shuō)明:本系列文章并不是Jetspeed Tutorial JetExpress的完全翻譯,關(guān)注點(diǎn)是其流程和其中容易出錯的地方,及做Jetspeed二次開(kāi)發(fā)比較關(guān)注的Jetspeed本身涉及的內容,因此原文中的圖,只要不涉及Jetspeed原理及架構等的,都不會(huì )貼圖。并且內容上可能并不完全一樣,會(huì )把作者自己的一些心得和注意事項隨時(shí)加入到需要的地方。
1. Eclipse集成
使用maven生成eclipse項目文件,導入到eclipse中即可。maven能夠為eclipse生成project文件和classpath文件,并且能夠自動(dòng)添加依賴(lài)關(guān)系(主要指編譯時(shí)依賴(lài)的jar)。
1.1 為jetexpress項目創(chuàng )建eclipse項目:
# Linux
cd /JetspeedTraining/workspace/jetexpress
mvn eclipse:eclipse
cp portal/.classpath .
cp portal/.project .
# Windows
cd \JetspeedTraining\workspace\jetexpress
mvn eclipse:eclipse
copy portal\.classpath .
copy portal\.project .
1.2 為express-demo項目創(chuàng )建eclipse項目:
# Linux
cd /JetspeedTraining/workspace/jetexpress/applications/express-demo
mvn eclipse:eclipse
# Windows
cd \JetspeedTraining\workspace\jetexpress\applications\express-demo
mvn eclipse:eclipse
1.3 eclipse項目說(shuō)明
同樣為express-demo portlet應用項目創(chuàng )建eclipse項目。因為eclipse不支持maven形式的多項目(基于pom的父子項目),所以為每個(gè)maven管理的項目建立獨立的eclipse項目。
1.4 設置eclipse項目
創(chuàng )建好之后,在eclipse中導入即可(類(lèi)型為workspace中已存在項目)。
導入之后為eclipse添加一個(gè)變量M2_REPO,指向C:/JetspeedTraining/maven/repository(相關(guān)知識請參閱maven文檔)。
設置好之后eclipse會(huì )自動(dòng)重新編譯項目(編譯設置發(fā)生改變時(shí))。
如果喜歡的話(huà),可以安裝eclipse的SVN插件,這樣就可以在eclipse直接訪(fǎng)問(wèn)jetspeed的SVN庫了(相關(guān)知識請另行參閱相關(guān)文檔)。
2. Portlet編寫(xiě)及配置
2.1 編寫(xiě)Hello World Portlet
在express-demo工程中,為com.bluesunrise.portal.portlets.tutorial包添加BonjourWorld類(lèi),繼承javax.portlet.GenericPortlet類(lèi)。
注:這里javax.portlet.GenericPortlet類(lèi)即portlet API。
為BonjourWorld類(lèi)增加對doEdit、doHelp、doView三個(gè)方法的實(shí)現。這里的每個(gè)方法都關(guān)聯(lián)了一個(gè)portlet模式(portlet mode),即對編輯按鈕點(diǎn)擊、幫助按鈕點(diǎn)擊和瀏覽portlet時(shí)的處理方法。添加一個(gè)簡(jiǎn)單的輸出如下:
protected void doView(RenderRequest request, RenderResponse response) throws
PortletException, IOException
{
response.setContentType(”text/html”);
response.getWriter().println(”<b>Bonjour: View Mode</b>”);
}
doEdit和doHelp處理類(lèi)似。
2.2 配置portlet.xml
寫(xiě)好了之后,我們來(lái)編輯portlet.xml文件,為我們的portlet創(chuàng )建一個(gè)portlet描述條目。portlet.xml文件在工程的WEB-INF目錄下,與web.xml同級目錄。注意<supports>里面定義的就是我們剛剛寫(xiě)好的幾個(gè)方法。
<portlet>
<description>Bonjour Monde Portlet</description>
<portlet-name>BonjourMonde</portlet-name>
<display-name>Bonjour Monde</display-name>
<portlet-class>com.bluesunrise.portal.portlets.tutorial.BonjourWorld</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
<portlet-mode>EDIT</portlet-mode>
<portlet-mode>HELP</portlet-mode>
</supports>
<supported-locale>en</supported-locale>
<portlet-info>
<title>Bonjour Monde</title>
<short-title>Bonjour</short-title>
<keywords>tutorial,bonjour,hello</keywords>
</portlet-info>
</portlet>
2.3 配置頁(yè)面
2.3.1 創(chuàng )建portal site
創(chuàng )建一個(gè)頁(yè)面來(lái)放剛剛創(chuàng )建的portlet。在jetexpress工程(/JetspeedTraining/workspace/jetexpress)里,添加一個(gè)目錄portal/src/webapp/WEB-INF/pages/tutorial/,把它作為我們創(chuàng )建的portal site的根目錄(portal site就是具有樹(shù)狀結構的頁(yè)面)。
2.3.2 編寫(xiě)folder.metadata文件來(lái)描述這個(gè)portal資源
<?xml version=”1.0″ encoding=”UTF-8″?>
<folder>
<title >Tutorial</title>
<metadata name=”title” xml:lang=”fr”>Autodidacte</metadata>
<security-constraints>
<security-constraints-ref>public-edit</security-constraints-ref>
</security-constraints>
</folder>
2.3.3 創(chuàng )建默認頁(yè)面degault-page.psml
<page>
<defaults layout-decorator=”express-page”
portlet-decorator=”express-portlet”
skin=”express”/>
<title>JetExpress Tutorials</title>
<short-title>Tutorials</short-title>
<fragment id=”tutorial-100″ type=”layout” name=”jetspeed-layouts::VelocityTwoColumns”>
<fragment id=”express-101″ type=”portlet” name=”express-demo::BonjourMonde”/>
</fragment>
</page>
為portlet窗口添加新portlet的引用
2.3.4 部署新的portlet和新的頁(yè)面
# Linux
cd /JetspeedTraining/workspace/jetexpress
ant
cd applications/express-demo
mvn
cp target/express-demo-1.0.war /JetspeedTraining/tomcat-express/webapps/express-demo.war
# Windows
cd \JetspeedTraining\workspace\jetexpress
ant
cd applications\express-demo
mvn
copy target\express-demo-1.0.war \JetspeedTraining\tomcat-express\webapps\express-demo.war
注:命令的含義在筆記3中有相關(guān)描述
ant 調用默認target,拷貝修改的頁(yè)面到tomcat
mvn 默認為install,生成war文件
cp … 拷貝war文件到tomcat中(熱部署)
3 高級Portlet編程
直接集成javax.portlet.GenericPortlet的開(kāi)發(fā)方式雖然可行,但是無(wú)論從哪個(gè)角度說(shuō)都不是最好的方式,因此實(shí)際應用中,這樣的應用很少(除非應用本身及其簡(jiǎn)單)。
對于大多數Jetspeed的二次開(kāi)發(fā)者來(lái)說(shuō),都希望能用自己最熟悉的技術(shù)來(lái)開(kāi)發(fā)portlets,而Jetspeed剛好提供了這樣的可能。
3.1 Apache Portals Bridges項目介紹
Portals Bridges項目提供了符合JSR-168標準的portlet的多種開(kāi)發(fā)方式,為開(kāi)發(fā)者提供了使用自己熟悉的技術(shù)開(kāi)發(fā)portlet的能力,開(kāi)發(fā)者可以使用Struts、JSF,甚至PHP、Perl、Velocity等等進(jìn)行portlet的開(kāi)發(fā)。
3.2 基于Portals Bridges的開(kāi)發(fā)
本小節已經(jīng)是對原文的擴展,具體細節本文不再詳述,筆者會(huì )在其他文章中描述。
4. 總結
無(wú)論是基于portlet API的開(kāi)發(fā),還是基于Portals Bridges的開(kāi)發(fā),流程都比較簡(jiǎn)單,具體的應用還需要依賴(lài)具體的環(huán)境。
對于目前涉及到的內容來(lái)說(shuō),還缺少portlet的測試內容,portlet的測試類(lèi)似于servlet的測試,需要依賴(lài)于portlet容器,而通過(guò)部署到Jetspeed中進(jìn)行集成測試的話(huà)又比較浪費時(shí)間和精力,畢竟不能只修改一點(diǎn)代碼就部署一次,因此需要探索更高效和可行的測試方法。
下一步將研究如果通過(guò)Portals Bridges進(jìn)行開(kāi)發(fā)及portlet的測試工作。

