WebService 의 WSDL 과 SOAP 인 스 턴 스(JAVA 기반)

16623 단어 Frame
개발 환경:jdk 1.6+Tomcat 6.0.18+MyEclipse 6.0
:arrow:[b]먼저 WSDL 프로 토 콜 을 사용 하여 이 루어 집 니 다.[/b]여 기 는 XFire 를 사용 합 니 다.
XFire 는 무료,오픈 소스 의 SOAP 프레임 워 크 로 POJO 와 SOA 간 의 다 리 를 구축 했다.주요 특징 은 POJO 를 매우 간단 한 방식 으로 웹 서비스 로 발표 하 는 것 을 지원 하 는 것 이다.그 원 리 는 인터페이스 반사 체제 로 원 격 방법 을 자동 으로 얻 는 것 이다.
WSDL 은 웹 서비스 와 웹 서비스 와 어떻게 통신 하 는 지 설명 하 는 XML 언어 입 니 다.
준비:개발 하기 전에 홈 페이지(http://xfire.codehaus.org/Download)xfire-distribution-1.2.6.zip 다운로드 및 압축 풀기
(1)、웹 프로젝트(서버)를 새로 만 듭 니 다.이름 은 XFireWebService 입 니 다.웹 서비스 서버 를 테스트 하기 위해 서 입 니 다.
프로젝트 에 XFire 가 지원 하 는 라 이브 러 리 를 추가 하고 xfire-1.2.6 리 lib 의 모든 jar 와 xfire-all-1.2.6.jar 를 프로젝트 lib 에 복사 합 니 다.
(2)、XFire 를 시스템 에 불 러 와 웹.xml 설정 정 보 를 추가 합 니 다.




XFireServlet
org.codehaus.xfire.transport.http.XFireConfigurableServlet
0


XFireServlet
/servlet/XFireServlet/*


XFireServlet
/services/*


index.jsp



(3)웹 서비스 인 터 페 이 스 를 만 들 고 이 웹 서비스 가 대외 적 으로 노출 된 인 터 페 이 스 를 설명 한다.

package com.test.ws;
import java.util.List;
/**
*

Title: IHelloService


*

Description:


*/
public interface IHelloService {
public String getTestString(String str);
public ExceedVO getTestObject(EnterVO vo);
public List getTestList(List list);
}

(4)웹 서비스 실현 클래스 를 만 들 고 웹 서비스 인터페이스 에 실현 을 제공한다.

package com.test.ws;
import java.util.ArrayList;
import java.util.List;
/**
*

Title: HelloServiceImpl


*

Description:


*/
public class HelloServiceImpl implements IHelloService {

@Override
public String getTestString(String str) {
return "Hello" + str;
}

@Override
public ExceedVO getTestObject(EnterVO vo) {
ExceedVO revo = new ExceedVO();
revo.setDescStr(" :"+vo.getName()+" :"+vo.getAge());
return revo;
}

@Override
public List getTestList(List list) {
List users = new ArrayList();
for(int i=0; i<9; i++){
EnterVO user = new EnterVO(" "+i, i);
users.add(user);
}
return users;
}
}

(5)이 두 가지 유형 은 구체 적 인 업무 실현 유형 으로 업무 방법 에 대한 구체 적 인 실현 을 안에 둔다.

package com.test.ws;
import java.io.Serializable;
/**
*

Title: EnterVO


*

Description:


*/
public class EnterVO implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public EnterVO(String name, int age) {
this.name = name;
this.age = age;
}
public EnterVO() { }
}

package com.test.ws;
import java.io.Serializable;
/**
*

Title: ExceedVO


*

Description:


*/
public class ExceedVO implements Serializable {
private static final long serialVersionUID = 1L;
private String descStr;
public String getDescStr() {
return descStr;
}
public void setDescStr(String descStr) {
this.descStr = descStr;
}
}

(6)src 디 렉 터 리 아래 에 새로 만 든 META-INF 폴 더 에는 xfire/service.xml 이 포함 되 어 있 습 니 다.이 파일 은 XFire 프레임 워 크 의 서비스 발표 파일 입 니 다.





HelloService
http://test/HelloService
com.test.ws.IHelloService
com.test.ws.HelloServiceImpl




(7),주의:List 등 집합 유형 을 사용 할 때 Mapping 관 계 를 정의 해 야 합 니 다.
인터페이스 와 같은 이름 의 접미사.aegis.xml 이 어야 하 며 인터페이스 와 같은 위치 에 있어 야 합 니 다.

xsi:schemaLocation="http://xfire.codehaus.org/schemas/1.0/mapping.xsd">











