作者:曾巧(numenzq)
等级:初级
本文介绍了用OC4J和Axis构建Web服务,主要是用OC4J实现服务端,而用Axis实现客户端。
版本说明
l JDK: 1.4.2 _08
l OC4J: 10.1.3 .0.0
l Axis:1.4
l Ant: 1.6.2 (OC4J自带)
OC4J简介
Oracle Containers for J2EE (OC4J) 是 Oracle 应用服务器的核心 J2EE 运行时组件。OC4J 与 J2EE 1.4 兼容,并运行在标准的 J2SE 版本上,它在保有易于使用和高产出传统的同时,还为生产环境提供了杰出的性能和可伸缩性。
安装OC4J
从OC4J官方网站下载最新版本的安装文件:
http://www.oracle.com/technology/global/cn/tech/java/oc4j/index.html
由于OC4J各版本的安装方法各有不同,所以安装方法应参见安装包里的Readme.txt,根据该文档的描述来安装OC4J。
OC4J的运行与停止
第一次启动OC4J时,程序会提示你设计初始密码,默认值为welcome。我们可以通过<oc4j_install_dir>/bin/oc4j.cmd来启动OC4J应用服务器,命令如下:
cd <oc4j_install_dir>/bin
oc4j –start
也可以在<oc4j_install_dir>/j2ee/home目录下直接启动OC4J,命令如下:
cd <oc4j_install_dir>/j2ee/home
java –jar oc4j.jar
如果你要使用自定义的server.xml配置文件启动OC4J的话,可以使用下面的命令(假设server.xml文件存放在conf文件夹下):
cd <oc4j_install_dir>/j2ee/home
java -jar oc4j.jar -config /conf/server.xml
如果正常启动了OC4J,控制台信息应如下:
你也可以通过http://localhost:8888/来判断是否正常启动。
要停止OC4J也相当简单,直接在控制台同时按下Ctrl+C即可。你也可以使用命令使OC4J停止,如下:
cd <oc4j_install_dir>/bin
oc4j -shutdown -port 23791 -password welcome
集成OC4J到MyEclipse里
在Eclipse菜单里选择Window->Preferences…,然后在Preferences框的左边列表里选择MyEclipse->Application Servers->Oracle 9i/AS,如下图:
首先把Oracle 9i AS设置成为Enable状态,并在Oracle AS Home Directory里填入:<oc4j_install_dir>/j2ee/home,然后在第二栏填入你安装oc4j所使用的密码,最后设置你的JDK路径如图:
用Ant部署应用到OC4J
下面Ant脚本里所用到的一些参数的解释如下:(下述均为默认值,如果在你应用程序中有所不同,你得做出相应的修改)。
${j2ee.home}——<oc4j_install_dir>/j2ee/home
${oc4j.deploy.ormi}——ormi://localhost
${oc4j.deploy.username}——oc4jadmin
${oc4j.deploy.password}——welcome
${this.build}——./lib
${this.application.name}——application name
${this.ear}"——${this.application.name}.ear
${this.war}——${this.application.name}-web
${this.uri}——${this.application.name}
发布EAR文件:
<target name="deploy" depends="core">
<java jar="${j2ee.home}/admin.jar" fork="yes">
<arg value="${oc4j.deploy.ormi}"/>
<arg value="${oc4j.deploy.username}"/>
<arg value="${oc4j.deploy.password}"/>
<arg value="-deploy"/>
<arg value="-file"/>
<arg value="${this.build}/${this.ear}"/>
<arg value="-deploymentName"/>
<arg value="${this.application.name}"/>
</java>
</target>
上面的Ant脚本用java命令执行如下:
java -jar ${j2ee.home}/admin.jar ${oc4j.deploy.ormi} ${oc4j.deploy.username} ${oc4j.deploy.password} -deploy -file ${this.build}/${this.ear} -deploymentName ${this.application.name}
绑定Web应用程序:
<target name="bind-web-app" depends="deploy">
<java jar="${j2ee.home}/admin.jar" fork="yes">
<arg value="${oc4j.deploy.ormi}"/>
<arg value="${oc4j.deploy.username}"/>
<arg value="${oc4j.deploy.password}"/>
<arg value="-bindWebApp"/>
<arg value="${this.application.name}"/>
<arg value="${this.war}"/>
<arg value="http-web-site"/>
<arg value="/${this.uri}"/>
</java>
</target>
上面的Ant脚本用java命令执行如下:
java -jar ${j2ee.home}/admin.jar ${oc4j.deploy.ormi} ${oc4j.deploy.username} ${oc4j.deploy.password} -bindWebApp ${this.application.name} ${this.war} http-web-site /${this.uri}
在最新的OC4J 10g ( 10.1.3 )版本中,参数http-web-site已改为default-web-site,你可以在<oc4j_install_dir>/j2ee/home/config/目录里找到default-web-site.xml配置文件。
取消部署:
<target name="undeploy" depends="init">
<java jar="${j2ee.home}/admin.jar" fork="yes">
<arg value="${oc4j.deploy.ormi}"/>
<arg value="${oc4j.deploy.username}"/>
<arg value="${oc4j.deploy.password}"/>
<arg value="-undeploy"/>
<arg value="${this.application.name}"/>
</java>
</target>
上面的Ant脚本用java命令执行如下:
java -jar ${j2ee.home}/admin.jar ${oc4j.deploy.ormi} ${oc4j.deploy.username} ${oc4j.deploy.password} -undeploy ${this.application.name}
编码
通过对上面基本信息的学习,我们现在来编写一个简单的应用程序并部署到OC4J应用服务器上。为了方便理解,我们这个程序只有一个Hello.java接口文件,HelloImpl.java接口实现文件和application.xml,web.xml两个配置文件;为了例子的完整性,另外添加了一个index.html文件。该web服务提供sayHello(String name)方法供外部使用。下面就来讲讲具体实现。
该应用程序的包结构如下:
Hello.java
package com.gelc.ws.server;
public interface Hello {
public String sayHello(String name);
}
HelloImpl.java
package com.gelc.ws.server;
public class HelloImpl {
public HelloImpl() {}
public String sayHello(String name) {
return ("Hello " + name);
}
}
application.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
'-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN' 'http://java.sun.com/dtd/application_1_3.dtd'>
<application>
<display-name>Web Services Example</display-name>
<description>Java Web Service Example</description>
<module>
<web>
<web-uri>hellows-web.war</web-uri>
<context-root>/hellows</context-root>
</web>
</module>
</application>
该配置文件是为发布该应用到OC4J而服务的。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
'-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
<servlet>
<servlet-name>Hello Web Service</servlet-name>
<servlet-class>oracle.j2ee.ws.StatelessJavaRpcWebService</servlet-class>
<init-param>
<param-name>interface-name</param-name>
<param-value> com.gelc.ws.server.Hello</param-value>
</init-param>
<init-param>
<param-name>class-name</param-name>
<param-value> com.gelc.ws.server.HelloImpl</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Hello Web Service</servlet-name>
<url-pattern>/helloService</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
该配置文件除了配置web应用的相关信息外,更重要的是设置了<servlet-class>oracle.j2ee.ws.StatelessJavaRpcWebService</servlet-class>和相应得参数。
index.html
<!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Web Services Example</title>
<meta http-equiv="keywords" content="Web Services,OC4J,Axis">
<meta http-equiv="description" content="Web Services Example">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<ul>
<li>Hello Stateless Web Service</li>
<li><a href="helloService?wsdl">WSDL</a></li>
<li><a href="helloService?proxy_jar">Proxy Jar</a></li>
<li><a href="helloService?proxy_source">Proxy Source</a></li>
</ul>
</body>
</html>
最后要使用Ant来打包和发布该Web服务。值得注意的是,一定要使用OC4J自带的Ant来构建,ANT_HOME:<oc4j_install_dir>/ant.由于build.xml文件内容比较多,这里就不帖出来了,具体的请参加源代码。常用命令如下:
l ant 编译java文件,并打包ear和war文件
l ant deploy 部署该工程到OC4J服务器,在部署时,应保证OC4J服务器正常运行。
l ant undeploy 撤销部署,从OC4J里删除该工程
l ant clean 清空工程,删除build和lib文件
Axis简介
目前Apache Axis已经发展到了第三代,其核心是一个SOAP处理器,用于开发包括客户端,服务器端,SOAP Gateway等各种应用。事实上Apache Axis在了1.0版后,其发行版本还包括了完整的J2EE服务器插件, WSDL支持和生成,TCP/IP监视器等组件,从这个意义上来说Apahce Axis已不仅仅是个SOAP框架了,它包含了除了UDDI外对整个Web Service协议栈(Protocol Stack)的支持。
安装Axis
从Axis官方网站下载最新版本的安装文件:
直接解压下载的压缩包到安装目录即可。
编码
我们现在就写一个客户端代码来调用上面Web服务所提供的sayHello(String name)方法。由于代码并不复杂,我就先把代码贴出来:
package src.client;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
//import javax.xml.namespace.QName;
public class HelloClient {
public static void main(String[] args) {
try {
//服务端URL
String endpoint =
"http://localhost:8888/hellows/helloService?wsdl";
Service service = new Service();
Call call = (Call) service.createCall();
//设置Web Services的URL地址
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
//设置方法名,也就是要调用的方法名
// call.setOperationName("sayHello");
call.setOperationName(new QName(
"http://schemas.xmlsoap.org/wsdl/soap/", "sayHello"));
//设置参数
call.addParameter("testParam",
org.apache.axis.Constants.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
//设置返回值类型
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
//返回值
String ret = (String) call.invoke( new Object[] { "numen" } );
System.out.println("Send: 'numen'");
System.out.println("Recv: " + ret);
} catch (ServiceException se) {
se.printStackTrace();
} catch (MalformedURLException murle) {
murle.printStackTrace();
} catch (RemoteException re) {
re.printStackTrace();
}
}
}
在代码里都有相应的注解,理解并不困难,我这里想提的是设置要调用的方法问题,我们可以通过两种方法来设置方法名:
l setOperationName(java.lang.String opName)
l setOperationName(QName opName)
第一种方法非常简单,只需要把要访问的方法的名字作为参数设置即可。而第二种方法则需要通过QName对象来实现,对于这两个方法的优劣和QName对象使用方法我还不是很了解,需要进一步学习。你可以参考:http://www.w3.org/TR/xmlschema-2/#QName文档来获取QName的更多信息。