SOAP-webservices in Java kunnen op verschillende manieren worden ontwikkeld. We hebben geleerd over JAX-WS SOAP-webservices in onze laatste tutorial, vandaag zullen we leren hoe we een SOAP-webservice en het bijbehorende clientprogramma kunnen maken met behulp van Eclipse. Hier zullen we geen gebruik maken van JAX-WS, maar in plaats daarvan zullen we Apache Axis gebruiken, dat is geïntegreerd in Eclipse en een snelle en eenvoudige manier biedt om een applicatie om te zetten in een Java-webservice en client-stubs te maken met een test JSP-pagina voor testdoeleinden.
SOAP-webservices in Java
Ik gebruik Eclipse Mars Release (4.5.0) voor deze tutorial, maar ik denk dat deze stappen ook zullen werken met oudere versies van Eclipse. Zorg er ook voor dat je Apache Tomcat of een andere servletcontainer hebt toegevoegd als server in Eclipse. Laten we nu beginnen met onze Eclipse-webservice-implementatie.
Voorbeeld van een SOAP-webservice
Laten we beginnen met ons voorbeeld van een SOAP-webdienst in Eclipse. Allereerst zullen we een eenvoudig Dynamisch webproject in Eclipse maken dat de bedrijfslogica voor onze toepassing zal bevatten. Klik op de knop Volgende hierboven en u krijgt de volgende pagina om uw webprojectnaam en Doelruntime op te geven. Let op dat ik Apache Tomcat 8 gebruik, u kunt ook een andere standaard servletcontainer gebruiken.
Klik op Volgende en u wordt gevraagd om “Context Root” en de locatie van de inhoudsmap op te geven. U kunt ze als standaard laten.
Klik op Voltooien en Eclipse zal het projectskelet voor u maken. Laten we nu beginnen met onze bedrijfslogica. Dus voor ons voorbeeld willen we een webservice publiceren die kan worden gebruikt om een object toe te voegen/te verwijderen/op te halen. De eerste stap is dus het maken van een model bean.
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;
}
}
Let’s translate the provided text to Dutch:
—
Noticeer dat bovenstaande een eenvoudige Java bean is, we implementeren de Serializable
interface omdat we deze over het netwerk zullen transporteren. We hebben ook de toString
methode geïmplementeerd die zal worden gebruikt wanneer we dit object aan de clientzijde afdrukken. Het volgende stap is het maken van service klassen, dus we zullen een interface hebben als PersonService
en zijn eenvoudige implementatieklasse PersonServiceImpl
.
package com.journaldev.jaxws.service;
import com.journaldev.jaxws.beans.Person;
public interface PersonService {
public boolean addPerson(Person p);
public boolean deletePerson(int id);
public Person getPerson(int id);
public Person[] getAllPersons();
}
Hieronder staat de implementatie van de serviceklasse, we gebruiken Map om Person objecten op te slaan als gegevensbron. In het echte programmeringswereld, zouden we deze willen opslaan in databasetabellen.
package com.journaldev.jaxws.service;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.journaldev.jaxws.beans.Person;
public class PersonServiceImpl implements PersonService {
private static Map<Integer,Person> persons = new HashMap<Integer,Person>();
@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<Integer> ids = persons.keySet();
Person[] p = new Person[ids.size()];
int i=0;
for(Integer id : ids){
p[i] = persons.get(id);
i++;
}
return p;
}
}
Dat is het voor onze bedrijfslogica, aangezien we deze zullen gebruiken in een webservice, heeft het geen zin om hier webpagina’s te maken. Merk op dat we geen verwijzing hebben naar enige vorm van webservices-klassen in de bovenstaande code.
SOAP-webservices in Java met behulp van Eclipse
—
There you go, the text has been translated to Dutch.
Zodra onze bedrijfslogica gereed is, is de volgende stap om Eclipse te gebruiken om een webdiensttoepassing hiervan te maken. Maak een nieuw project aan en selecteer de Web Service-wizard. Klik op de knop Volgende en u krijgt een pagina waar de gegevens van de webdienst en de cliënt moeten worden verstrekt. Dit is de belangrijkste pagina bij het maken van een webdienst. Zorg ervoor dat u “Type webdienst” selecteert als “Bottom-up Java Bean-webdienst”, omdat we deze met de bottom-up-benadering implementeren. Er zijn twee manieren om een webdienst te maken:
- Contract last of Bottom-up-benadering: In deze benadering maken we eerst de implementatie en genereren vervolgens het WSDL-bestand ervan. Onze implementatie valt in deze categorie.
- Contract first of Top-Down-benadering: In deze benadering maken we eerst het contract van de webdienst, d.w.z. het WSDL-bestand, en maken we vervolgens de implementatie ervoor.
In de service-implementatie, geef het volledig geclassificeerde pad van de implementatieklasse
PersonServiceImpl
. Zorg ervoor dat je de schuifregelaar aan de linkerzijde verplaatst voor zowel het service- als het clienttype, zodat het clientprogramma en ook de UI kunnen worden gegenereerd om onze webservice te testen. Controleer de configuraties in de implementatie van de webservice, je moet de juiste details verstrekken voor Server-runtime, Webservice-runtime en serviceproject. Normaal gesproken worden ze automatisch ingevuld en hoef je hier geen wijzigingen aan te brengen. Voor clientconfiguraties kun je de clientprojectnaam opgeven zoals je wilt. Ik heb het standaard gelaten als SOAPExampleClient
. Als je op de link voor de webservice-runtime klikt, krijg je verschillende opties zoals getoond in de onderstaande afbeelding. Ik heb het echter als de standaard gelaten. Klik op de knop Volgende en dan kun je de methoden kiezen die je als webservice wilt blootstellen. Je kunt ook de webservice-stijl kiezen als document of letterlijk. Je kunt de naam van het WSDL-document wijzigen, maar het is goed om het met de implementatieklasse-naam te hebben om verwarring later te voorkomen.
Klik op de knop Volgende en je krijgt de serverstartpagina, klik op de knop “Start server” en dan wordt de volgende knop ingeschakeld.
Klik op de knop Volgende en je krijgt een pagina om de “Web Services Explorer” te starten.
Klik op de knop Starten en er wordt een nieuw venster in de browser geopend waar je je webservice kunt testen voordat je verder gaat met het maken van de clienttoepassing. Het ziet eruit als de onderstaande afbeelding voor ons project.
We kunnen hier wat sanity-testing doen, maar voor onze eenvoudige toepassing ben ik klaar om door te gaan met het maken van de clienttoepassing. Klik op de knop Volgende in het Eclipse-webservice-pop-upvenster en je krijgt een pagina voor de map met bronnen voor de clienttoepassing.
Klik op de knop Volgende en je krijgt verschillende opties om te kiezen als testfaciliteit. Ik ga verder met JAX-RPC JSP’s zodat de clienttoepassing een JSP-pagina genereert die we kunnen gebruiken.
Let op de methoden
getEndpoint()
en setEndpoint(String)
die zijn toegevoegd en die we kunnen gebruiken om de URL van het webservice-eindpunt op te halen en in te stellen op een andere URL in het geval dat we ons servereindpunt naar een andere URL verplaatsen. Klik op de knop Voltooien en Eclipse zal het clientproject in je werkruimte maken, het zal ook de clienttest JSP-pagina starten zoals hieronder getoond. Je kunt de URL kopiëren en openen in elke browser die je wilt. Laten we enkele van de services die we hebben blootgesteld testen en de output bekijken.
Test voor Eclipse SOAP-webdiensten
-
getAllPersons
Let op dat persoonsgegevens niet worden afgedrukt in het resultaatgedeelte, dit komt doordat het automatisch gegenereerde code is en we het een beetje moeten herschrijven om de gewenste uitvoer te krijgen. Open Result.jsp in het clientproject en je zult zien dat het een switch-case gebruikt om de resultaatuitvoer te genereren. Voor de methode getAllPersons() was het in mijn geval case 42. Let op dat dit in jouw geval volledig anders kan zijn. Ik heb gewoon de code voor case 42 aangepast zoals hieronder weergegeven.
case 42: gotMethod = true; com.journaldev.jaxws.beans.Person[] getAllPersons42mtemp = samplePersonServiceImplProxyid.getAllPersons(); if(getAllPersons42mtemp == null){ %> <%=getAllPersons42mtemp %> <% }else{ String tempreturnp43 = null; if(getAllPersons42mtemp != null){ java.util.List<com.journaldev.jaxws.beans.Person> listreturnp43= java.util.Arrays.asList(getAllPersons42mtemp); //tempreturnp43 = listreturnp43.toString(); for(com.journaldev.jaxws.beans.Person p : listreturnp43){ int id = p.getId(); int age = p.getAge(); String name=p.getName(); %> <%=id%>::<%=name %>::<%=age %> <% } } } break;
Nadat we dat hebben gedaan, krijgen we de onderstaande uitvoer, let op dat Eclipse hier hot deployment uitvoert, dus ik hoefde mijn toepassing niet opnieuw te implementeren.
Het lijkt er dus op dat onze webdienst en clientapplicaties goed werken, zorg ervoor dat je wat tijd besteedt aan het bekijken van de clientzijde stubs die door Eclipse zijn gegenereerd om meer te begrijpen.
SOAP Web Service WSDL en Configuraties
Tenslotte zul je merken dat het WSDL-bestand is gegenereerd in het web service project zoals hieronder. PersonServiceImpl.wsdl code:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="https://service.jaxws.journaldev.com" xmlns:apachesoap="https://xml.apache.org/xml-soap" xmlns:impl="https://service.jaxws.journaldev.com" xmlns:intf="https://service.jaxws.journaldev.com" xmlns:tns1="https://beans.jaxws.journaldev.com" xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="https://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="https://service.jaxws.journaldev.com" xmlns="https://www.w3.org/2001/XMLSchema">
<import namespace="https://beans.jaxws.journaldev.com"/>
<element name="addPerson">
<complexType>
<sequence>
<element name="p" type="tns1:Person"/>
</sequence>
</complexType>
</element>
<element name="addPersonResponse">
<complexType>
<sequence>
<element name="addPersonReturn" type="xsd:boolean"/>
</sequence>
</complexType>
</element>
<element name="deletePerson">
<complexType>
<sequence>
<element name="id" type="xsd:int"/>
</sequence>
</complexType>
</element>
<element name="deletePersonResponse">
<complexType>
<sequence>
<element name="deletePersonReturn" type="xsd:boolean"/>
</sequence>
</complexType>
</element>
<element name="getPerson">
<complexType>
<sequence>
<element name="id" type="xsd:int"/>
</sequence>
</complexType>
</element>
<element name="getPersonResponse">
<complexType>
<sequence>
<element name="getPersonReturn" type="tns1:Person"/>
</sequence>
</complexType>
</element>
<element name="getAllPersons">
<complexType/>
</element>
<element name="getAllPersonsResponse">
<complexType>
<sequence>
<element maxOccurs="unbounded" name="getAllPersonsReturn" type="tns1:Person"/>
</sequence>
</complexType>
</element>
</schema>
<schema elementFormDefault="qualified" targetNamespace="https://beans.jaxws.journaldev.com" xmlns="https://www.w3.org/2001/XMLSchema">
<complexType name="Person">
<sequence>
<element name="age" type="xsd:int"/>
<element name="id" type="xsd:int"/>
<element name="name" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="addPersonResponse">
<wsdl:part element="impl:addPersonResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getAllPersonsResponse">
<wsdl:part element="impl:getAllPersonsResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="deletePersonResponse">
<wsdl:part element="impl:deletePersonResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="addPersonRequest">
<wsdl:part element="impl:addPerson" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getPersonResponse">
<wsdl:part element="impl:getPersonResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getPersonRequest">
<wsdl:part element="impl:getPerson" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="deletePersonRequest">
<wsdl:part element="impl:deletePerson" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getAllPersonsRequest">
<wsdl:part element="impl:getAllPersons" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="PersonServiceImpl">
<wsdl:operation name="addPerson">
<wsdl:input message="impl:addPersonRequest" name="addPersonRequest">
</wsdl:input>
<wsdl:output message="impl:addPersonResponse" name="addPersonResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="deletePerson">
<wsdl:input message="impl:deletePersonRequest" name="deletePersonRequest">
</wsdl:input>
<wsdl:output message="impl:deletePersonResponse" name="deletePersonResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getPerson">
<wsdl:input message="impl:getPersonRequest" name="getPersonRequest">
</wsdl:input>
<wsdl:output message="impl:getPersonResponse" name="getPersonResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getAllPersons">
<wsdl:input message="impl:getAllPersonsRequest" name="getAllPersonsRequest">
</wsdl:input>
<wsdl:output message="impl:getAllPersonsResponse" name="getAllPersonsResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="PersonServiceImplSoapBinding" type="impl:PersonServiceImpl">
<wsdlsoap:binding style="document" transport="https://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="addPerson">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="addPersonRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="addPersonResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="deletePerson">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="deletePersonRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="deletePersonResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getPerson">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getPersonRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getPersonResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getAllPersons">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getAllPersonsRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getAllPersonsResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="PersonServiceImplService">
<wsdl:port binding="impl:PersonServiceImplSoapBinding" name="PersonServiceImpl">
<wsdlsoap:address location="https://localhost:8080/SOAPExample/services/PersonServiceImpl"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Als je het in ontwerpmodus in Eclipse opent, zal het eruitzien als de onderstaande afbeelding. Je kunt ook toegang krijgen tot het WSDL-bestand van de webservice via de browser door ?wsdl toe te voegen aan het eindpunt van de webservice.
Je zult ook opmerken dat web.xml is aangepast om Apache Axis te gebruiken als frontcontroller voor de webservice.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>SOAPExample</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<display-name>Apache-Axis Servlet</display-name>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet>
<display-name>Axis Admin Servlet</display-name>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
</web-app>
De onderstaande afbeelding toont het webservice- en clientproject met alle automatisch gegenereerde stubs en JSP-pagina’s om de webservice te testen.
Dat is alles voor soap-webservices in Java voorbeeld met Eclipse, zoals je kunt zien, heeft Eclipse automatisch het meeste werk gedaan en lag onze focus op het schrijven van bedrijfslogica voor onze webservice.
Source:
https://www.digitalocean.com/community/tutorials/soap-webservices-in-java-example-eclipse