[그림 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 URL client가 접속할 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 -s wsdd 파일 생성 Target wsdl 파일 경로 - [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 링크 -> 잘 모아 놓았군요. (0) | 2010.07.16 |