也許每本編程書籍都已Hello World為開頭不是沒有原因的,因為Hello World以淺顯的編程技巧可以迅速地讓開發者上手,所以,我決定還是落入俗套吧,這次我們來講如何實現一個Hello World。
由于我是利用Java做web方面的東西,所以我們先學習一下如何開發一個web application。
先從理論上武裝一下自己,理解普通的web application和Lotus Expeditor 的 web application有什么區別。定位于Lotus Expeditor平臺的Web Application稱為Client Services web application。因為Lotus Expeditor平臺的組件被稱為bundles,所以一個定位于此平臺的Web Application也被稱為一個Web Application Bundle或者WAB。Client Services web application 和運行在 WAS(Websphere Application Server) 或者 tomcat 下的 web application一個主要的不同就是Client Services web application必須也是一個有效的OSGI Bundle。那么什么是OSGI呢?這個就說來話長了,等我們羽翼豐滿了以后,在具體討論這個問題吧,我們還是先實現一個定位于Lotus Expeditor平臺的Web Application。
首先需要創建一個Web application,打開eclipse,File-New-Project, 選擇Client Services Web 項目,如下圖:
我們把這個工程叫做 HelloWorld 吧,如下圖:

然后一路Next,直到如下頁面:

我們看看一個普通的Lotus Expeditor的web application都用到了哪些包,有Apache MyFaces(org.apache.myfaces) ,Eclipse核心組件(com.ibm.jxesupport.initializer,org.eclipse.core.contenttype,org.eclipse.core.jobs,org.eclipse.core.runtime,org.eclipse.equinox.common,org.eclipse.equinox.event,org.eclipse.equinox.preferences,org.eclipse.equinox.registry,org.eclipse.osgi,org.eclipse.osgi.services,org.eclipse.osgi.util),IBM JavaServer Faces(JSF)擴展(com.ibm.rcp.servlet.jsf.ext,com.ibm.rcp.servlet.jsf.ext.impl),JavaServer Pages(JSP) API(com.ibm.pvc.servlet.jsp),JavaServer 面窗口小部件庫(JWL)(com.ibm.rcp.servlet.jwl),JSP標準標記庫(JSTL)(com.ibm.pvc.servlet.jsp.jstl),Servlet API(com.ibm.pvc.servlet),Web Application服務(org.osgi.service.webapplication),Web Application兼容性(com.ibm.osg.servlet,com.ibm.osg.webapp),Web Container(com.ibm.pvc.webcontainer) ,Web容器-JSP編譯器網橋,可靠性,可用性和可維護性(RAS)(com.ibm.pvc.ras),這些組件都是干什么用的呢?說實話,我也一頭霧水,先暫時不管,我們點擊Finish完成工程的創建。
讓我們看看新建的工程和普通的Web Application的目錄結構有什么不同,如下圖:

