spring -ws是基于契约先行(contract first)的原则实现的web service。
自从JDK1.5的annotation出现以后,我偏向于写注解而不写xml,所以我在项目中尽量写注解来替代xml
闲话少说。动手做。
必备包:spring.jar ; spring-ws-1.5.8-all.jar ; wsdl4j-1.6.1.jar ; spring-mvc-2.5.6.jar;
XmlSchema-1.4.3.jar ; commons-logging-1.1.1.jar
spring-ws是契约先行,先写wsdl文件的内容,然后生成所需要的java类。
而wsdl是由包含请求和返回以及数据xsd文件,使用spring-ws生成的。
这里演示一个简单的spring-ws
一个人客户端输入自己的卡号,返回这个人的所有信息。
xsd文件(workerInfo.xsd)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="
http://www.w3.org/2001/XMLSchema
"
xmlns:tns="
http://ajjws.com/schemas/workerinfo
"
elementFormDefault="qualified"
targetNamespace="
http://ajjws.com/schemas/workerinfo
">
<!--查询请求,输入的是一个字符串的证件号码CardNo-->
<xs:element name="WorkerRequest">
<xs:complexType>
<xs:all>
<xs:element name="CardNo" type="xs:string" />
</xs:all>
</xs:complexType>
</xs:element>
<!--数据返回,返回的是一个WorkerInfo数据类型-->
<xs:element name="WorkerResponse">
<xs:complexType>
<xs:all>
<xs:element name="WorkerResponse" type="tns:WorkerInfo" />
</xs:all>
</xs:complexType>
</xs:element>
<!--WorkerInfo数据类型其实就是一个Java类,由下面几个属性组成-->
<xs:complexType name="WorkerInfo">
<xs:sequence>
<xs:element name="id" type="xs:long"></xs:element>
<xs:element name="cardNo" type="xs:string"></xs:element>
<xs:element name="workerName" type="xs:string"></xs:element>
<xs:element name="workerSex" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
对于spring-ws要配置的地方有
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
" xmlns="
http://java.sun.com/xml/ns/javaee
" xmlns:web="
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
" xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
" id="WebApp_ID" version="2.5">
<display-name>ajjws</display-name>
<servlet>
<servlet-name>ajjws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ajjws</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
ajjws-servlet.xml:(名称和web.xml的servlet-name相同)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="
http://www.springframework.org/schema/beans
"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
"
xmlns:context="
http://www.springframework.org/schema/context
"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
<!--对com.ajjws下的包里的类自动扫描,从而不用定义文件中bean,在类中使用@Service@component等-调用时候使用@Resource或者@AutoWired->
<context:annotation-config/>
<context:component-scan base-package="com.ajjws"/>
<!--指定xsd文件的地址-->
<bean id="schemaCollection" class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
<property name="xsds">
<list>
<value>/WEB-INF/xsds/workerInfo.xsd</value>
</list>
</property>
<property name="inline" value="true"/>
</bean>
<bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">
<constructor-arg ref="marshaller" />
</bean>
<!--利用Jaxb2实现xml到Java的转换-->
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="com.ajjws.beans" />
</bean>
<!--申明我们用注解来实现请求和Endpoint的映射对应-->
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"/>
<!--通过xsd文件定义wsdl-->
<bean id="ajjws" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
<property name="schemaCollection" ref="schemaCollection" />
<property name="portTypeName" value="Ajj" />
<property name="locationUri" value="
http://localhost:8080/ajjws/services
" />
<property name="targetNamespace" value="
http://ajjws.com/definitions
" />
</bean>
</beans>
安装jaxb eclipse插件,在xsd文件上点右键,选择jaxb2.1->run xjc
运行后会在com.ajjws.bean包下通过xsd文件生成的java类
如下所示:
Endpoint:(AjjwsEndpoint.java 响应web service的请求的文件)
package com.ajjws.ws;
import javax.annotation.Resource;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import com.ajjws.beans.ObjectFactory;
import com.ajjws.beans.WorkerInfo;
import com.ajjws.beans.WorkerRequest;
import com.ajjws.beans.WorkerResponse;
import com.ajjws.service.AjjService;
/**
* @author wyf
*
*/
@Endpoint
public class AjjwsEndpoint {
@Resource
private AjjService ajjService;//需配置自动扫描bean
@Resource
private ObjectFactory objectFactory;
@PayloadRoot(localPart="WorkerRequest",namespace="
http://ajjws.com/schemas/workerinfo
")
public WorkerResponse getWorkInfo(WorkerRequest request) {
WorkerResponse response=objectFactory.createWorkerResponse();
WorkerInfo workerInfo=ajjService.getWorkInfo(request.getCardNo());
response.setWorkerResponse(workerInfo);
return response;
}
}
AjjService.java:
package com.ajjws.service;
import com.ajjws.beans.WorkerInfo;
public interface AjjService {
/**
* 获取证件信息
*/
public WorkerInfo getWorkInfo(String cardNo);
}
AjjServiceImpl.java
package com.ajjws.service;
import org.springframework.stereotype.Service;
import com.ajjws.beans.WorkerInfo;
/**
* @author wyf
*
*/
@Service("ajjService")
public class AjjServiceImpl implements AjjService {
public WorkerInfo getWorkInfo(String cardNo) {
//此处仅为演示,为加入数据库
System.out.println(cardNo);
WorkerInfo worker=new WorkerInfo();
worker.setCardNo("1234");
worker.setId(1);
worker.setWorkerName("wyf");
worker.setWorkerSex("男");
return worker;
}
}
客户端使用eclipse本身自带的生成web service client
点击finish,通过wsdl生成客户端所需要的Java类
结构如下
客户端调用代码:
package com.ajjSearch.web;
import java.rmi.RemoteException;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import com.ajjws.definitions.AjjProxy;
import com.ajjws.schemas.workerinfo.WorkerInfo;
import com.ajjws.schemas.workerinfo.WorkerRequest;
import com.ajjws.schemas.workerinfo.WorkerResponse;
public class WsClient extends WebServiceGatewaySupport{
public static void main(String[] args) throws RemoteException {
doSomething();
}
public static void doSomething() throws RemoteException{
WorkerRequest wreq=new WorkerRequest("1111");
WorkerResponse wres=new AjjProxy().getAjj().worker(wreq);
System.out.println(wres.getWorkerResponse());
WorkerInfo wi=wres.getWorkerResponse();
System.out.println(wi.getCardNo()+" "+wi.getId()+" "+wi.getWorkerName()+" "+wi.getWorkerSex());
}
}
分享到:
相关推荐
总结起来,本示例展示了如何使用Spring、Spring-WS和Maven构建一个简单的Web Service服务端。从定义XML Schema到创建服务接口、实现业务逻辑、配置Spring-WS Servlet,每一个步骤都是为了使Web Service能够正确地...
1. **Spring-WS核心概念**:在Spring-WS中,服务端通常通过XML Schema定义其接口,然后Spring-WS会自动生成一个处理XML消息的Endpoint。这个Endpoint对应于WSDL中的操作。在本示例中,可能有一个或多个XML Schema...
通过Spring,我们可以轻松地集成Web Service客户端和服务端,并且管理其生命周期。 **创建Web Service** 1. **定义服务接口**:首先,我们需要定义一个Java接口,该接口将代表Web Service的契约。接口中的方法将...
总结,本教程详细介绍了如何利用Spring Boot和Apache CXF搭建Web Service服务端,以及使用JAX-WS的`javax.xml.ws.Service`和Apache CXF的`JaxWsProxyFactoryBean`两种方式实现Java客户端调用。这些技能对于开发者来...
本示例将详细介绍如何使用Apache CXF和Spring框架来开发基于HTTPS的安全Web服务,包括服务端和客户端的实现。 Apache CXF是一个开源的Java框架,它支持创建和消费各种Web服务,包括SOAP和RESTful API。而Spring框架...
1. `conf`目录可能包含了服务端和客户端的配置文件,如Spring配置文件,用于配置CXF的服务发布和客户端消费。 2. 在服务端,可能包含服务的bean定义,如服务实现类的bean,以及服务发布配置。 3. 客户端配置可能包括...
具体到这个压缩包文件 `SpringWebService`,可能包含了完整的 Spring WS 示例项目,包括服务端和客户端的源代码,你可以通过解压并导入到 IDE 中运行来进一步学习。 通过这个小示例,你可以掌握 Spring WS 的基本...
它允许开发者以Java注解或XML方式定义服务接口,并提供了丰富的客户端和服务端工具。 3. **整合过程** - 首先,我们需要在`pom.xml`中添加CXF和SpringBoot的相关依赖。 - 创建一个服务接口,使用JAX-WS注解如`@...
总结,"webService简单示例及开发文档"旨在引导开发者理解并实践Java中的Web服务开发,通过实例和文档,可以掌握从创建、部署到调用Web服务的全过程。"TheService.rar"可能是包含更复杂示例或工具的压缩包,进一步...
本项目"spring-ws-cxf-server.rar"是一个综合性的示例,展示了如何利用Spring框架、Apache CXF、MyBatis以及MySQL数据库,构建一个能够处理XML和JSON格式数据的服务器端工程,并实现客户端的交互访问。接下来,我们...
这是一个非常实用的指南,旨在帮助开发者快速掌握Webservice的创建、部署和测试过程,特别适合初学者及有一定经验的Java程序员。 1. **MyEclipse 6.5**: MyEclipse是一款强大的集成开发环境(IDE),它是Eclipse...
在本例中,它可能是通过Spring-WS创建的一个简单的WebService示例,用于展示如何在Spring框架中设置和调用WebService。 “zai myeclipse加上jar,可以直接运行的”这部分意味着,项目是在MyEclipse集成开发环境中...
在提供的压缩包文件“webService服务接口方案”中,可能包含了具体的代码示例、配置文件和其他参考资料,这些都可以帮助你更好地理解和实践上述步骤。记得根据自己的项目需求进行适当的修改和调整。同时,参考其他...
本实例将深入探讨如何构建一个Android Web Service客户端和服务端,并提供可直接运行的代码示例。以下是对这两个重要组件的详细说明。 **一、Android Web Service客户端** 在Android客户端,通常使用HTTP库来调用...
总结,这个例子是一个很好的学习资源,它覆盖了CXF框架下Web服务端和客户端的创建、参数传递、测试等核心知识点。对于初学者而言,通过实践这个demo,可以深入理解Web服务的工作原理,以及CXF框架的使用方式。在实际...
"spring-webservice-example"项目恰好为我们提供了一个基于Spring框架构建Web服务的实例,这将帮助我们深入理解Spring如何处理Web服务的创建和交互。以下是对该项目的详细解析。 首先,我们要明确的是,Web服务是一...
服务端可能包含一个`@WebService`注解的接口和对应的实现类,而客户端则会有一个`Service`类,通过`wsimport`工具生成,用于实例化并调用服务。 在实际应用中,Spring框架的其他特性也可以与Webservice集成,例如...
【标题】"cxf_spring 服务端和客户端demo"主要涵盖了使用Apache CXF与Spring框架结合实现Web服务(Web Service)的示例。Apache CXF是一个开源的Java框架,它用于构建和开发服务端和客户端的Web服务,而Spring框架则...
Spring框架提供了两种主要的方式来实现Web服务:Spring-WS和Spring-Integration的Web服务支持。在这个场景中,描述中提到的是基于Apache Axis的实现,这可能涉及到Spring与Apache Axis的集成,Axis是一个流行的SOAP...
CXF会自动处理这些复杂类型的序列化和反序列化,使得服务端和客户端之间能够顺利交换数据。 综上所述,这个CXF Webservice示例工程涵盖了Spring集成、Web服务安全、大文件传输优化以及不同类型数据的处理,是学习和...