Рубрики
Без рубрики

Учебник по JAX-WS

Учебник по JAX-WS. Пример JAX-WS. Пример руководства по веб-службам JAX WS SOAP. JAX-WS WSDL, wsimport. Клиентская программа JAX WS. Пример руководства по Java SOAP.

Автор оригинала: Pankaj Kumar.

Добро пожаловать в учебник JAX-WS. Веб-службы работают по модели клиент-сервер, где они взаимодействуют по сети. Компонент на стороне сервера предоставляет URL-адрес конечной точки, где находится служба, и клиентское приложение может вызывать различные методы.

Существует два типа веб – сервисов:

  1. Веб-службы SOAP
  2. Веб-службы Restful

Учебник по JAX-WS

В этом руководстве по JAX-WS мы будем использовать JAX-WS для создания веб-сервисов на основе SOAP. Но сначала мы рассмотрим некоторые жаргонные слова, используемые в веб-сервисах SOAP.

МЫЛО

SOAP расшифровывается как Простой протокол доступа к объектам. SOAP-это стандартный отраслевой протокол на основе XML для проектирования и разработки веб-сервисов. Поскольку он основан на XML, он не зависит от платформы и языка. Таким образом, наш сервер может быть основан на JAVA, а клиент может быть на .NET, PHP и т.д., И наоборот.

WSDL

WSDL расшифровывается как Язык описания веб-служб. WSDL-это документ на основе XML, в котором содержатся технические сведения о веб-службе. Некоторые полезные сведения в документе WSDL: имя метода, типы портов, конечная точка службы, привязка, параметры метода и т.д.

UDDI

UDDI-это аббревиатура для универсального описания, обнаружения и интеграции. UDDI-это каталог веб-служб, в котором клиентские приложения могут искать веб-службы. Веб – службы могут зарегистрироваться на сервере UDDI и сделать их доступными для клиентских приложений.

Преимущества веб – сервисов

Некоторые из преимуществ веб-сервисов заключаются в следующем:

  • Совместимость: Поскольку веб-службы работают по сети и используют технологию XML для взаимодействия, они могут быть разработаны на любом языке программирования, поддерживающем разработку веб-служб.
  • Возможность повторного использования: Одна веб-служба может использоваться многими клиентскими приложениями одновременно. Например, мы можем предоставить веб-сервис для технического анализа акций, и он может использоваться всеми банками и финансовыми учреждениями.
  • Слабая связь: код клиента веб-служб полностью независим от кода сервера, поэтому мы добились слабой связи в нашем приложении. Это приводит к простоте обслуживания и простоте расширения.
  • Простота развертывания и интеграции
  • Одновременно может быть запущено несколько версий службы.

JAX-WS

JAX-WS расшифровывается как Java API для веб-служб XML. JAX-WS-это Java-API на основе XML для создания серверных и клиентских приложений веб-служб. Это часть стандартного Java API, поэтому нам не нужно включать что-либо еще, что работает с ним.

Пример JAX-WS

Теперь, когда мы рассмотрели терминологию веб-служб, давайте продолжим и создадим веб-службу JAX-WS. Мы создадим веб-службу, которая будет предоставлять методы для добавления, удаления и получения объектов person. Поэтому прежде всего мы создадим компонент модели для наших данных.

Теперь, когда мы рассмотрели терминологию веб-служб, давайте продолжим и создадим веб-службу JAX-WS. Мы создадим веб-службу, которая будет предоставлять методы для добавления, удаления и получения объектов person. Поэтому прежде всего мы создадим компонент модели для наших данных.

package com.journaldev.jaxws.beans;

import java.io.Serializable;

public class Person implements Serializable{

	private static final long serialVersionUID = -5577579081118070434L;
	
	private String name;
	private int age;
	private int id;

	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 int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	@Override
	public String toString(){
		return id+"::"+name+"::"+age;
	}

}

Теперь нам нужно будет создать интерфейс, в котором мы объявим методы, которые мы представим в нашем примере веб-служб JAX-WS.

Теперь нам нужно будет создать интерфейс, в котором мы объявим методы, которые мы представим в нашем примере веб-служб JAX-WS.

package com.journaldev.jaxws.service;

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

import com.journaldev.jaxws.beans.Person;

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

	@WebMethod
	public boolean addPerson(Person p);
	
	@WebMethod
	public boolean deletePerson(int id);
	
	@WebMethod
	public Person getPerson(int id);
	
	@WebMethod
	public Person[] getAllPersons();
}

Обратите внимание на использование @WebService и @SOAPBinding аннотаций из API JAX-WS. Мы можем создавать веб-сервисы SOAP в стиле RPC или стиле документа . Мы можем использовать любой из этих стилей для создания веб-сервисов, разница видна в том, как создается файл WSDL.

Теперь мы напишем класс реализации, как показано ниже.

Теперь мы напишем класс реализации, как показано ниже.

package com.journaldev.jaxws.service;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.jws.WebService;

import com.journaldev.jaxws.beans.Person;

@WebService(endpointInterface = "com.journaldev.jaxws.service.PersonService")  
public class PersonServiceImpl implements PersonService {

	private static Map persons = new HashMap();
	
	@Override
	public boolean addPerson(Person p) {
		if(persons.get(p.getId()) != null) return false;
		persons.put(p.getId(), p);
		return true;
	}

	@Override
	public boolean deletePerson(int id) {
		if(persons.get(id) == null) return false;
		persons.remove(id);
		return true;
	}

	@Override
	public Person getPerson(int id) {
		return persons.get(id);
	}

	@Override
	public Person[] getAllPersons() {
		Set ids = persons.keySet();
		Person[] p = new Person[ids.size()];
		int i=0;
		for(Integer id : ids){
			p[i] = persons.get(id);
			i++;
		}
		return p;
	}

}

