用OC4J和Axis构建Web Services

2 篇文章 0 订阅
2 篇文章 0 订阅

作者:曾巧(numenzq)

等级:初级

 

本文介绍了用OC4JAxis构建Web服务,主要是用OC4J实现服务端,而用Axis实现客户端。

 

版本说明

l         JDK1.4.2 _08

l         OC4J10.1.3 .0.0

l         Axis1.4

l         Ant1.6.2OC4J自带)

 

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

   

集成OC4JMyEclipse

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文件,并打包earwar文件

l         ant deploy  部署该工程到OC4J服务器,在部署时,应保证OC4J服务器正常运行。

l         ant undeploy  撤销部署,从OC4J里删除该工程

l         ant clean   清空工程,删除buildlib文件  

 

Axis简介

    目前Apache Axis已经发展到了第三代,其核心是一个SOAP处理器,用于开发包括客户端,服务器端,SOAP Gateway等各种应用。事实上Apache Axis在了1.0版后,其发行版本还包括了完整的J2EE服务器插件, WSDL支持和生成,TCP/IP监视器等组件,从这个意义上来说Apahce Axis已不仅仅是个SOAP框架了,它包含了除了UDDI外对整个Web Service协议栈(Protocol Stack)的支持。

 

安装Axis

Axis官方网站下载最新版本的安装文件:

http://ws.apache.org/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 ServicesURL地址

           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的更多信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值