SSM项目中整合WebService

  先了解一下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包:

<!-- webservice --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>${cxf.version}</version></dependency>

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

<!-- spring版本号 --><spring.version>4.1.9.RELEASE</spring.version>

  

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.2.5</version><exclusions><exclusion><groupId>org.ow2.asm</groupId><artifactId>asm</artifactId></exclusion></exclusions></dependency>

  2. 接着引入spring-context-webservice.xml和cxf-config.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:cxf="http://cxf.apache.org/core"xmlns:jaxws="http://cxf.apache.org/jaxws"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsdhttp://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"><import resource="cxf-config.xml"/>
</beans>

  

<?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"xmlns:context="http://www.springframework.org/schema/context"xmlns:jaxrs="http://cxf.apache.org/jaxrs"xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd"><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" /><!-- id 不能重复 --><jaxws:endpoint id="servicemanWebService" implementor="clack.webserviceImp.ServicemanWebServiceImp"  address="/servicemanws" /> <!-- 	<jaxrs:server id="restContainer" address="/"><jaxrs:serviceBeans><ref bean="roomService" /></jaxrs:serviceBeans><jaxrs:providers><bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" /></jaxrs:providers><jaxrs:extensionMappings><entry key="json" value="application/json" /><entry key="xml" value="application/xml" /></jaxrs:extensionMappings></jaxrs:server> --></beans>

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


中的设置后续会用到。



