【JAVA】CXF+Spring上的webservice

  WebService可以将应用程序转换为网络应用程序。Web Services 可以被其他应用程序利用。基本的 Web Services 平台是 XML+HTTP。其作用是可以自主的开放接口给互联网中其他的用户,通过WSDL的描述方法来调用。
  在JAVA应用程序中,实现WebService应用的方法有一个叫做CXF框架。服务器端通过WSDL描述暴露其应用服务的接口,客户端采用SOAP协议生成请求,通过HTTP中的POST,发送给web服务器,web服务器将SOAP请求转发给WebService处理,WebService生成对应的SOAP应答后,再又通过web服务器通过HTTP应答的方式发回给客户端。
	20170801修改,工程文件增加了文件上传与下载功能。

【开发环境】

1、java开发工具,jdk-8u131-windows-x64.exe
2、spring开发IDE,sts-3.8.1.RELEASE
3、CXF框架工具包,apache-cxf-2.1
4、tomcat7.0工具包,tomcat7.0 for win64
5、本文用到的代码工程为两个,GitHub仓库,服务端  和  客户机
以上为windows环境,linux环境请联系博主,或自行搜索下载。

【开发流程】

1、安装好JDK环境、spring开发IDE、tomcat7.0。
2、在spring中部署tomcat7.0环境,如图1所示,新增一个服务,将tomcat目录加入Server环境中,这里采用tomcat7.0。

图1 springIDE中tomcat配置
3、新建Dynamic Web Project工程,命名为helloCXF,此处工程文件夹名影响后续web地址访问,web.xml勾选上。如图2所示。
新建web工程
图2 新建web工程
4、部署服务器端,包含创建HelloWorld.java接口,HelloWorldImpl.java为服务实现类,User.java为用户数据类。配置文件applicationContext.xml,和web.xml文件。CXF框架工具包放入WebContent->WEB-INF->lib目录下。如图3所示。

图3 开发工程目录结构一览
5、部署服务端,选中工程目录右键Run As - Run On Server,点finish,工程即部署于本地的tomcat服务器中。如图4所示。

图4 启动tomcat并部署工程
6、浏览器访问地址 http://localhost:8080/helloCXF/webservice/HelloWorld?wsdl 即可,出现WSDL的描述语言。
其中地址结构为http://服务器端地址:tomcat端口号/工程目录名/webservice/接口名称?wsdl。

7、客户端,run javaApplication -> HelloWorldClient.java即可。这里的客户机的接口包,采用wsimport工具将wsdl转化而来。客户jar包为helloInterface.jar。具体操作见文件 WSDL生成jar的批处理.bat 。

【开发代码】

//HelloWorld.java
/**
 * @created time:2017年7月25日,下午1:52:06
 * @author:chixh
 * @file:HelloWorld.java
 */
package com.demo;

import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebService;
/**
 * 服务点接口
 * @author chixh
 *
 */
@WebService
public interface HelloWorld {
	String sayHi(@WebParam(name="text")String text);
	String sayHiToUser(User user);
	String[] SayHiToUserList(List<User> userList);
}

//HelloWorldImpl.java
/**
 * @created time:2017年7月25日,下午1:59:14
 * @author:chixh
 * @file:HelloWorldImpl.java
 */
package com.demo;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.jws.WebService;
/**
 * 服务实现类
 * @author chixh
 *
 */
@WebService(endpointInterface="com.demo.HelloWorld",serviceName="HelloWorld")
public class HelloWorldImpl implements HelloWorld{
	
	Map<Integer, User> users = new LinkedHashMap<>();
	
	@Override
	public String sayHi(String text) {
		return "Hello "+text;
	}

	@Override
	public String sayHiToUser(User user) {
		users.put(users.size()+1, user);
		return "Hello "+user.getName();
	}

	@Override
	public String[] SayHiToUserList(List<User> userList) {
		String [] result =new String[userList.size()];
		int i =0;
		for (User u : userList) {
			result[i] ="Hello "+u.getName();
			i++;
		}
		return result;
	}
	
}

//User.java
/**
 * @created time:2017年7月25日,下午1:57:58
 * @author:chixh
 * @file:User.java
 */
package com.demo;

public class User {
	private String name;
	private String description;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
}

//applicationContext.xml
<?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:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="
                       http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans.xsd
                       http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
	<!-- 该资源包含在CXF框架包中 -->
	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
	<!-- 配置接口implementor为实现类的全类名,address地址与实现类中的serviceName和url访问名字相同,与web。xml中/webservice/*组合成/webservice/HelloWorld -->
	<jaxws:endpoint id="HelloWorld" implementor="com.demo.HelloWorldImpl"
		address="/HelloWorld" publish="true"/>
	<!-- 客户端的配置内容,HelloWorld的一个bean实例,服务端不需要此配置,这里为了方便,放在一起 -->
	<bean id="client" class="com.demo.HelloWorld" factory-bean="clientFactory"
		factory-method="create" />
	<!-- 客户端的配置内容,id为factory-bean,要一致,表示从该地址以HelloWorld接口来获取内容 -->
	<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="serviceClass" value="com.demo.HelloWorld" />
		<property name="address"
			value="http://localhost:8080/helloCXF/webservice/HelloWorld" />
	</bean>
</beans>


//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"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<!-- 打开工程的首页,这里没使用 -->
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<!-- applicationContext.xml所在的位置 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>WEB-INF/classes/applicationContext.xml</param-value>
	</context-param>
	<!-- 配置spring框架来截取url -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- CXFServlet页面,采用 /webservice/*的方式,*代表匹配任意字段这里匹配 @WebService(endpointInterface="com.demo.HelloWorld",serviceName="HelloWorld")中的HelloWorld -->
	<servlet>
		<display-name>CXFServlet</display-name>
		<!-- 与下面的名称一致 -->
		<servlet-name>CXFServlet</servlet-name>
		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<!-- 与上面的名称一致 -->
		<servlet-name>CXFServlet</servlet-name>
		<url-pattern>/webservice/*</url-pattern>
	</servlet-mapping>
</web-app>

//HelloWorldClient.java
/**
 * @created time:2017年7月25日,下午2:09:00
 * @author:chixh
 * @file:HelloWorldClient.java
 */
package com.demo;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloWorldClient {
	public static void main(String[] args) {
		//在应用配置文件中解析client字段。
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		HelloWorld client = (HelloWorld) context.getBean("client");
		//客户端产生两个user数据
		User user1 = new User();
		user1.setName("Tony");
		user1.setDescription("test");
		User user2 = new User();
		user2.setName("freeman");
		user2.setDescription("test");
		List<User> userList = new ArrayList<User>();
		userList.add(user1);
		userList.add(user2);
		//将数据通过bean的方式应用到服务端中去
		String[] res = client.SayHiToUserList(userList);
		System.out.println(res[0]);
		System.out.println(res[1]);

	}
}

//WSDL生成jar的批处理.bat

md D:\spring\workspace\ClientHelloCXF\wsdl\bin\
md D:\spring\workspace\ClientHelloCXF\wsdl\src\

wsimport  -keep  -s D:\spring\workspace\ClientHelloCXF\wsdl\src\ -d D:\spring\workspace\ClientHelloCXF\wsdl\bin\ -verbose http://localhost:8080/helloCXF/webservice/HelloWorld?wsdl

cd D:\spring\workspace\ClientHelloCXF\wsdl\bin\

jar -cvf helloInterface.jar com\


cd D:\spring\workspace\ClientHelloCXF\wsdl\src\

jar -cvf helloInterface_source.jar com\


copy D:\spring\workspace\ClientHelloCXF\wsdl\bin\helloInterface.jar D:\spring\workspace\ClientHelloCXF\WebContent\WEB-INF\lib
copy D:\spring\workspace\ClientHelloCXF\wsdl\src\helloInterface_source.jar D:\spring\workspace\ClientHelloCXF\WebContent\WEB-INF\lib
pause

【程序结果】

服务端WSDL内容,如图5所示。

图5 服务端WSDL展示结果
客户端返回结果,如图6所示。

图6 客户端返回结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值