JAX – WS – 01 – Hello JAX – WS

Acknowledgement/Takdim/Mukaddime

İlim; ezberlenen şey değil, ezberlenen şeyden hasıl olan faydadır.
İmam-ı Şafii (Radıyallahu Anh)

Web Service nedir ?

Merhaba Arkadaslar
Yeni bir tutorial serisine bu yazi ile basliyoruz.
Faydali olmasi dileklerimle…

Web Service kavrami “self explanatory/ açıklama gerektirmeyecek kadar açık” bir isme sahiptir.
Web/Internet uzerinde calisan , HTTP protokolu ile iletisim kurabilecegimiz hizmetler/uygulamalardir.

Web Service’leri farkli uygulamalarin birlikte calismalarina olanak saglar. (interoperating)
Farkli uygulamalar , farkli programlama dilleri ya da frameworklerini kullansalar bile bu birlikte calisma prensibini (interoperating) Web Service’ler ile saglayabilirler.

Java EE Tutorial’da Web Service icin su aciklama yer almaktadir ;

Web services are client and server applications that communicate over the World Wide Web’s (WWW) HyperText Transfer Protocol (HTTP). As described by the World Wide Web Consortium (W3C), web services provide a standard means of interoperating between software applications running on a variety of platforms and frameworks.

What Are Web Services?

Java da 2 tip Web Service bulunmaktadir.

JAX-RS ile ilgili tutoriallari ilgili linkte bulabilirsiniz. Burada JAX-WS i incelemeye baslayacagiz.

Hello JAX-WS

JAX-WS , Java API for XML Web Services olarak ifade edilmektedir. Big Web Services olarak da isimlendirilmektedir.
JAX-WS . Java EE/Enterprise Edition platformunun bir parcasidir.

JSR-224 linkinden ilgili JSR: Java Specification Request’e erisim saglanabilir.
JSR-224 sadece bir spect’tir. Simdi de JAX-WS icin implementation’lari listeleyelim ;

  • Metro Project in GlassFish /reference implementation
  • Apache CXF
  • Apache Axis2
  • JBossWS in JBoss
  • IBM WebSphere Jax-Ws in WebSphere
  • Oracle Weblogic

JAX-WS reference implementation , Glassfish projesinin bir parcasi olan Metro ‘dur.
JAX-WS official olarak JavaEE nin bir parcasidir , fakat JDK1.6 ve uzeri versiyonlar icin JAX-WS sadece core java se uygulamasiyla da publish edilebilir.
Bununla birlikte Apache Tomcat gibi bir Container ile de publish edilebilir.

Burada ilk olarak Java SE uygulamasi uzerinde publish islemini gerceklestirecegiz.
Bir sonraki bolumde ise Apache Tomcat uzerinde publish islemini yapacagiz.

SOAP , WSDL , UDDI ?

SOAP , Simple Object Access Protocol olarak ifade edilmektedir.
SOAP , Web Service gelistirmek icin kullanilan , XML tabanli ve standard olmus bir protocol dur. Platform ve programlama dili bagimsizdir.

SOAP message’lari complex bir yapiya sahiptir JAX-WS API’si bu complexity’yi developerdan saklamaktadir.
JAX-WS sayesinde , developer SOAP message’larini olusturmak/generate ya da parse etmek zorunda kalmaz.
JAX-WS , call’lari (istek/request) ve response’lari SOAP messaga’larina donusturur.

WSDL , Web Service Description Language anlamina gelmektedir.
WSDL , XML tabanli bir dokumandir ve Web Service hakkinda tum teknik bilgileri barindirmaktadir.
method isimleri , parametreleri , service ismi , port bilgisi gibi …

WSDL , bir web service nasil erisebiliriz ve hangi isleri/operation/method gerceklestirilebilecegini tanimlar..

WSDL Elemements

<definitions>
<definitions> element’i WSDL dokumanindaki root element’tir ve web service’in ismini tanimlar.

<types>
<types> element’i Web Service’te kullanilan data tiplerini belirtmek icin kullanilmaktadir.
Web Service eger basit olarak String ve Integer tipinde type kullaniyorsa bu durumda <types> element’in de bir tanima gerek yoktur.

Complex Type’lar icin yani Person sinifimiz olsun id , name , surname property’leri olsun.

Ornek XML yapisini inceleyecek olursak , <types> element’inin WSDL icerisinde nasil kullanildigini gostermektedir.

Complex Type’lar icin bu bilgi ayri bir link uzerinde yer alacaktir yani ayri bir dokuman olacaktir.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://service/">
	<xs:complexType name="person">
		<xs:sequence>
			<xs:element name="id" type="xs:int"/>
			<xs:element name="name" type="xs:string" minOccurs="0"/>
			<xs:element name="surname" type="xs:string" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>