Lotus Expeditor的Web Application相比普通的Web Application在整體結構上基本是沒有什么區別的,主要是多出了plugin.xml和META-INF/MANIFEST.MF兩個文件。我按照我目前的理解先說說這兩個文件,說之前就不得不提到OSGI了,其實我很早就聽說了OSGI,也對它的架構和設計思想有一些了解,只不過從來沒有自己動手實踐過,所以也是一知半解,只知道個概念而已。好,我們下面就說說OSGI
OSGI Bundle概述
Bundles是含有包含特定頭信息的manifest的jar文件,這些頭信息描述了bundle并且列出了bundle的依賴性,比如說bundle需要的包和服務。Manifest文件中的描述信息將bundle和其他的jar文件區分開。非bundle的jar文件的manifest文件常常包含了好少的信息。但是,bundle的manifest文件通常包含了描述信息,比如說bundle的名字,版本以及此bundle需要的包和服務的列表。
框架管理bundle的生命周期,bundle的生命周期分為:
INSTALLED-bundle已經安裝,但是該bundle的依賴性還沒有被完全解決。
RESOLVED-bundle的狀態是installed,并且已經解決了依賴性問題,但是該bundle并沒有被運行。如果一個bundle已經啟動,并且所有的依賴性問題已經解決,那么該bundle就會跳過RESOLVED狀態。
STARTING-bundle正式運行的一個臨時狀態
ACTIVE-bundle正在運行
STOPPING-bundle的另一個臨時狀態
UNINSTALLED-bundle不再存在于框架中
每個bundle都必須包含一個manifest文件。Bundle的manifest文件包含框架需要正確安裝的數據和激活的bundle。Legacy Eclipse bundles 能夠在plugin.xml文件中提供一些manifest的信息,但是我們建議使用META-INF/MANIFEST.MF文件來記錄manifeset信息。
注意:plugin.xml可以包含類似的信息,但是,plugin.xml也包含了擴展和擴展點。
如果一個bundle僅僅包含了一個plugin.xml,Eclipse平臺在啟動時將生成一個等價的manifest.mf。當你在manifest文件中指定數據的時候,你必須使用OSGI標準中定義的文件頭。你可以使用用戶定義的文件頭,但是,框架將會忽略任何它不能夠理解的文件頭。
MANIFEST.MF文件位于bundle工程的META-INF目錄下。Plugin.xml文件位于根目錄下。
上面說了這么多,總體意思就是說MANIFEST.MF是區分普通Web Application和OSGI Bundle的標志,而一個Client Services web application就需要含有一個plugin.xml。下面列出了Client Services web application和標準的web application的不同之處:
1,The Lotus Expeditor platform 不支持通過EAR部署Enterprise Application。Web Application是被直接部署到運行時的(后面這句話不太理解。。。)
2,Client Services web application有一個manifest文件, 位于META-INF/MANIFEST.MF, 它包含了引用包的信息以及bundel依賴性的信息。
3,Client Services web application 有一個包含了擴展點的 plugin.xml文件,利用這個文件可以簡單地啟動Web application。
4,Client Services web application 含有記錄了額外部署信息的wab.properties文件。 這個文件位于 Webcontent /WEB-INF文件夾。
5,JSP文件在作為WAB部署到運行時前被編譯成相對應的Servlet。
我們只是從理論的高度看了一下Client Services Web Application,是不是有點恐高?沒關系,讓我們具體實踐一下。在WebContent文件夾下創建index.jsp,如下圖:
JSP源代碼如下:

<%
@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>HelloWorld</title>
</head>
<body>
HelloWorld
</body>
</html>

JSP文件已經創建好,先在服務器上運行看看效果如何?右鍵點擊HelloWorld工程,Run As-Run on Server,選擇剛才Client Services v6.1,直接finish就可以了。
在彈出的Lotus Expeditor Client的編輯窗口中點擊打開菜單,我們看到菜單項并沒有發生什么變化,如下圖:
回到Eclipse,我們發現Eclipse打開了我們剛才創建的index.jsp,如下圖:
說明index.jsp創建成功了,我們還需要將這個HelloWorld添加到Lotus Expeditor的菜單項中。那么我們到底應該怎么做呢?前面說過了,Client Services web application區別于其他Web Application就是plugin.xml文件。打開這個文件看看吧,如下圖:
這段代碼的含義就是將我們的HelloWorld注冊到Client Service中,這樣我們可以就可以在Client Server啟動時訪問到HelloWorld工程了。那么具體怎么在Lotus Expeditor Client的菜單項中添加我們的工程呢?
擴充如下代碼,最終plugin.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<extension point="com.ibm.pvc.webcontainer.application">
<contextRoot>/HelloWorld</contextRoot>
<contentLocation>WebContent</contentLocation>
</extension>
<extension id="helloworld" point="com.ibm.eswe.workbench.WctWebApplication">
<WEBApplication DisplayName="你好">
<WebApplicationUrl local="true" secured="false" url="/HelloWorld"/>
</WEBApplication>
</extension>
</plugin>

我們再重新運行Hello World工程,看一看Lotus Expeditor Client的菜單項,是不是多出來了“你好”菜單?如下圖:
注意:<contextRoot>/HelloWorld</contextRoot>與url="/HelloWorld"/一定要對應。
我們的簡單東西到這里就全部介紹完了,下次來點高級的東西,我也是邊學邊寫,哈哈。