Наиболее важной частью является @WebService аннотация, в которой мы предоставляем endpointInterface значение в качестве интерфейса, который у нас есть для нашего веб-сервиса. Таким образом, JAXW знают, какой класс использовать для реализации при вызове методов веб-службы.

Наша бизнес-логика веб-сервиса готова, давайте продолжим и опубликуем ее с помощью класса конечных точек JAX-WS.

Наша бизнес-логика веб-сервиса готова, давайте продолжим и опубликуем ее с помощью класса конечных точек JAX-WS.

package com.journaldev.jaxws.service;

import javax.xml.ws.Endpoint;

public class SOAPPublisher {

	public static void main(String[] args) {
		 Endpoint.publish("https://localhost:8888/ws/person", new PersonServiceImpl());  
	}

}

Просто запустите вышеуказанную программу, и ваш веб-сервис будет опубликован в данной конечной точке программы. Мы можем получить доступ к его документу WSDL, добавив ?wsdl к URL конечной точки, как показано на рисунке ниже.

Вот код WSDL, мы будем использовать некоторые из этих значений при написании клиентского кода.

Вот код WSDL, мы будем использовать некоторые из этих значений при написании клиентского кода.




























































































Вот клиентская программа, в которой мы вызываем наш пример веб-службы JAX-WS.

Вот клиентская программа, в которой мы вызываем наш пример веб-службы JAX-WS.

package com.journaldev.jaxws.service;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import com.journaldev.jaxws.beans.Person;

public class SOAPPublisherClient {

	public static void main(String[] args) throws MalformedURLException {
		URL wsdlURL = new URL("https://localhost:8888/ws/person?wsdl");
		//check above URL in browser, you should see WSDL file
		
		//creating QName using targetNamespace and name
		QName qname = new QName("https://service.jaxws.journaldev.com/", "PersonServiceImplService"); 
		
		Service service = Service.create(wsdlURL, qname);  
		
		//We need to pass interface and model beans to client
		PersonService ps = service.getPort(PersonService.class);
		
		Person p1 = new Person(); p1.setName("Pankaj"); p1.setId(1); p1.setAge(30);
		Person p2 = new Person(); p2.setName("Meghna"); p2.setId(2); p2.setAge(25);
		
		//add person
		System.out.println("Add Person Status="+ps.addPerson(p1));
		System.out.println("Add Person Status="+ps.addPerson(p2));
		
		//get person
		System.out.println(ps.getPerson(1));
		
		//get all persons
		System.out.println(Arrays.asList(ps.getAllPersons()));
		
		//delete person
		System.out.println("Delete Person Status="+ps.deletePerson(2));
		
		//get all persons
		System.out.println(Arrays.asList(ps.getAllPersons()));
		
	}

}

Когда мы выполняем вышеописанную клиентскую программу JAX-WS, мы получаем этот вывод.

Add Person Status=true
Add Person Status=true
1::Pankaj::30
[1::Pankaj::30, 2::Meghna::25]
Delete Person Status=true
[1::Pankaj::30]

Когда я снова запускаю программу, мы получаем этот вывод.

Add Person Status=false
Add Person Status=true
1::Pankaj::30
[1::Pankaj::30, 2::Meghna::25]
Delete Person Status=true
[1::Pankaj::30]

Обратите внимание, что во втором запуске статус “Добавить человека” является ложным, поскольку он уже был добавлен в первом запуске.

Клиентская программа JAX-WS

Если вы посмотрите на приведенную выше программу, мы используем сам серверный код. Однако веб-службы просто предоставляют WSDL, а сторонние приложения не имеют доступа к этим классам. Поэтому в этом случае мы можем использовать утилиту wsimport для создания клиентских заглушек. Эта утилита поставляется со стандартной установкой JDK. На рисунке ниже показано, какие все классы java мы получаем при запуске этой утилиты.

Просто скопируйте эти классы в свой клиентский проект, единственное изменение будет заключаться в том, как мы получим Person Service экземпляр.

Ниже приведена программа для этого, вывод будет таким же, как и в приведенной выше клиентской программе. Обратите внимание на использование Службы PersonServiceImpl класса и его метода getPersonServiceImplPort для получения экземпляра PersonService.

Ниже приведена программа для этого, вывод будет таким же, как и в приведенной выше клиентской программе. Обратите внимание на использование || Службы PersonServiceImpl || класса и его метода || getPersonServiceImplPort || для получения экземпляра PersonService.

package com.journaldev.jaxws.service.test;

import java.util.Arrays;

import com.journaldev.jaxws.service.Person;
import com.journaldev.jaxws.service.PersonService;
import com.journaldev.jaxws.service.PersonServiceImplService;

public class TestPersonService {

	public static void main(String[] args) {
		
		PersonServiceImplService serviceImpl = new PersonServiceImplService();
		
		PersonService service = serviceImpl.getPersonServiceImplPort();
		
		Person p1 = new Person(); p1.setName("Pankaj"); p1.setId(1); p1.setAge(30);
        Person p2 = new Person(); p2.setName("Meghna"); p2.setId(2); p2.setAge(25);
        
        System.out.println("Add Person Status="+service.addPerson(p1));
        System.out.println("Add Person Status="+service.addPerson(p2));
        
      //get person
        System.out.println(service.getPerson(1));
         
        //get all persons
        System.out.println(Arrays.asList(service.getAllPersons()));
         
        //delete person
        System.out.println("Delete Person Status="+service.deletePerson(2));
         
        //get all persons
        System.out.println(Arrays.asList(service.getAllPersons()));
        
	}

}

Это все для краткого руководства по JAX-WS.