【WebService開発】CXFによるWebService開発
15170 ワード
1.開発サービス
a)CXF:apache-cxf-3.1.をダウンロードする6
b)cxfのjarパッケージをプロジェクトに追加し、その他変更する必要はなく(JDKがwebserviceを開発するのと同じ)、webserviceサービス側の開発が完了した.
2.クライアントの開発
a)環境変数pathに加え、E:apache-cxf-3.1.6\bin
b)cmdコマンドの下でクライアントコードを生成し、コマンドはwsdl 2 java urlであり、このコマンドはcxfのbinディレクトリの下の機能である.
c)クライアントテストコードの作成
WebServiceリクエストの流れ
Webサービスリクエストの本質:
1.クライアントは、サービス側にsoapメッセージ(http要求+xml断片)を送信する.
2.サーバ側は要求を処理した後、クライアントにsoapメッセージを返す.
/*********************************************************************************************/
CXFフレームワークの使用
1、CXFの遮断器
なぜブロッキングを設計したのですか?
Webserviceリクエスト中にリクエストと応答データを動的に操作できるように、CXFはブロッキングを設計した.
ブロッキング区分:
1.位置によって分けます:サーバー側ブロック、クライアントブロック.
2.メッセージの方向に分けます:インターセプタに入って、インターセプタを出ます.
3.定義者別:システム・ブロッカー、カスタム・ブロッカー.
【例】クライアントおよびサービス側にログ・ブロッキングを追加する方法を示します.
サービス・エンド・サーバTestにログ・ブロッキングを追加します.
クライアントClientTestにログ・ブロッキングを追加します.
2、CXFカスタムブロック
AbstractPhaseInterceptor:抽象プロシージャ・ブロッカー.一般的にカスタマイズされたブロッカーが継承されます.
機能:ユーザー名とパスワードのチェックをカスタムブロッカーで実現
1.クライアントブロッカー:outブロッカーを設定し、soapメッセージにユーザー名とパスワードデータを追加する
2.サービス側ブロック:inブロックを設定し、soapメッセージからユーザー名とパスワードデータを取得し、条件を満たさなければwebサービスを実行しない方法
3.サービス側テストコード:
4.クライアントテストコード
/*********************************************************************************************/
SpringベースのWebServiceをCXFで作成
サーバ側:
1.Webプロジェクトを新規作成し、cxfのjarパッケージをインポートする
2.SEIとその実装の定義
3.Webサービスの公開
beans.xml
Web.xml
クライアント側
1.Webプロジェクトを新規作成し、cxfのjarパッケージをインポートする
2.wsdlドキュメントに基づいてクライアントコードを生成する(src下)
3. client-beans.xml
4.テストコードの作成:
/*********************************************************************************************/
SpringベースのWebService追加ブロッカーをCXFで作成
クライアント:
client-beans.xml:
クライアントブロッカーMyInterceptor:
サーバ側:
Beans.xml:
サービス・エンド・ブロッカーMyInterceptor:
a)CXF:apache-cxf-3.1.をダウンロードする6
b)cxfのjarパッケージをプロジェクトに追加し、その他変更する必要はなく(JDKがwebserviceを開発するのと同じ)、webserviceサービス側の開発が完了した.
2.クライアントの開発
a)環境変数pathに加え、E:apache-cxf-3.1.6\bin
b)cmdコマンドの下でクライアントコードを生成し、コマンドはwsdl 2 java urlであり、このコマンドはcxfのbinディレクトリの下の機能である.
c)クライアントテストコードの作成
public class ClientTest {
public static void main(String[] args) {
HelloWSImplService factory = new HelloWSImplService();
HelloWs helloWs = factory.getHelloWSImplPort();
String result = helloWs.sayHello("xdy");
System.out.println(result);
}
}
WebServiceリクエストの流れ
Webサービスリクエストの本質:
1.クライアントは、サービス側にsoapメッセージ(http要求+xml断片)を送信する.
2.サーバ側は要求を処理した後、クライアントにsoapメッセージを返す.
/*********************************************************************************************/
CXFフレームワークの使用
1、CXFの遮断器
なぜブロッキングを設計したのですか?
Webserviceリクエスト中にリクエストと応答データを動的に操作できるように、CXFはブロッキングを設計した.
ブロッキング区分:
1.位置によって分けます:サーバー側ブロック、クライアントブロック.
2.メッセージの方向に分けます:インターセプタに入って、インターセプタを出ます.
3.定義者別:システム・ブロッカー、カスタム・ブロッカー.
【例】クライアントおよびサービス側にログ・ブロッキングを追加する方法を示します.
サービス・エンド・サーバTestにログ・ブロッキングを追加します.
public class ServerTest {
public static void main(String[] args) {
String address = "http://192.168.0.102:8989/day01_ws/hellows";
Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl());
System.out.println(endpoint);
EndpointImpl endpointImpl = (EndpointImpl)endpoint;
//
List> inInterceptors = endpointImpl.getInInterceptors();
inInterceptors.add(new LoggingInInterceptor());
//
List> outInterceptors = endpointImpl.getOutInterceptors();
outInterceptors.add(new LoggingOutInterceptor());
System.out.println(" webservice !");
}
}
クライアントClientTestにログ・ブロッキングを追加します.
public class ClientTest {
public static void main(String[] args) {
HelloWSImplService factory = new HelloWSImplService();
HelloWs helloWs = factory.getHelloWSImplPort();
//
Client client = ClientProxy.getClient(helloWs);
//
List> outInterceptors = client.getOutInterceptors();
outInterceptors.add(new LoggingOutInterceptor());
//
List> inInterceptors = client.getInInterceptors();
inInterceptors.add(new LoggingInInterceptor());
String result = helloWs.sayHello("xdy");
System.out.println(result);
}
}
2、CXFカスタムブロック
AbstractPhaseInterceptor:抽象プロシージャ・ブロッカー.一般的にカスタマイズされたブロッカーが継承されます.
機能:ユーザー名とパスワードのチェックをカスタムブロッカーで実現
1.クライアントブロッカー:outブロッカーを設定し、soapメッセージにユーザー名とパスワードデータを追加する
public class MyInterceptor extends AbstractPhaseInterceptor {
private String name;
private String password;
public MyInterceptor(String name,String password) {
super(Phase.PRE_PROTOCOL);
this.name = name;
this.password = password;
}
/*
xiongdy
123456
xdy
*/
public void handleMessage(SoapMessage message) throws Fault {
List headers = message.getHeaders();
/*
xiongdy
123456
*/
//Document document = DOMHelper.createDocument();
Document document = DOMUtils.createDocument();
//
Element rootEle = document.createElement("xdy");
//xiongdy
Element nameEle = document.createElement("name");
nameEle.setTextContent(name);
rootEle.appendChild(nameEle);
//123456
Element passwordEle = document.createElement("password");
passwordEle.setTextContent(password);
rootEle.appendChild(passwordEle);
//
headers.add(new Header(new QName("xdy"), rootEle));
System.out.println("client-----handleMessage");
}
}
2.サービス側ブロック:inブロックを設定し、soapメッセージからユーザー名とパスワードデータを取得し、条件を満たさなければwebサービスを実行しない方法
public class MyInterceptor extends AbstractPhaseInterceptor {
public MyInterceptor() {
super(Phase.PRE_PROTOCOL);
}
@Override
public void handleMessage(SoapMessage msg) throws Fault {
System.out.println("server-----handleMessage");
Header header = msg.getHeader(new QName("xdy"));
if(header==null) {
throw new Fault(new RuntimeException(" "));
} else {
Element data = (Element) header.getObject();
if(data==null) {
throw new Fault(new RuntimeException(" 22"));
} else {
String name = data.getElementsByTagName("name").item(0).getTextContent();
String password = data.getElementsByTagName("password").item(0).getTextContent();
if(!"xiongdy".equals(name) || !"123456".equals(password)) {
throw new Fault(new RuntimeException(" "));
}
}
}
System.out.println(" !");
}
}
3.サービス側テストコード:
public class ServerTest {
public static void main(String[] args) {
String address = "http://192.168.0.102:8989/day01_ws/hellows";
Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl());
System.out.println(endpoint);
EndpointImpl endpointImpl = (EndpointImpl)endpoint;
//
List> inInterceptors = endpointImpl.getInInterceptors();
inInterceptors.add(new MyInterceptor());
System.out.println(" webservice !");
}
}
4.クライアントテストコード
public class ClientTest2 {
public static void main(String[] args) {
HelloWSImplService factory = new HelloWSImplService();
HelloWs helloWs = factory.getHelloWSImplPort();
//
Client client = ClientProxy.getClient(helloWs);
//
List> outInterceptors = client.getOutInterceptors();
outInterceptors.add(new MyInterceptor("xiongdy", "123456"));
String result = helloWs.sayHello("xdy");
System.out.println(result);
}
}
/*********************************************************************************************/
SpringベースのWebServiceをCXFで作成
サーバ側:
1.Webプロジェクトを新規作成し、cxfのjarパッケージをインポートする
2.SEIとその実装の定義
@WebService
public interface OrderService {
@WebMethod
public Order getOrderByNo(String orderNo);
}
@WebService
public class OrderServiceImpl implements OrderService {
public OrderServiceImpl() {
System.out.println("OrderServiceImpl()");
}
public Order getOrderByNo(String orderNo) {
System.out.println("getOrderByNo() orderNO=" + orderNo);
return new Order(3, orderNo, 10000000);
}
}
public class Order {
private int id;
private String orderNo;
private double price;
}
3.Webサービスの公開
beans.xml
Web.xml
index.jsp
contextConfigLocation
classpath:beans.xml
org.springframework.web.context.ContextLoaderListener
CXFServlet
org.apache.cxf.transport.servlet.CXFServlet
1
CXFServlet
/*
クライアント側
1.Webプロジェクトを新規作成し、cxfのjarパッケージをインポートする
2.wsdlドキュメントに基づいてクライアントコードを生成する(src下)
3. client-beans.xml
4.テストコードの作成:
public class ClientTest {
public static void main(String[] args) {
// client-beans.xml
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("client-beans.xml");
// bean id OrderService
OrderService orderService = (OrderService) context.getBean("orderClient");
// , soap
Order order = orderService.getOrderByNo("hao123");
System.out.println("client " + order.getId() + "_" + order.getOrderNo()+ "_" + order.getPrice());
}
}
/*********************************************************************************************/
SpringベースのWebService追加ブロッカーをCXFで作成
クライアント:
client-beans.xml:
クライアントブロッカーMyInterceptor:
public class MyInterceptor extends AbstractPhaseInterceptor {
private String name;
private String password;
public MyInterceptor(String name,String password) {
super(Phase.PRE_PROTOCOL);
this.name = name;
this.password = password;
System.out.println("MyInterceptor.....");
}
public MyInterceptor() {
super(Phase.PRE_PROTOCOL);
System.out.println("MyInterceptor.....^_^");
}
/*
xiongdy
123456
xdy
*/
public void handleMessage(SoapMessage message) throws Fault {
List headers = message.getHeaders();
/*
xiongdy
123456
*/
//Document document = DOMHelper.createDocument();
Document document = DOMUtils.createDocument();
//
Element rootEle = document.createElement("xdy");
//xiongdy
Element nameEle = document.createElement("name");
nameEle.setTextContent(name);
rootEle.appendChild(nameEle);
//123456
Element passwordEle = document.createElement("password");
passwordEle.setTextContent(password);
rootEle.appendChild(passwordEle);
//
headers.add(new Header(new QName("xdy"), rootEle));
System.out.println("client-----handleMessage");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
サーバ側:
Beans.xml:
サービス・エンド・ブロッカーMyInterceptor:
public class MyInterceptor extends AbstractPhaseInterceptor {
public MyInterceptor() {
super(Phase.PRE_PROTOCOL);
}
public void handleMessage(SoapMessage msg) throws Fault {
System.out.println("server-----handleMessage");
Header header = msg.getHeader(new QName("xdy"));
if(header==null) {
throw new Fault(new RuntimeException(" "));
} else {
Element data = (Element) header.getObject();
if(data==null) {
throw new Fault(new RuntimeException(" 22"));
} else {
String name = data.getElementsByTagName("name").item(0).getTextContent();
String password = data.getElementsByTagName("password").item(0).getTextContent();
if(!"xiongdy".equals(name) || !"123456".equals(password)) {
throw new Fault(new RuntimeException(" "));
}
}
}
System.out.println(" !");
}
}