본문 바로가기

웹서비스

AXIS Apache XML WebService 예제포함

[그림 1]


[그림 2]


[ Apache AXIS를 이용한 웹서비스 ]

개요 : 톰캣(자바)환경에서 axis를 이용한 웹서비스

Apache Axis is an implementation of the SOAP ("Simple Object Access Protocol") submission to W3C.

아래의 내용은 중요하므로 기본 개념이 분명이 있어야 한다.
본 강좌(팁)은 사용법을 위주로 아주 기초적인 예제를 다룰것이므로 자세한 내용은 생략한다.

SOAP (Simple Object Access Protocol)
WSDL (Web Service Description Langauge)
WSDD (Web Service Deployment Descriptor)

1. Apache Tomcat 4.1 이상 , Full Version으로 설치

  • 톰캣 5.5.4 버젼을 사용하였다. (참고로 Windows환경이다.)
    설치후 http://localhost:8080으로 확인해서 동작이 되면 정상이다.
    이것이 톰캣설치의 전부이고, jsp 및 servlet이 동작이되면 준비는 되었다.
    필요에 따라 jdbc등 기타 드라이버를 c:\tomcat\common\lib\ 에 복사 한다.
  • set CATALINA_HOME=c:\tomcat

2. 자바 개발툴킷 설치 : JDK 1.4 버젼 이상이면 된다.

  • 참고로 jdk 1.5 버젼을 설치하였다.
  • 설치 후에 classpath를 설정한다.
    set CLASSPATH=.;c:\jdk15\lib\tools.jar;c:\tomcat\common\lib\servlet-api.jar;
    추가적으로 필요한 jdbc 및 기타 라이브러리들을 추가한다.
  • set JAVA_HOME=c:\jdk15
    set PATH=c:\jdk15\bin; 을 기존 PATH에 추가한다.

3. ANT 설치 (옵션) : ant에 대해서는 다른 문서나 커뮤니티 사이이트에서 참고할것.

  • http://ant.apache.org에서 ant 1.6.2 버젼을 받아서 설치한다.
    설치는 다운 받은 파일을 압축을 풀어서 일정한 디렉토리에 옮겨놓으면 된다.
  • set ANT_HOME=c:\ant
    set PATH=c:\ant\bin; 을 기존 PATH에 추가한다.
  • C:\tomcat\server\lib\catalina-ant.jar 파일을 c:\ant\lib\ 디렉토리로 복사한다.
  • 추가적으로 junit 이나 xml관련 라이브러리등을 c:\ant\lib\ 에 복사하여 사용하면 된다.

4. AXIS 설치 : http://ws.apache.org/axis/ , http://ws.apache.org/axis/releases.html

  • axis 사이트에서 최신 릴리즈를 다운받아서 압축을 푼후에, 원하는 디렉토리에 옮겨놓으면 된다.
    참고로 1.1 final version를 다운 받아서 사용중이다.
  • set AXIS_HOME=c:\axis
  • set AXIS_LIB=%AXIS_HOME%\lib
  • set AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar;
    %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;
    %AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;
    %AXIS_LIB%\wsdl4j.jar
  • set CLASSPATH=%CLASSPATH%;%AXISCLASSPATH% 으로 기존 CLASSPATH 에 추가한다.
  • 참고 :
    CLASSPATH에 있는 xml-apis.jar 파일과 xercesImpl.jar 파일은
    http://xml.apache.org/ 에서 받으면 된다.
    또한, 아래에서 보게 될 라이브러리 테스트를 통하여 추가 라이브러리를 확인할수 있고
    확인후에 필요한 다운 사이트 정보까지 나오게 되므로 정보를 확인후 다시 설정해주면 된다.

5. axis를 톰캣에 연동하기

  • 연동에 있어서 특별한 것은 없고 단지, c:\axis\webapps\axis\ 에서 axis디렉토리를
    c:\tomcat\webapps\axis로 복사하면 된다. 즉, 톰캣 webapps디렉토리에 axis 컨텍스트가
    추가 되었다고 이해해도 되겠다.