3. 更改相应的web.xml加载顺序并加入cxf配置(反正是先加载spring,后加载springmvc)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>Archetype Created Web Application</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-context*.xml</param-value></context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class></listener><!-- ================配置SpringMVC核心调度器================ --><!-- 不指定具体文件的话,默认为"/WEB-INF/<servlet name>-servlet.xml" --><!-- load-on-startup代表启动顺序,设置为大于等于0表示容器在应用启动时就加载并初始化这个servlet --><!-- 推荐拦截/,风格优雅 --><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping><servlet><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>/ws/*</url-pattern></servlet-mapping>
</web-app>

  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();// 获取servletContextSystem.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<String> 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;@WebService
public interface ServicemanWebService {//使用@WebMethod注解标注WebServiceI接口中的方法@WebMethodList<Serviceman> 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 网络访问的名字 对应<wsdl:service name="studentws">
@Component("servicemanWebService")
@WebService(endpointInterface = "clack.webservice.ServicemanWebService", serviceName = "servicemanws")
public class ServicemanWebServiceImp implements ServicemanWebService{@Autowiredprivate ServicemanService servicemanService;public ServicemanService getServicemanService() {return servicemanService;}public void setServicemanService(ServicemanService servicemanService) {this.servicemanService = servicemanService;}@Overridepublic List<Serviceman> getAllServiceman() throws Exception {// TODO Auto-generated method stubservicemanService = (ServicemanService)ContextUtils.getSpringMVCContext().getBean("servicemanService");List<Serviceman> servicemans = servicemanService.getAllServiceman();return servicemans;}}

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

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

 

 

 

 


 

 测试:

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

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>clack</groupId><artifactId>MyWebService</artifactId><version>0.0.1-SNAPSHOT</version><properties><cxf.version>2.2.3</cxf.version></properties><dependencies><!-- webservice --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>${cxf.version}</version></dependency></dependencies><build><defaultGoal>compile</defaultGoal><finalName>MyWebService</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><encoding>utf-8</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.6</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins><resources><!--编译之后包含xml --><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*</include></includes></resource></resources></build>
</project>

 

 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文档中服务名称,例如<wsdl:service name="studentws">)QName qname = new QName("http://webserviceImp.clack/", "servicemanws");// 创建服务视图// 参数解释:// 1.wsdlDocumentLocation - wsdl地址// 2.serviceName - 服务名称Service service = Service.create(url, qname);// 获取服务实现类// 参数解释:serviceEndpointInterface - 服务端口(wsdl文档中服务端口的name属性,例如<wsdl:port// binding="tns:studentwsSoapBinding" name="StudentWebServiceImpPort">)ServicemanWebService studentWebService =service.getPort(ServicemanWebService.class);//调用查询方法List<Serviceman> 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭载鸿蒙的油烟机,华为、美的合作:搭载鸿蒙系统的家电来了 三大亮点

日前&#xff0c;美的与华为在智能家居行业又有大动作&#xff1a;双方将在2021年实现合作规模化&#xff0c;从运营和营销角度开展更多联合合作。美的鸿蒙新家电亮点包括&#xff1a;第一是极速配网&#xff0c;只要用手机碰一碰&#xff0c;基于WiFi Aware配网协议即可实现设…

excel android 公式,两个超实用的Excel万能公式,瞬间提升你10倍工作效率!

相信大家在平时的工作中&#xff0c;都会经常有用到公式的需要&#xff0c;但是下面这些公式你用过吗&#xff0c;今天小编就带大家一起看看吧&#xff01;1. SUM函数这个函数不仅在我们学习的过程中会用到&#xff0c;即便到了工作后&#xff0c;也经常需要对各种数据进行处理…

Linux中常用命令(文件与目录)

1、pwd 查看当前目录&#xff08;Print Working Directory&#xff09;2、cd 切换工作目录&#xff08;Change Directory&#xff09;&#xff08;1&#xff09;格式&#xff1a;cd [目录位置]特殊目录&#xff1a;.当前目录..上一级目录~用户主目录-上个工作目录&#xff08;2…

计算机操作系统(1):OS的作用和目标

OS的目标和作用 操作系统&#xff08;Operating System , OS&#xff09;是计算机硬件上的第一层软件&#xff0c;是计算机必须配置的最基本、最重要的系统软件。 1.1.1 OS的目标 有效性 方便性 可扩展性 开放性 1&#xff0e;有效性(早期OS的主要目标) 有效提高CPU和…

计算机操作系统(2):OS的发展过程

1.2 OS的发展过程 20世纪50年代中期&#xff0c;第一个简单的批处理系统 60年代中期&#xff0c;多道程序批处理系统&#xff0c;随后出现分时系统 上世纪80年代开始至21世纪初&#xff0c;微型机、多处理机、计算机网络大发展年代→微机OS、多处理机OS和网络OS的形成和大发展…

创建好centos7虚拟机之后连xshell连不上虚机

创建好虚拟机之后配置都已经配置完成了selinux&#xff0c;防火墙都关了准备用xshell 连接虚拟机报出 然后在网上着了各种资料还是不行&#xff0c;最后将网卡修改为&#xff1a; 修改之后就可以连上了。 当然修改之后会出现两个ip 必须得使用圈起来的ip连才可以&#xff0c;用…

android滑动开关框架,Android之实现滑动开关组件

由于Android并未提供滑动开关之类的组件&#xff0c;所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果。这里有一个示例代码&#xff0c;它包括三个类&#xff1a;开关组件视图、状态监听接口、MainActivity我们先来看看整个demo的效果图&#xff1a;我们先来看看…

计算机操作系统(3):操作系统的基本特征

1.3 操作系统的基本特征 1.3.1 并发&#xff08;Concurrence&#xff09; 并行与并发&#xff1a; 并行性——两个或多个事件在同一时刻发生 并发性——两个或多个事件在同一时间间隔内发生 在多道程序环境下&#xff0c;并发性是指在一段时间内&#xff0c;宏观上有多…

最简单的docker教程:在docker里运行nginx服务器

命令行docker search nginx搜索名为nginx的docker image&#xff0c;返回结果的第一个&#xff0c;github上有10293个star&#xff0c;这就是我们想要搜索的结果&#xff1a; 使用命令docker pull把这个镜像拖下来&#xff1a; docker pull nginx 然后以detach模式运行这个镜像…

okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程

1.简单使用同步&#xff1a;Override public Response execute() throws IOException {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed true;}try {client.dispatcher().executed(this);Response result getRe…

H5实现轮播

页面代码&#xff1a; <div id"body_wrapper" class"container"><article><section id"lunbotu"><div class"wrap"><div id"slide-holder"><div id"slide-runner"><a hre…

计算机操作系统(4):操作系统的重要功能

1.4 操作系统的主要功能 处理机管理功能 存储器管理功能 设备管理功能 文件管理功能 用户接口 1处理机管理功能 也可称为进程管理在传统的多道程序设计系统中&#xff0c;处理机的分配和运行&#xff0c;都是以进为基本单位的&#xff0c;因而对处理机的管理&#xff0…

html5本地存储论坛,Web Storage--HTML5本地存储

什么是Web StorageWeb Storage是HTML5里面引入的一个类似于cookie的本地存储功能&#xff0c;可以用于客户端的本地存储&#xff0c;其相对于cookie来说有以下几点优势&#xff1a;存储空间大&#xff1a;cookie只有4KB的存储空间&#xff0c;而Web Storage在官方建议中为每个网…

计算机操作系统(5):操作系统的结构设计

1.5 操作系统的结构设计 OS的结构经历了四代变革&#xff1a; 微内核OS结构——现代OS结构 微内核结构能有效地支持多处理机运行&#xff0c;故非常使用于分布式系统环境。 Windows NT采用微内核结构 在与微内核技术发展的同时&#xff0c;客户/服务器技术、面向对象技术…

Linux软链接和硬链接

Linux软链接和硬链接 1. 软链接link 定义&#xff1a;就是windows系统的快捷方式 作用&#xff1a;可以对硬盘空间进行合理分配 具体设置&#xff1a; ln -s 源文件 软链接 1.1 软链接使用注意 ① 设置软链接&#xff0c;如果软链接和源文件不在同一级目录&#xff0c;原…

项目管理(3):备战pmp

1组织结构与项目管理 2职能型组织的优缺点 优点 简单对专家更易于管理&#xff0c;管理更具灵活性只向一个上司汇报项目人员有“家”——他们在部门里工作&#xff0c;部门给予相应的技术支持员工可以不断得到提高缺点 项目经理没有足够的权力没有明确的责任人客户可能找不到专…

【leetcode】16 3Sum Closest

描述 给定一个数字集合 S 以及一个数字 target&#xff0c;需要从集合中找出3个数字的和与这个 target的值最接近&#xff08;绝对值最小&#xff09; 样例 Input: S [-1, 2, 1, -4], target 1Output: 2 思路 首先排序&#xff0c;之后确定一个数字的前提下&#xff0c;再利用…

项目管理(4):备战pmp

1单个项目管理过程 如何实现项目管理&#xff1f; 通过“过程”processes实现 大多数情况下&#xff0c;大多数项目都有共同的项目管理过程 项目管理知识提供的是good practice 应用这些过程能大大提高项目成功的机会 项目经理与项目团队的责任 确定哪些过程适用于具体给…

项目管理(6):备战pmp

项目整体管理 定义&#xff1a; 识别、定义、结合、统一与协调项目管理过程组中的各个过程以及项目管理活动 在各个相互冲突的目标与方案之间权衡取舍 在项目管理中发挥明显的重要作用 Eg&#xff1a;应急计划的成本估算成本管理时间管理风险管理 基本任务&#xff1a; …

项目管理(7):备战pmp

1.2制定项目初步范围说明书 项目范围说明书&#xff08;初步&#xff09; 目的&#xff1a; 登记项目及其产品和服务的特征与边界&#xff0c;以及验收与范围控制的方法 内容&#xff1a; 项目与产品的目标 产品或服务的要求与特性 产品验收标准 项目边界 项目要求与可…