웹.xml 과 service.xml 는 IDE 를 통 해 자동 으로 생 성 되 고 손 으로 쓸 수도 있 습 니 다.
(8),이 웹 서비스 서버 에 도착 하면 기본적으로 완성
프로젝트 배치,Tomcat 시작,wdl 테스트,방문http://localhost:8080/XFireWebService/services/HelloService?wsdl
만약 wsdl 파일 을 정확하게 표시 할 수 있다 면,방금 배치 가 성공 했다 는 것 을 설명 합 니 다!!
(9)웹 프로젝트(클 라 이언 트)를 다시 만 듭 니 다.이름 은 XFireWebClient 입 니 다.그 목적 은 웹 서비스 서 비 스 를 호출 하 는 것 입 니 다.
XFire 의 라 이브 러 리 파일 을 웹 프로젝트 의 WEB-INF\lib 디 렉 터 리 에 복사 하 는 동시에 서버 에서 발표 한 서 비 스 를 클 라 이언 트 에 포장 하여 발표 해 야 합 니 다.클 라 이언 트 에 발표 한 코드 는 인터페이스 와 매개 변수 류 만 포장 하면 됩 니 다.실현 류 는 클 라 이언 트 에 포장 하지 않 아 도 됩 니 다.
여기에 발 표 된 jar 패키지 의 이름 은 IHello Service.jar 입 니 다.IHello Service,EnterVO,Exceed VO 등 세 가지 종류 가 포함 되 어 있 습 니 다.
(10)이 웹 프로젝트 에 테스트 용 Servlet 을 새로 만 듭 니 다.이름 은 Client TestServlet.자바 입 니 다.
웹.xml 에 이 Servlet 을 설정 하면 Servlet 에 webService 호출 코드 를 쓸 수 있 습 니 다.

package com.test.ws;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.codehaus.xfire.XFire;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
/**
*

Title: ClientTestServlet


*

Description: Servlet


*/
public class ClientTestServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");
Service serviceModel = new ObjectServiceFactory().create(IHelloService.class);
XFire xfire = XFireFactory.newInstance().getXFire();
XFireProxyFactory factory = new XFireProxyFactory(xfire);
String serviceUrl = "http://localhost:8080/XFireWebService/services/HelloService";
IHelloService client = null;
try {
client = (IHelloService) factory.create(serviceModel, serviceUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
}

String str = client.getTestString("Beijing");
request.setAttribute("str", str);

EnterVO enterVO = new EnterVO();
enterVO.setName("Yaodi");
enterVO.setAge(26);
ExceedVO vo = client.getTestObject(enterVO);
request.setAttribute("vo", vo);

List al = new ArrayList();
al.add("111");
al.add("222");
al.add("333");
List list = client.getTestList(al);
request.setAttribute("list", list);

request.getRequestDispatcher("/result.jsp").forward(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}

}

클 라 이언 트 의 웹.xml 는 다음 과 같 습 니 다.


xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

ClientTestServlet
com.test.ws.ClientTestServlet


ClientTestServlet
/ClientTest.do


ClientTest.do



(11),주의:XFireWebService 프로젝트 의 IHelloService.egis.xml 파일 도 XFireWebClient 프로젝트 에 넣 어야 합 니 다.위 치 는 Client TestServlet.java 와 같은 등급 입 니 다.
(12),Servlet 에서 돌아 온 결과 페이지:result.jsp










!!!

String:${str}

Object:${vo.descStr}

List:


${list.name} --- ${list.age}





(13)이 웹 프로젝트 를 발표 하고 XFireWebService 와 XFireWebClient 두 응용 프로그램 을 동시에 시작 한 다음 주소 표시 줄 에 입력 합 니 다.http://localhost:8080/XFireWebClient/
이 때 클 라 이언 트 의 Servlet 를 호출 하고 doGet 방법 을 호출 합 니 다.정상 이면 페이지 출력 결 과 를 볼 수 있 습 니 다(*^ ^*)
[color=red]
문제:프로젝트 에서 XFire 발표 서 비 스 를 사용 하여 로 컬 테스트 는 모든 것 이 정상 이지 만 서버 에 전송 되 었 습 니 다.List 의 첫 번 째 요 소 는 내용 이 없 는 것 을 발 견 했 습 니 다.뒤의 요소 내용 은 정상 입 니 다.
디 버 깅 서버 를 통 해 문제 가 없 으 며 클 라 이언 트 간 에 전송 할 때 잃 어 버 린 것 입 니 다.현재 의 해결 방법 비교 2 는 List 앞 에 쓰레기 데 이 터 를 추가 하여 일부러 List 의 첫 번 째 요 소 를 밀 어 낸 것 입 니 다.
누가 풀 어 줬 으 면 좋 겠 어!!감사합니다.
[/color]
:arrow:[b]그 다음은 SOAP 프로 토 콜 을 사용 하여 이 루어 집 니 다.[/b]다른 언어 로 서버 를 해 야 할 때 가 있 습 니 다.자바 가 클 라 이언 트 를 하려 면 SOAP 로 WebService 를 가 져 와 야 합 니 다.
SOAP 단순 대상 접근 프로 토 콜 은 가 볍 고 간단 하 며 XML 기반 프로 토 콜 로 WEB 에서 구조 화 되 고 고 화 된 정 보 를 교환 하 는 것 으로 설계 되 었 다.
여기 서 보 여 주 는 예 는 서버 와 클 라 이언 트 가 모두 자바 입 니 다.
먼저http://xml.apache.org/soap/index.htmlsoap 다운로드,압축 풀기 soap.war
soap.war 를 Tomcat\webapps\디 렉 터 리 에 두 기
(1),새로 만 든 웹 프로젝트(서버)이름 은 SoapService
(2),서버 코드 HelloWorld Service.java 작성