6. 테스트 해보기

  • 톰캣을 실행하고
  • 연결테스트를 해본다.
    http://localhost:8080/axis
  • 라이브러리 테스트
    http://localhost:8080/axis/happyaxis.jsp 에서 필요하거나 필수적인 추가 라이브러리를
    설치하라는 경고 메시지를 보여주기 때문에 이때 필요한 라이브러리를 다운받아서
    c:\tomcat\webapps\axis\lib\ 에 복사해주고 다시 테스트를 해본다.
    필요에 따라서 다운받은 라이브러리를 CLASSPATH에 설정해주어서 jdk로 컴파일할때 이용하자.

7. SOAP 테스트

  • http://localhost:8080/axis/services/Version?method=getVersion
    다음과 같이 출력되면 정상적으로 설치가 된것이다. (내용은 환경에 따라 약간 차이가 난다.)
    <?xml version="1.0" encoding="UTF-8" ?>
    - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    - <soapenv:Body>
    - <getVersionResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <getVersionReturn xsi:type="xsd:string">Apache Axis version: 1.1 Built on Jun 13, 2003 (09:19:43 EDT)
    </getVersionReturn>
    </getVersionResponse>
    </soapenv:Body>
    </soapenv:Envelope>

8. AdminClient 테스트

  • C:\axis\samples\stock 디렉토리로 이동하여 예제로 테스트해보자.
  • java org.apache.axis.client.AdminClient
    -lhttp://localhost:8080/axis/services/AdminService deploy.wsdd
  • deploy가 되었는지 확인하고, 에러가 나면 거의 대부분의 원인은 클래스패스에서 나온다.
  • deploy가 제대로 되었는지 확인해보자.
    http://localhost:8080/axis/servlet/AxisServlet
    아래처럼 추가된 부분이 웹에 보인다면 성공적으로 deploy된것이다.
    urn:xmltoday-delayed-quotes (wsdl)
    test
    getQuote

9. Client 수행 테스트

  • java samples.stock.GetQuote -lhttp://localhost:8080/axis/servlet/AxisServlet -uuser1 -wpass1 XXX
    실행결과가 55.25가 출력되면 성공이다.~~!!!
  • 실행시 클래스 패스 오류가 나면 GetQuote.java 파일을 편집기로 열어서 소스 윗부분의
    package samples.stock 부분을 지우고 컴파일 하여
    java GetQuote -lhttp://localhost:8080/axis/servlet/AxisServlet -uuser1 -wpass1 XXX
    실행 해보면 정상적으로 나올것이다.

10. 프로그램 작성 순서

  • 서버 Interface와 구현 Class를 작성한후 컴파일 한다.
  • 구현 클래스로 부터 WSDL 파일을 생성한다.
  • WSDL 파일로 부터 deploy.wsdd 파일을 생성한다.
  • deploy.wsdd 파일을 이용해서 웹서비스를 deploy하고 server-config.wsdd 파일을 생성 수정한다.
  • 구현클래스로 부터 client-side 클래스를 생성한다.

11. 프로그램 작성 플로우

  • [그림 1]