<message>
<message> element’i Web Service’te tanimli metotlari ifade etmektedir.
<message> element’inde 0 ya da daha fazla <part> element’i icerebilir.

Ornek WSDL blogu inceleyelim ;
Burada getWelcomeMessage metodu tanimlanmaktadir ve parametre olarak String tipinde 1 parametre almaktadir.

getWelcomeMessageResponse message etiketi de donus tipini tanimaktadir.

<message name="getWelcomeMessage">
	<part name="userName" type="xsd:string"/>
</message>

<message name="getWelcomeMessageResponse">
	<part name="return" type="xsd:string"/>
</message>

<portType>
<portType> element’inde <input> <output> elementleri yer almaktadir.
message attribute’u ile <message> element’i eslesmektedir.

JAX-WS spect’in de portType icin su ifade yer almaktadir ;

A WSDL port type is a named set of abstract operation definitions.

wsdl:portType ‘da tanimli interface’e Service Endpoint Interface ya da kisaca SEI adi verilir.
<portType> icerisinde <operation> yer almaktadir. SEI’de tanimli metotlar burada <operation> etiketi ile yer almaktadir.

A Java interface mapped from a wsdl:portType is called a Service Endpoint Interface 
or SEI for short.
<portType name="MessageWriter">
	<operation name="getWelcomeMessage">
		<input wsam:Action="http://service/MessageWriter/getWelcomeMessageRequest" message="tns:getWelcomeMessage"/>
		<output wsam:Action="http://service/MessageWriter/getWelcomeMessageResponse" message="tns:getWelcomeMessageResponse"/>
	</operation>
</portType>

<binding>
<binding> element’inde name ve type attribute’leri yer almaktadir.
<soap:binding> , <soap:operation> . <soap:body> gibi element’ler yer almaktadir.

<binding name="MessageWriterImplPortBinding" type="tns:MessageWriter">
	<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
		style="rpc" />
	<operation name="getWelcomeMessage">
		<soap:operation soapAction="" />
		<input>
			<soap:body use="literal" namespace="http://service/" />
		</input>
		<output>
			<soap:body use="literal" namespace="http://service/" />
		</output>
	</operation>
</binding>

<soap:binding> element’i 2 tane attribute almaktadir ; style ve transport
style attribute’u rpc ya da document olabilir.

transport ‘da HTTP , SMTP , TCP gibi protokoller olabilir. Burada HTTP kullaniyoruz.

2 farkli communication style/iletisim yaklasimi vardir ; RPC , Document
Bununla birlikte 2 farkli encoding modeli kullanilmaktadir ; literal , encoded

http://stackoverflow.com/questions/9062475/what-is-the-difference-between-document-style-and-rpc-style-communication

https://www.ibm.com/developerworks/library/ws-whichwsdl/

<service>
service name ve <soap:address> element’i yer almaktadir.
<soap:address> element’inde location bilgisi Web Service address bilgisi yer almaktadir.

<service name="MessageWriterImplService">
	<port name="MessageWriterImplPort" binding="tns:MessageWriterImplPortBinding">
	<soap:address location="http://localhost:8888/injavawetrust/hello.jaxws"/>
	</port>
</service>

UDDI , Universal Description, Discovery and Integration anlamina gelmektedir.

Bir UDDI implementation olan jUDDI , bu kavrami soyle ifade eder;
Think of UDDI as the yellow pages of the phone book for web services.

http://juddi.apache.org/


JAX-WS Simple Implementation

Simdi de ornek bir uygulama gerceklestirelim

MessageWriter.java
Yeni bir interface olusturalim.
@WebService annotation’i , @WebServlet tanimi gibi JAX-WS icin deklarasyon yapiyoruz.

The @WebService annotation defines the class as a web service endpoint.

@SOAPBinding ile RPC style deklarasyon tanimi ekliyoruz.
Varsayila olarak Style.DOCUMENT tir.

WebService methodlari @WebMethod annotation’i kullaniyoruz.
@WebParam annotation’i ile WSDL dokumanindaki parametre ismini duzenliyoruz.
Varsayilan olarak arg0 dir.

Bu interface’e SEI (Service Endpoint Interface) adi verilmektedir. Bu interface’in implementation’ina ise SIB (Service Implementation Bean) adi verilmektedir.

JAX-WS end point tanimlamak icin  interface tanimlamak zorunlu degildir. Bununla birlikte hem SEI hem SIB tanimlamasini yapalim.

package service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style = Style.RPC)
public interface MessageWriter {

	@WebMethod
	public String getWelcomeMessage(@WebParam(name = "userName") String userName);
}

