Jetspeed JetExpress Tutorial Portal筆記4
-- portlets開發(fā)
0. 前言
本文主要介紹基于Java Portlet API的Portlet開發(fā)。
包括的內(nèi)容:
- Eclipse集成
- Portlet編寫,portlet.xml配置
- 高級(jí)Portlet編程
說明:本系列文章并不是Jetspeed Tutorial JetExpress的完全翻譯,關(guān)注點(diǎn)是其流程和其中容易出錯(cuò)的地方,及做Jetspeed二次開發(fā)比較關(guān)注的Jetspeed本身涉及的內(nèi)容,因此原文中的圖,只要不涉及Jetspeed原理及架構(gòu)等的,都不會(huì)貼圖。并且內(nèi)容上可能并不完全一樣,會(huì)把作者自己的一些心得和注意事項(xiàng)隨時(shí)加入到需要的地方。
1. Eclipse集成
使用maven生成eclipse項(xiàng)目文件,導(dǎo)入到eclipse中即可。maven能夠?yàn)閑clipse生成project文件和classpath文件,并且能夠自動(dòng)添加依賴關(guān)系(主要指編譯時(shí)依賴的jar)。
1.1 為jetexpress項(xiàng)目創(chuàng)建eclipse項(xiàng)目:
# 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項(xiàng)目創(chuàng)建eclipse項(xiàng)目:
# 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項(xiàng)目說明
同樣為express-demo portlet應(yīng)用項(xiàng)目創(chuàng)建eclipse項(xiàng)目。因?yàn)閑clipse不支持maven形式的多項(xiàng)目(基于pom的父子項(xiàng)目),所以為每個(gè)maven管理的項(xiàng)目建立獨(dú)立的eclipse項(xiàng)目。
1.4 設(shè)置eclipse項(xiàng)目
創(chuàng)建好之后,在eclipse中導(dǎo)入即可(類型為workspace中已存在項(xiàng)目)。
導(dǎo)入之后為eclipse添加一個(gè)變量M2_REPO,指向C:/JetspeedTraining/maven/repository(相關(guān)知識(shí)請(qǐng)參閱maven文檔)。
設(shè)置好之后eclipse會(huì)自動(dòng)重新編譯項(xiàng)目(編譯設(shè)置發(fā)生改變時(shí))。
如果喜歡的話,可以安裝eclipse的SVN插件,這樣就可以在eclipse直接訪問jetspeed的SVN庫了(相關(guān)知識(shí)請(qǐng)另行參閱相關(guān)文檔)。
2. Portlet編寫及配置
2.1 編寫Hello World Portlet
在express-demo工程中,為com.bluesunrise.portal.portlets.tutorial包添加BonjourWorld類,繼承javax.portlet.GenericPortlet類。
注:這里javax.portlet.GenericPortlet類即portlet API。
為BonjourWorld類增加對(duì)doEdit、doHelp、doView三個(gè)方法的實(shí)現(xiàn)。這里的每個(gè)方法都關(guān)聯(lián)了一個(gè)portlet模式(portlet mode),即對(duì)編輯按鈕點(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處理類似。
2.2 配置portlet.xml
寫好了之后,我們來編輯portlet.xml文件,為我們的portlet創(chuàng)建一個(gè)portlet描述條目。portlet.xml文件在工程的WEB-INF目錄下,與web.xml同級(jí)目錄。注意<supports>里面定義的就是我們剛剛寫好的幾個(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 配置頁面
2.3.1 創(chuàng)建portal site
創(chuàng)建一個(gè)頁面來放剛剛創(chuàng)建的portlet。在jetexpress工程(/JetspeedTraining/workspace/jetexpress)里,添加一個(gè)目錄portal/src/webapp/WEB-INF/pages/tutorial/,把它作為我們創(chuàng)建的portal site的根目錄(portal site就是具有樹狀結(jié)構(gòu)的頁面)。
2.3.2 編寫folder.metadata文件來描述這個(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)建默認(rèn)頁面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和新的頁面
# 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 調(diào)用默認(rèn)target,拷貝修改的頁面到tomcat
mvn 默認(rèn)為install,生成war文件
cp … 拷貝war文件到tomcat中(熱部署)
3 高級(jí)Portlet編程
直接集成javax.portlet.GenericPortlet的開發(fā)方式雖然可行,但是無論從哪個(gè)角度說都不是最好的方式,因此實(shí)際應(yīng)用中,這樣的應(yīng)用很少(除非應(yīng)用本身及其簡(jiǎn)單)。
對(duì)于大多數(shù)Jetspeed的二次開發(fā)者來說,都希望能用自己最熟悉的技術(shù)來開發(fā)portlets,而Jetspeed剛好提供了這樣的可能。
3.1 Apache Portals Bridges項(xiàng)目介紹
Portals Bridges項(xiàng)目提供了符合JSR-168標(biāo)準(zhǔn)的portlet的多種開發(fā)方式,為開發(fā)者提供了使用自己熟悉的技術(shù)開發(fā)portlet的能力,開發(fā)者可以使用Struts、JSF,甚至PHP、Perl、Velocity等等進(jìn)行portlet的開發(fā)。
3.2 基于Portals Bridges的開發(fā)
本小節(jié)已經(jīng)是對(duì)原文的擴(kuò)展,具體細(xì)節(jié)本文不再詳述,筆者會(huì)在其他文章中描述。
4. 總結(jié)
無論是基于portlet API的開發(fā),還是基于Portals Bridges的開發(fā),流程都比較簡(jiǎn)單,具體的應(yīng)用還需要依賴具體的環(huán)境。
對(duì)于目前涉及到的內(nèi)容來說,還缺少portlet的測(cè)試內(nèi)容,portlet的測(cè)試類似于servlet的測(cè)試,需要依賴于portlet容器,而通過部署到Jetspeed中進(jìn)行集成測(cè)試的話又比較浪費(fèi)時(shí)間和精力,畢竟不能只修改一點(diǎn)代碼就部署一次,因此需要探索更高效和可行的測(cè)試方法。
下一步將研究如果通過Portals Bridges進(jìn)行開發(fā)及portlet的測(cè)試工作。