12. 예제 프로그램

  • 자바 Interface와 자바 Implement 클래스 작성
    c:\test\ 에 아래 2개의 파일을 생성한다.

    //begin - HelloIF.java
    package webservice.hello;
    public interface HelloIF extends java.rmi.Remote {
    public String hello(java.lang.String name) throws java.rmi.RemoteException;
    }
    //end - HelloIF.java

    //begin - HelloImpl.java
    package webservice.hello;
    public class HelloImpl implements HelloIF {
    public HelloImpl() {
    }
    public String hello(String name) {
    System.out.println(name);
    return "hi " + name;
    }
    }
    //end - HelloImpl.java

  • 컴파일

    javac -d . HelloImpl.java
    컴파일 후 c:\test\webservice/hello 디렉토리밑에 HelloImpl.class 와 HelloIF.class가 생성.
    생성된 class파일을 C:\Tomcat\webapps\axis\WEB-INF\classes
    디렉토리에 패키지 디렉토리를 포함해서 복사한다.
    참고: 컴파일이 되지 않을경우, HelloIF.java파일을 먼저 컴파일한후에 c:\test\webservice/hello
    디렉토리에 HelloIF.class파일을 복사해놓고 다시 컴파일 해본다.

  • 구현된 클래스로 부터 WSDL 생성 하기

    java org.apache.axis.wsdl.Java2WSDL -o c:\test\webservice\hello\Hello.wsdl
    -l http://localhost:8080/axis/services/Hello -n http://hello.webservice -pwebservice.hello
    http://hello.webservice webservice.hello.HelloIF

    Java2WSDL 인자 (http://ws.apache.org/axis/java/reference.html)
    인 자
    의 미
    -o 파일경로wsdl 생성 위치
    -l URLclient가 접속할 URL
    -n 네임스페이스WSDL의 타켓 네임스페이스
    -p패키지 네임스페이스네임스페이스와 네임스페이스 매핑
    Target인터페이스 이름


    [생성된 Hello.wsdl 파일]

    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions targetNamespace="http://hello.webservice"
    ...
    ...생략...
    ...
    <wsdl:service name="HelloIFService">
    <wsdl:port name="Hello" binding="impl:HelloSoapBinding">
    <wsdlsoap:address location="http://localhost:8080/axis/services/Hello"/>
    </wsdl:port>
    </wsdl:service>
    </wsdl:definitions>

  • WSDL 파일로 부터 deploy.wsdd 파일 생성 및 client-side 자바 클래스 생성

    java org.apache.axis.wsdl.WSDL2Java -o c:\test\webservice\hello\
    -d Application -s c:\test\webservice\hello\Hello.wsdl

    c:\test\webservice\hello 디렉토리 하위에 webservice/hello
    새로운 디렉토리가 생성된것을 확인 할수 있다.
    그 디렉토리에 deploy.wsdd 파일과 새롭게 생성된 자바 파일이 존재해야 한다.
    또한, undeploy.wsdd 파일도 생성 된 것을 볼수 있는데 이파일은 서비스를
    undeploy할때 사용한다.
    인 자
    의 미
    -o 디렉토리경로 wsdd 파일과 클래스파일이 생길 디렉토리
    -d scope 설치 영역 - Application, Request , Session
    -swsdd 파일 생성
    Targetwsdl 파일 경로

  • [deploy.wsdd 파일 수정]
    wsdd 파일은 wsdl 파일만 가지고 생성되었기 때문에 실제 구현클래스가 무엇인지 제대로
    설정이 안되어 있으므로 그부분을 수정해 주어야한다.
    붉은색 부분으로 해당 부분을 수정해주면 된다.

    <deployment
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    ...
    ...생략...
    ...
    <parameter name="className" value="webservice.hello.HelloImpl"/>
    ...
    ...생략...
    ...
    <parameter name="allowedMethods" value="hello"/>
    <parameter name="scope" value="Application"/>
    </service>
    </deployment>

  • 서비스 디플로이먼트 하기

    java org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService deploy.wsdd

    [디플로이먼트 확인하기]
    http://localhost:8080/axis/servlet/AxisServlet
    'Hello' 라는 서비스가 설치된것을 확인할 수 있다.

  • 서비스 언디플로이먼트 하기

    java org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService undeploy.wsdd

    [언디플로이먼트 확인하기]
    http://localhost:8080/axis/servlet/AxisServlet
    'Hello' 라는 서비스가 삭제 된것을 확인할 수 있다.

13. 클라이언트 구현하기

  • 이제 생성된 서비스에 클라이언트로 접근해보는 예제를 생성하고 테스트 해보자.
    아래와 같이 작성하고 c:\tomcat\webapps\axis\ 복사한다.

  • [HelloClient.jsp]
    <%@ page contentType="text/html; charset=euc-kr" language="java"
    import="java.net.MalformedURLException,
    java.net.URL,
    java.rmi.RemoteException,
    javax.xml.namespace.QName,
    javax.xml.rpc.ServiceException,
    org.apache.axis.client.Call,
    org.apache.axis.client.Service" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
    <title>웹서비스 테스트 : Hello World!</title>
    </head>
    <body>
    <%
    Service service = new Service();
    Call call = (Call)service.createCall();
    call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/Hello?wsdl"));
    call.setOperationName(new QName("http://soapinterop.org/", "hello"));
    String returnValue = (String)call.invoke(new Object[]{"! 안녕하세요.^^*"});
    out.println(returnValue);
    %>
    </body>
    </html>

  • http://localhost:8080/axis/hello.jsp

    hi ! 안녕하세요.^^*

  • 위에서 처럼 나오면 성공이다. HelloClient.jsp부분하고 차이가 없는것 같지만
    "! 안녕하세요" 와 "hi ! 안녕하세요" 차이가 크다.(구현하는 프로그램적으로...)
    즉, hi 라고 출력되어지는 String hello() 웹 메소드를 HelloImpl.class에서 가져와서 실행하는 것이다.

14. 두번째 예제

  • 첫번째 방법 외에 빠른 방법이 있다.
    자바 파일을 만들고 확장자를 java가 아닌 jws로 바꾸고 실행하는 방법이다.
    참고로 c:\tomcat\webapps\axis\WEB-INF\web.xml를 한번 검토해길 바란다.

  • [ HelloWorldService.jws]

    public class HelloWorldService
    {
    public String HelloWorld(String data)
    {
    return "Hello World! You sent the string '" + data + "'.";
    }
    }

  • 위의 파일을 c:\tomcat\webapps\axis\ 에 복사하고

    http://localhost:8080/axis/HelloWorldService.jws

    그 주소에 설치된 서비스가 있다는 HTML 페이지가 나온다. 여기서 더나가 HelloWorld 메서드를 호출해보자.

    http://localhost:8080/axis/HelloWorldService.jws?method=HelloWorld&data=Hi+my+name+is+okjsp

    메서드를 호출한 결과 XML을 받았다.

  • 자바로 클라이언트 구현 하기

    [ HelloWorldClient.java]

    import java.net.MalformedURLException;
    import java.net.URL;
    import java.rmi.RemoteException;
    import javax.xml.namespace.QName;
    import javax.xml.rpc.ServiceException;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;

    public class HelloWorldClient
    {
    public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException
    {
    Service service = new Service();
    Call call = (Call)service.createCall();
    call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/HelloWorldService.jws"));
    call.setOperationName(new QName("http://soapinterop.org/", "HelloWorld"));
    String returnValue = (String)call.invoke(new Object[]{"My name is okjsp."});
    System.out.println(returnValue);
    }
    }

  • HelloWorldClient.java 파일을 컴파일 하고 실행 해서 결과를 확인해 본다.
    참고로 컴파일 에러가 나는 경우는 라이브러리등이 CLASSPATH에 잡혀있지 않아서 이다.
    본 문서의 처음 부분에 있는 설정 부분을 확인해 보고 다시 시도 해보자.

15. 마치며

XML, SOAP, WSDL, WSDD, UDDI 그리고,
닷넷과 자바...[웹서비스]...

[그림 2]

[참고 사이트 및 자료]
http://www.apache.org 에서 axis 에 포함된 관련 도큐먼트 및 기타 커뮤니티 참조
본 문서는 거의 대부분 인용 한 것 입니다.

'웹서비스' 카테고리의 다른 글

웹서비스 예제  (0) 2010.07.16
Apache Axis2 User`s Guide - 번역본링크  (0) 2010.07.16
AXIS2 예제 링크  (0) 2010.07.16
예제 HotelHilton - 파일있다  (0) 2010.07.16
WEB Services 링크 -&gt; 잘 모아 놓았군요.  (0) 2010.07.16