MessageWriterImpl.java
MessageWriterImpl class’i MessageWriter interface’ini implements etmektedir.
@WebService annotation’da endpointInterface attribute’te full name olarak veriyoruz.
Basit olarak metodumuz geriye bir String message donmektedir.

package service;

import javax.jws.WebService;

@WebService(endpointInterface = "service.MessageWriter")
public class MessageWriterImpl implements MessageWriter {

	@Override
	public String getWelcomeMessage(String name) {
		return "Welcome , " + name + ". This message is sent by MessageWriterImpl#getWelcomeMessage.";
	}

}

WebServicePublisher.java
Simdi de Publisher sinifimizi yazalim.
Web Service’imizi yayinlayacagimiz/publish URL adresini belirtiyoruz sonuna ?wsdl parametresi ekliyoruz.

javax.xml.ws.Endpoint publish metoduna ilgili Web Service URL bilgisini ve Web Service implementation olarak olusturdugumuz MessageWriterImpl objesini veriyoruz.

package publisher;

import javax.xml.ws.Endpoint;

import service.MessageWriterImpl;

public class WebServicePublisher {

	private static String WEB_SERVICE_URL = "http://localhost:8888/injavawetrust/hello.jaxws?wsdl";

	public static void main(String[] args) {
		Endpoint.publish(WEB_SERVICE_URL, new MessageWriterImpl());
		System.out.println("Web Service is started.");
	}

}

Ornegimizi calistirdigimizda basarili sekilde 8888 portunda Web Service publish edilecektir.

Web Service is started.

Web Service’in publish edildigi URL’e gidelim ve wsdl icerigini gorelim ;

http://localhost:8888/injavawetrust/hello.jaxws?wsdl
<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS 
	RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. -->
<!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS 
	RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. -->
<definitions
	xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
	xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
	xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:tns="http://service/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service/"
	name="MessageWriterImplService">
	<types />
	<message name="getWelcomeMessage">
		<part name="userName" type="xsd:string" />
	</message>
	<message name="getWelcomeMessageResponse">
		<part name="return" type="xsd:string" />
	</message>
	<portType name="MessageWriter">
		<operation name="getWelcomeMessage">
			<input wsam:Action="http://service/MessageWriter/getWelcomeMessageRequest"
				message="tns:getWelcomeMessage" />
			<output wsam:Action="http://service/MessageWriter/getWelcomeMessageResponse"
				message="tns:getWelcomeMessageResponse" />
		</operation>
	</portType>
	<binding name="MessageWriterImplPortBinding" type="tns:MessageWriter">
		<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
			style="rpc" />
		<operation name="getWelcomeMessage">
			<soap:operation soapAction="" />
			<input>
				<soap:body use="literal" namespace="http://service/" />
			</input>
			<output>
				<soap:body use="literal" namespace="http://service/" />
			</output>
		</operation>
	</binding>
	<service name="MessageWriterImplService">
		<port name="MessageWriterImplPort" binding="tns:MessageWriterImplPortBinding">
			<soap:address location="http://localhost:8888/injavawetrust/hello.jaxws" />
		</port>
	</service>
</definitions>

Client.java
Simdi de Client ornegimizi yazalim. yeni bir java.net.URL objesini olusturuyoruz ve Web Service’i publish ettigimiz URL bilgisini veriyoruz.

QName objesini olusturuyoruz targetSpace ve name bilgisini veriyoruz.
Sonrasinda javax.xml.ws.Service#create metoduna url ve qname bilgisini veriyoruz.
Burada dikkat edecek olursak SIB (Service Implementation Bean) isminin sonuna Service eki geldi.

MessageWriterImplService

getPort metoduna class literal bilgisini veriyoruz , sonrasinda getWelcomeMessage i invoke ediyoruz.

package client;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import service.MessageWriter;

//1- run the WebServicePublisher
//2- test Client.java

public class Client {
	private static String WEB_SERVICE_WSDL_URL = "http://localhost:8888/injavawetrust/hello.jaxws?wsdl";

	public static void main(String[] args) throws MalformedURLException {

		URL url = new URL(WEB_SERVICE_WSDL_URL);
		QName qname = new QName("http://service/", "MessageWriterImplService");
		Service service = Service.create(url, qname);

		MessageWriter hello = service.getPort(MessageWriter.class);

		String welcomeMessage = hello.getWelcomeMessage("Levent");
		System.out.println(welcomeMessage);
	}
}

Ornegimizi calistirdigimizda ;

Welcome , Levent. This message is sent by MessageWriterImpl#getWelcomeMessage.

Github kaynak kodlar / source folder
injavawetrust-jaxws-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *