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。
以上为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所示。
图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 客户端返回结果