博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSM项目中整合WebService
阅读量:5127 次
发布时间:2019-06-13

本文共 9309 字,大约阅读时间需要 31 分钟。

  先了解一下WebService的一些相关术语吧:

WebService

WebService是一种跨编程语言和跨操作系统平台的远程调用技术。

WSDL(web service definition language)

WSDL是webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程

SOAP(simple object access protocal)

SOAP是"简单对象访问协议"
是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据
soap消息:请求消息和响应消息

SEI(WebService EndPoint Interface)

SEI是web service的终端接口,就是WebService服务器端用来处理请求的接口

CXF(Celtix + XFire)

一个apache的用于开发webservice服务器端和客户端的框架。


本次采用的就是CXF框架来整合,

首先引入相关的pom包:

org.apache.cxf
cxf-rt-frontend-jaxws
${cxf.version}
org.apache.cxf
cxf-rt-transports-http
${cxf.version}

  由于版本的冲突,我将spring的版本调了,并且由于cglib包中的asm包和cxf框架中的asm包有冲突,我做了以下更改:

4.1.9.RELEASE

  

cglib
cglib
3.2.5
org.ow2.asm
asm

  2. 接着引入spring-context-webservice.xml和cxf-config.xml:

  

  其中<jaxws:endpoint id="servicemanWebService" implementor="clack.webserviceImp.ServicemanWebServiceImp" address="/servicemanws" />

中的设置后续会用到。

3. 更改相应的web.xml加载顺序并加入cxf配置(反正是先加载spring,后加载springmvc)
Archetype Created Web Application
contextConfigLocation
classpath:spring-context*.xml
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.request.RequestContextListener
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:spring-mvc.xml
1
SpringMVC
/
CXFServlet
org.apache.cxf.transport.servlet.CXFServlet
1
CXFServlet
/ws/*

  4. 接着添加一个工具类用于调出springmvc中加载的service注解

package clack.utils;import java.util.Enumeration;import javax.servlet.ServletContext;import org.springframework.web.context.ContextLoader;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;public class ContextUtils {	public static WebApplicationContext getSpringMVCContext() {		WebApplicationContext rootWac = ContextLoader.getCurrentWebApplicationContext();		// 获取servletContext		System.out.println(rootWac+"ddddd");		ServletContext servletContext = rootWac.getServletContext();		// 获取子容器,名字最后对应servlet名字		//1.查看spring容器中的对象名称		String[] beannames = rootWac.getBeanDefinitionNames();		for(String beanname:beannames){			System.out.println(beanname);		}				System.out.println(servletContext);					//2.查看servlet中容器列表		Enumeration
servletnames = servletContext.getAttributeNames(); while(servletnames.hasMoreElements()){ System.out.println(servletnames.nextElement()); } WebApplicationContext springmvc = WebApplicationContextUtils.getWebApplicationContext(servletContext, "org.springframework.web.servlet.FrameworkServlet.CONTEXT.SpringMVC"); //System.out.println(springmvc+"eee"); return springmvc; }}

  5. 准备工作就绪后就建立webservice接口和webservice实现类:

package clack.webservice;import java.util.List;import javax.jws.WebMethod;import javax.jws.WebService;import clack.entity.Serviceman;@WebServicepublic interface ServicemanWebService {	//使用@WebMethod注解标注WebServiceI接口中的方法    @WebMethod	List
getAllServiceman() throws Exception;}

  其中使用的 getAllServiceman()方法是本身的service中的方法调用。

package clack.webserviceImp;import java.util.List;import javax.jws.WebService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import clack.entity.Serviceman;import clack.service.ServicemanService;import clack.utils.ContextUtils;import clack.webservice.ServicemanWebService;//endpointInterface 编写实现接口类名 service name 网络访问的名字 对应
@Component("servicemanWebService")@WebService(endpointInterface = "clack.webservice.ServicemanWebService", serviceName = "servicemanws")public class ServicemanWebServiceImp implements ServicemanWebService{ @Autowired private ServicemanService servicemanService; public ServicemanService getServicemanService() { return servicemanService; } public void setServicemanService(ServicemanService servicemanService) { this.servicemanService = servicemanService; } @Override public List
getAllServiceman() throws Exception { // TODO Auto-generated method stub servicemanService = (ServicemanService)ContextUtils.getSpringMVCContext().getBean("servicemanService"); List
servicemans = servicemanService.getAllServiceman(); return servicemans; }}

  理清其中注解的对应关系后问题不大,

启动项目,输入地址:http://localhost:8080/StudyMaven1/ws/servicemanws?wsdl

 

 

 

 


 

 测试:

建立一个简单的maven项目并导入相关的cxf包:

 

4.0.0
clack
MyWebService
0.0.1-SNAPSHOT
2.2.3
org.apache.cxf
cxf-rt-frontend-jaxws
${cxf.version}
org.apache.cxf
cxf-rt-transports-http
${cxf.version}
compile
MyWebService
org.apache.maven.plugins
maven-compiler-plugin
3.1
1.8
1.8
utf-8
org.apache.maven.plugins
maven-resources-plugin
2.6
false
src/main/java
**/*.xml
src/main/resources
**/*

 

 2. 使用了一个插件生成相关的文件 apache-cxf-3.2.7

3. 将所得的文件拷入maven项目中,并新建一个测试类测试是否能取得数据:

目录树如下:

其中WebServiceApp是测试类:

package clack.webserviceimp;import java.net.URL;import java.util.List;import javax.xml.namespace.QName;import javax.xml.ws.Service;import org.apache.cxf.endpoint.Client;import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;import clack.webservice.Serviceman;import clack.webservice.ServicemanWebService;/** * 通过客户端编程的方式调用Webservice服务 * */public class WebServiceApp {	//1. 自定义方法	public void mysoap() throws Exception {		// CXF动态客户端工厂		JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();		// WSDL文档url配置()		String wsdlUrl = "http://localhost:8080/StudyMaven1/ws/servicemanws?wsdl";		Object[] objects = null;		try {			// 获取CXF客户端			Client client = dcf.createClient(wsdlUrl);			// 调用Web Service方法			objects = client.invoke("add", 1, 2);		} catch (Exception e) {			e.printStackTrace();		}		// 获取调用结果		System.out.println("调用结果:" + objects[0]);		System.out.println("=========>");		try {			// 获取CXF客户端			Client client = dcf.createClient(wsdlUrl);			// 调用Web Service方法			objects = client.invoke("sayHello", "World!");		} catch (Exception e) {			e.printStackTrace();		}		// 获取调用结果		System.out.println("调用结果:" + objects[0]);	}	//第二种 client工具生成辅助类 需使用apche cxf工具  	//步骤 cmd wsdl2java   -encoding  utf8 http://localhost:8080/StudyMavenSSM/ws/studentws?wsdl	//	public void clientsoap() throws Exception{		// 创建WSDL的URL,注意不是服务地址				URL url = new URL("http://localhost:8080/StudyMaven1/ws/servicemanws?wsdl");				// 创建服务名称				// 1.namespaceURI - 命名空间地址 (wsdl文档中的targetNamespace				// targetNamespace="http://webserviceImp.gxa/")				// 2.localPart - 服务视图名 (wsdl文档中服务名称,例如
) QName qname = new QName("http://webserviceImp.clack/", "servicemanws"); // 创建服务视图 // 参数解释: // 1.wsdlDocumentLocation - wsdl地址 // 2.serviceName - 服务名称 Service service = Service.create(url, qname); // 获取服务实现类 // 参数解释:serviceEndpointInterface - 服务端口(wsdl文档中服务端口的name属性,例如
) ServicemanWebService studentWebService = service.getPort(ServicemanWebService.class); //调用查询方法 List
students = studentWebService.getAllServiceman(); for(Serviceman serviceman:students){ System.out.println(serviceman.getSname()); } } public static void main(String[] args) throws Exception { new WebServiceApp().clientsoap(); }}

  4. 最后运行如下,成功调用:

至此,一个简单的webservice就整合进去了,但是,其中还有很多细节无法言说,学而无涯。

 

转载于:https://www.cnblogs.com/clack/p/10001375.html

你可能感兴趣的文章
MVC解决方案发布IIS 登录页面需要输入两次帐号问题
查看>>
Visual Studio 2017 初次体验
查看>>
zTree树
查看>>
tips 前端 点击事件
查看>>
python 学习教程
查看>>
Python下用Tkinter进行GUI编程
查看>>
Ajax异步刷新地址栏url改变(利用Html5 history.pushState实现)
查看>>
POJ 2195 Going Home 最小费用流 难度:1
查看>>
第7天
查看>>
QT在windows下实现截屏操作并保存为png图片
查看>>
页面宽度
查看>>
ACM: 限时训练题解-Epic Professor-水题
查看>>
iis6兼容32位运行
查看>>
Mybatis的使用
查看>>
Node.js 连接 MySQL
查看>>
Excel Sheet Column Number(STRING-TYPE CONVERTION)
查看>>
idea中解决乱码问题
查看>>
ACM-ICPC 2018 world final A题 Catch the Plane
查看>>
那些年,那些书
查看>>
如何进行库存管理?
查看>>