使用Axis开发Web Service

  |   0 评论   |   1,464 浏览

    使用Axis开发Web Service程序

    今天是感恩节,差点又要在公司加班了。好在Web Service程序并不是特别难搞,下午终于在eclipse下调通过了,正确产生了服务器端和客户端的Java代码,apache的东西的确很不错。

     

    说道Web Service的程序开发,八个月前我加班调试公司和中国电信的商务领航系统的接口的时候,用的就是Web Service,Web Service有很多优点,使用Web Service可以在不同编程语言间实现数据交换,而我那时对Web Service也不熟,就由同事帮我生成了一大堆Web Service的框架代码,我则只单独开发业务代码。

     

    这次的另外一个项目也要用Web Service了,不过人手也少了,没有人帮做Web Service了,只好自己动手。

     

    好在开发前,有个同事先给我们不熟悉Web Service的程序员进行了一些培训,我才知道原来以前的Web Service都是可以自动生成代码的,而且也不难,试了一个下午客户端和服务器端的Web Service代码就都调试通过了,真不错。

     

    为了更多喜爱开发的程序员也能迅速了解Web Service的开发,我这里整理了一些通过Axis开发Web Service的一些要点,希望能让不熟悉Web Service的开发人员能够迅速掌握Web Service。

     

    一、Axis环境的安装

     

    1、安装环境 J2SE SDK 1.4,Tomcat 5.0,eclipse 3.2。

     

    2、到 http://xml.apache.org 网站下载Axis安装包。

     

    3、将Axis相关包文件放在WEB-INF\lib目录下。

     

    4、Axis可选的包:activation.jar; mail.jar; xmlsec-1.4.Beta1.jar拷贝到WEB-INF目录下,生成客户端时候需要使用。

     

    Axis支持三种web service的部署和开发,分别为:

     

    1、Dynamic Invocation Interface (DII)

     

    2、Dynamic Proxy方式

     

    3、Stubs方式

     

    前两种方式我就不介绍了,同事告诉我他们自己都不使用前两种方式,他们建议我们使用Stubs方式,因此我就主要就介绍一下第三种方式。注意,我自己的Java源代码是放在D:\workspace\test\目录下,Axis相关包文件放在D:\workspace\test\WEB-INF目录下。

     

    1、新建一个Web工程,工程名为“AxisTest”:

    2、新建“lib”文件夹,然后把主要JAR包:axis.jar,commons-discovery-0.2.jar,commons-logging-1.0.4.jar,jaxrpc.jar,wsdl4j-1.5.1.jar,saaj.jar;可选包(发布服务及生成客户端程序是要用到的):activation.jar;mail.jar都拷贝到此“lib”文件夹下,并把主要的JAR包添加到工程的classpath中;

    3、配置“web.xml”:

    <?xml version=“1.0” encoding=“UTF-8”?>

    <web-app version=“2.4”

    xmlns=“http://java.sun.com/xml/ns/j2ee

    xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

     

    <display-name>Apache-Axis</display-name>

    <listener>

    <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>

    </listener>

     

    <servlet>

    <servlet-name>AxisServlet</servlet-name>

    <servlet-class>

    org.apache.axis.transport.http.AxisServlet

    </servlet-class>

    </servlet>

     

    <servlet>

    <servlet-name>AdminServlet</servlet-name>

    <servlet-class>

    org.apache.axis.transport.http.AdminServlet

    </servlet-class>

    <load-on-startup>100</load-on-startup>

    </servlet>

     

    <servlet>

    <servlet-name>SOAPMonitorService</servlet-name>

    <servlet-class>

    org.apache.axis.monitor.SOAPMonitorService

    </servlet-class>

    <init-param>

    <param-name>SOAPMonitorPort</param-name>

    <param-value>5001</param-value>

    </init-param>

    <load-on-startup>100</load-on-startup>

    </servlet>

    <servlet-mapping>

    <servlet-name>AxisServlet</servlet-name>

    <url-pattern>/servlet/AxisServlet</url-pattern>

    </servlet-mapping>

     

    <servlet-mapping>

    <servlet-name>AxisServlet</servlet-name>

    <url-pattern>*.jws</url-pattern>

    </servlet-mapping>

     

    <servlet-mapping>

    <servlet-name>AxisServlet</servlet-name>

    <url-pattern>/services/*</url-pattern>

    </servlet-mapping>

     

    <servlet-mapping>

    <servlet-name>SOAPMonitorService</servlet-name>

    <url-pattern>/SOAPMonitor</url-pattern>

    </servlet-mapping>

     

    <!– uncomment this if you want the admin servlet –>

    <!–

    <servlet-mapping>

    <servlet-name>AdminServlet</servlet-name>

    <url-pattern>/servlet/AdminServlet</url-pattern>

    </servlet-mapping>

    –>

    <session-config>

    <session-timeout>20</session-timeout>

    </session-config>

    <!– currently the W3C havent settled on a media type for WSDL;

    http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft

    for now we go with the basic ‘it’s XML’ response –>

    <mime-mapping>

    <extension>wsdl</extension>

    <mime-type>text/xml</mime-type>

    </mime-mapping>

     

    <mime-mapping>

    <extension>xsd</extension>

    <mime-type>text/xml</mime-type>

    </mime-mapping>

     

    <welcome-file-list id=“WelcomeFileList”>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.jws</welcome-file>

    </welcome-file-list>

    </web-app>

     

    4、编写服务端程序server,SayHello.java,编译server.SayHello.java

    package server;

    public class SayHello

    {

    public String getName(String name)

    {

    return "hello "+name;

    }

    }

    5、编写wsdd文件

    deploy.wsdd文件内容如下:

     

    <deployment xmlns=“http://xml.apache.org/axis/wsdd/

    xmlns:java=“http://xml.apache.org/axis/wsdd/providers/java”>

    <service name=“SayHello” provider=“java:RPC”>

    <parameter name=“className” value=“server.SayHello” />

    <parameter name=“allowedMethods” value=“*” />

    <parameter name=“scope” value=“session”/>

    </service>

    </deployment>

     

     

    6、把工程发布到Tomcat并启动Tomcat;

     

    7、发布服务

    编辑一个deploy.bat,Axis_Lib为axis.jar路径。内容如下:

    set Axis_Lib=.\lib

    set JavaCmd=java -Djava.ext.dirs=%AxisLib%

    set Axis_Servlet=http://localhost:8080/AxisTest/servlet/AxisServlet

    %JavaCmd% org.apache.axis.client.AdminClient -l%AxisServlet% deploy.wsdd

     

    执行这个批处理文件,这时候,如果提示成功的话,访问http://localhost:8080/AxisTest/servlet/AxisServlet或http://localhost:8080/AxisTest/services就会显示服务列表。

    8、生成客户端client stub文件

    在浏览器上访问服务器端的服务,可以下载到WSDL文件,通过Axis的相关工具,可以自动从WSDL文件中生成Web Service的客户端代码。

    编写一个WSDL2Java.bat文件,其内容如下:

    set Axis_Lib=.\lib

    set JavaCmd=java -Djava.ext.dirs=%AxisLib%

    set Output_Path=.\src

    set Package=server.com

    set wsdl_path=http://localhost:8080/AxisTest/services/SayHello?wsdl

    %JavaCmd% org.apache.axis.wsdl.WSDL2Java -o%OutputPath% -p%Package% %wsdl_path%

     

     

    执行这个批处理文件就可以生成client stub.

    生成的stub client文件列表为:SayHello.java,SayHelloService.java,SayHelloServiceLocator.java,SayHelloSoapBindingStub.java .

    9、编写客户端程序,编译并执行

    1)、Stubs方式

    下面是一段junit测试客户端代码。

    import java.net.URL;

    import junit.framework.Test;

    import junit.framework.TestCase;

    import junit.framework.TestSuite;

    public class TestWSClient extends TestCase {

    public TestWSClient(String string) {

    super(string);

    }

    public void SayHelloClient() throws Exception {

    SayHelloService service = new SayHelloServiceLocator();

    SayHello_PortType client = service.getSayHello() ;

    String retValue = client.getName(“clientname”);

    System.out.println(retValue);

    }

    public static Test suite() {

    TestSuite suite = new TestSuite();

    suite.addTest(new TestWSClient(“SayHelloClient”));

    return suite;

    }

    }

    2)、动态调用方式:

    package test;

     

    import javax.xml.namespace.QName;

     

    import org.apache.axis.client.Call;

    import org.apache.axis.client.Service;

     

     

     

    public class DynamicTest {

     

    public static void main(String[] args) {

    try {

    String endpointURL = “http://localhost:8080/testaxis/services/SayHello”;

     

    Service service = new Service();

    Call call = (Call) service.createCall();

    call.setTargetEndpointAddress(new java.net.URL(endpointURL));

    call.setOperationName(new QName(“SayHello”, “getName”));

    String res = (String) call.invoke(new Object[] { “sily” });

    System.out.println(res);

    } catch (Exception e) {

    System.err.println(e.toString());

    }

    }

    }

     

    评论

    发表评论

    validate