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搭建WebService服务端demo用例
spring-ws开发/调用webservice示例代码,包括xsd/wsdl,
使用cxf wsdl2java生成webservice客户端命令
Eclipse根据wsdl文件逆向生成webservice客户端项目源码,包括wsdl文件,测试示例,测试webservice代码,包含备注信息
jax-ws客户端与服务端工程.rar-------------
web工程中可以用Axist1.4 通过server-config.wsdd生服务端和客户端.普通的web工程需要相应的jar包,此实例中已经附带(所有的jar包都要)
soapui生成webservice客户端代码,比较详细的讲解了配置,以及生成客户端代码的步骤
NULL 博文链接:https://gjp014.iteye.com/blog/2332872
NULL 博文链接:https://7wolfs.iteye.com/blog/923629
使用eclipse生成webService服务端与客户端全过程
axis生成webservice服务端和客户端详细说明及实例
cxf生成webservice客户端
JAX-WS + Spring 实现webService示例
Eclipse开发WebService服务端实例。开发客户端代码。超级简单易懂的实例。
基于JAX-WS实现的WebService服务 资源包含的文件如下: 1、JAX-WS实现WebService文档 2、WebService服务端实现源码 3、WebService客户端实现源码
服务端采用jdk原生态的生成,客户端为了不需要采用命令行生成采用了axis2的document方法,可调用,代码中既有客户端又有服务端,亲测可用
3.这个服务端和客户端的小demo 在服务端 对外开放接口服务,然后在客户端 调用服务端的方法, 实现客户端(一个javaweb项目)对服务端(javaweb项目)方法的调用, 实际上就是发送和接收消息,实现两个系统间消息的...
MyEclipse基于JAX-WS开发Webservice+WebserviceClient客户端调用.zip
MyEclipse8_0中使用 JAX-WS 部署 WebService 实例 - 外衣 - 博客频道 - CSDN_NET.mht
vs2005控制台程序给予gsoap访问myeclipse8.x给予jax-ws的web service服务 在我的博客中,有详细的步骤描述