也许每本编程书籍都已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"/一定要对应。
我们的简单东西到这里就全部介绍完了,下次来点高级的东西,我也是边学边写,哈哈。