肥皂Web服务在Java中可以以多种方式开发。我们在上一教程中学习了
Java中的SOAP Web服务
我在本教程中使用的是
SOAP Web服务示例
开始吧,让我们从在Eclipse中创建SOAP Web服务的示例开始。首先,我们将在Eclipse中创建一个简单的动态Web项目,其中包含我们应用程序的业务逻辑。 点击上面的“下一步”按钮,您将进入下一个页面以提供您的Web项目名称和目标运行时。请注意,我正在使用Apache Tomcat 8,您也可以使用其他标准的servlet容器。
点击“下一步”,将要求您提供“上下文根”和内容目录位置。您可以将它们保留为默认值。
点击“完成”,Eclipse将为您创建项目框架。让我们开始处理业务逻辑。因此,对于我们的示例,我们希望发布一个Web服务,该服务可用于添加/删除/获取对象。因此,第一步是创建一个模型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;
}
}
请注意上面是一个简单的Java Bean,我们实现了Serializable
接口,因为我们将通过网络传输它。我们还提供了toString
方法的实现,当我们在客户端打印此对象时将会使用它。下一步是创建服务类,所以我们将会有一个名为PersonService
的接口和它的简单实现类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();
}
以下是实现服务类,我们使用Map来存储Person对象作为数据源。在真实的编程中,我们希望将它们保存到数据库表中。
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;
}
}
这就是我们的业务逻辑,因为我们将在一个web服务中使用它们,所以在这里创建web页面没有意义。请注意,上面的代码中没有任何关于web服务类的引用。
使用Eclipse在Java中进行SOAP Web服务
一旦我们的业务逻辑准备好,下一步就是使用Eclipse从中创建一个Web服务应用程序。 创建一个新项目并选择Web服务向导。 单击“下一步”按钮,您将进入一个页面,其中必须提供Web服务及其客户端详细信息。 这是创建Web服务最重要的页面。 确保您选择“Web服务类型”为“自下而上的Java Bean Web服务”,因为我们正在采用自下而上的方法实施。 创建Web服务有两种方法:
- 合同后或自下而上的方法: 在这种方法中,我们首先创建实现,然后从中生成WSDL文件。 我们的实现属于这一类别。
- 先合同或自上而下的方法: 在这种方法中,我们首先创建Web服务合同,即WSDL文件,然后为其创建实现。
在服务实现中,提供完全分类路径的实现类PersonServiceImpl
。确保将服务和客户端类型滑块移动到左侧,以便它可以生成客户端程序,还可以生成用于测试我们的 Web 服务的 UI。检查 Web 服务实现中的配置,您应该提供正确的服务器运行时、Web 服务运行时和服务项目的详细信息。通常它们会自动填充,您不需要在这里进行任何更改。对于客户端配置,您可以根据需要提供客户端项目名称。我将其默认为SOAPExampleClient
。如果您单击 Web 服务运行时的链接,您将会看到不同的选项,如下图所示。但我已将其保留为默认值。单击“下一步”按钮,然后您将能够选择要公开为 Web 服务的方法。您还可以选择 Web 服务风格,可以是文档或直接。您可以更改 WSDL 文档名称,但最好将其与实现类名称一致,以免以后产生混淆。
单击“下一步”按钮,您将获得服务器启动页面,单击“启动服务器”按钮,然后下一个按钮将启用。
单击“下一步”按钮,您将获得一个页面来启动“Web Services Explorer”。
单击“启动”按钮,它将在浏览器中打开一个新窗口,您可以在其中测试 Web 服务,然后再进行客户端应用程序部分。对于我们的项目,它看起来像下面的图片。
我们可以在这里进行一些基本测试,但对于我们的简单应用程序,我已准备好继续创建客户端应用程序。在 Eclipse Web Services 弹出窗口中单击“下一步”按钮,您将获得用于客户端应用程序的源文件夹页面。
单击“下一步”按钮,您将获得不同的选项可供选择作为测试设施。我将继续使用JAX-RPC JSPs,以便客户端应用程序将生成我们可以使用的 JSP 页面。
请注意添加了
getEndpoint()
和setEndpoint(String)
方法,我们可以使用它们来获取 Web 服务端点 URL,并且在将服务器移动到其他 URL 端点时,我们可以将其设置为其他 URL。单击“完成”按钮,Eclipse 将在您的工作空间中创建客户端项目,它还将启动客户端测试 JSP 页面,如下所示。您可以复制 URL 并在您喜欢的任何浏览器中打开。让我们测试一些我们已公开的服务,并查看输出。
Eclipse SOAP Web Service测试
-
getAllPersons
请注意,结果部分未打印出个人详细信息,这是因为它是自动生成的代码,我们需要稍微重构一下以获得所需的输出。打开客户端项目中的Result.jsp,您将看到它在使用switch case生成结果输出。对于getAllPersons()方法,在我的情况下,它是case 42。请注意,在您的情况下可能完全不同。我只是按照下面的方式更改了case 42的代码。
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;
所以看起来我们的Web服务和客户端应用程序都运行正常,请花些时间查看Eclipse生成的客户端存根,以便更好地理解。
SOAP Web服务WSDL和配置
最后,你会注意到WSDL文件在Web服务项目中生成如下。PersonServiceImpl.wsdl代码:
<?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>
如果你在Eclipse的设计模式中打开它,它将会看起来像下面的图片。 你也可以通过在浏览器中附加?wsdl到web服务的端点来访问web服务的WSDL文件。
你还会注意到,web.xml被修改以将Apache Axis用作web服务的前端控制器。
<?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>
下面的图片显示了web服务和客户端项目,包括所有自动生成的存根和用于测试web服务的JSP页面。
这就是关于使用Eclipse进行Java中SOAP Web服务的示例的全部内容,正如你所看到的,所有繁重的工作都是由Eclipse自动完成的,我们的所有关注点都是为我们的web服务编写业务逻辑。
Source:
https://www.digitalocean.com/community/tutorials/soap-webservices-in-java-example-eclipse