package HelloWorld;
/**
*

Title: HelloWorldService


*

Description:


*/
public class HelloWorldService {
public String getMessage(){
return "Hello World!!!";
}
public String getMessage(String str1, String str2) {
return "Hello World! " + str1 + "&" + str2;
}
}

작성 이 완료 되면 HelloWorld Service 를 Tomcat\lib\디 렉 터 리 에 jar 를 발표 합 니 다.
(3)SOAP 서비스의 발표
Tomcat 를 시작 하면 soap.war 를 자동 으로 압축 해제 하고 접근 합 니 다.http://localhost:8080/soap/admin/soap 관리 페이지 가 나타 납 니 다.
메모:Tomcat\lib\디 렉 터 리 에 sun 의 mail.jar 가 부족 하기 때문에 오류 가 발생 할 수 있 습 니 다.
Deploy 에 들 어가 다음 과 같은 정 보 를 입력 하 십시오.
ID: hello
Scope: Request
Methods getMessage
Provider Type: Java
Java Provider Provider Class: HelloWorld.HelloWorldService
Java Provider Static: NO
발 표를 확인 하고 리스트 를 눌 러 발 표 된 서 비 스 를 볼 수 있 습 니 다!
(4)웹 프로젝트(클 라 이언 트)이름 을 SoapClient 로 다시 만 듭 니 다.
프로젝트 에 jar 파일 4 개 추가:xerces,soap,activation,mail
(5)이 웹 프로젝트 에 테스트 용 Servlet 을 새로 만 듭 니 다.이름 은 Hello World Client Servlet.자바 입 니 다.
웹.xml 에 이 Servlet 을 설정 하면 Servlet 에 webService 호출 코드 를 쓸 수 있 습 니 다.

package HelloWorld;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.soap.Constants;
import org.apache.soap.Fault;
import org.apache.soap.SOAPException;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;
/**
*

Title: HelloWorldClientServlet


*

Description: Servlet


*/
public class HelloWorldClientServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String endPoint = "http://localhost:8080/soap/servlet/rpcrouter"; //url ,
Call call = new Call(); // RPC Call
call.setTargetObjectURI("hello"); //
call.setMethodName("getMessage"); //
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); //
//
Vector params = new Vector();
Parameter p1 = new Parameter("name", String.class, " ", null);
Parameter p2 = new Parameter("name2", String.class, " ", null);
params.addElement(p1);
params.addElement(p2);
call.setParams(params);
URL url = new URL(endPoint); //SOAP , RPC ,
Response resp = null;
try { // ( , )
resp = call.invoke(url, "");
} catch (SOAPException e) {
e.printStackTrace();
}
if(resp.generatedFault()){
Fault fault = resp.getFault();
System.out.println("The Following Error Occured:");
System.out.println("Fault Code=" + fault.getFaultCode());
System.out.println("Fault String=" + fault.getFaultString());
} else {
Parameter result = resp.getReturnValue();
System.out.println(result.getValue());
request.setAttribute("str", result.getValue());
}
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}

클 라 이언 트 의 웹.xml 는 다음 과 같 습 니 다.


xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

HelloWorldClientServlet
HelloWorld.HelloWorldClientServlet


HelloWorldClientServlet
/HelloWorldClientServlet.do


HelloWorldClientServlet.do



(6),Servlet 에서 돌아 온 결과 페이지:result.jsp







SOAP



SOAP !!!

String:${str}




(7)클 라 이언 트 실행,통과 여부 테스트
SoapService 와 SoapClient 두 응용 프로그램 을 동시에 시작 하여 접근 합 니 다.http://localhost:8080/SoapClient/
돌아 오 는 내용 을 볼 수 있 을 것 입 니 다.설정 과 테스트 가 성공 했다 는 것 을 증명 하고 나중에 자신의 SOAP 서 비 스 를 발표 할 수 있 습 니 다!

좋은 웹페이지 즐겨찾기