webservice的简单使用,cxf框架的的使用

Posted jiang_xiang_it

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webservice的简单使用,cxf框架的的使用相关的知识,希望对你有一定的参考价值。

Web service是一个平台独立的,低耦合的,自包含的、基于可编程web的应用程序,可使用开放的XML标准通用标记语言下的一个子集)标准描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序

Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XMLHTTPWeb Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

WebService就是实现多个系统之间的远程调用技术。WebService可以实现跨语言的调用。

  1. WebService,顾名思义就是基于Web的服务。它使用Web(HTTP\\ XML)方式,接收和响应外部系统的某种请求。从而实现远程调用.
  2. 我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/SB/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单调用了一下服务器上的一段代码而已
  3. 学习WebService可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样

一.java代码调用webservice实现国内手机号码归属地查询服务

 先打开http://www.webxml.com.cn/zh_cn/index.aspx    网站:找到国内手机号码归属地查询服务

进入http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx     网站

然后进入http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl  网站

然后在桌面打开dos命令窗口

wsimport -s . -p com.baoyuan.ws http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

输入上面的代码  -p  后面的表示包名  可以自己定义

得到的源码和calss文件,可以将Class文件删掉,留下源码

然后创建工程,将包添加进去

编写测试代码,在http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl 中找到wsdal:service  的name值为服务类

在http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl 中找到wsdl:port 的那么值为代理类,可以通过服务类的getter方法获得

wsdl:operation的name值为方法,通过代理类调用

package com.baoyuan.test;

import com.baoyuan.ws.MobileCodeWS;
import com.baoyuan.ws.MobileCodeWSSoap;

public class TestWebService {
    public static void main(String[] args) {
        //实例化服务
        MobileCodeWS ws = new MobileCodeWS();
        //获取代理对象
        MobileCodeWSSoap soap = ws.getMobileCodeWSSoap();
        //通过代理对象调用方法
        String info = soap.getMobileCodeInfo("18662584581", "");
        System.out.println(info);
    }
}

二.直接通过jdk的java代码发布webservice服务:

package com.baoyuan.server;

import javax.jws.WebService;
import javax.xml.ws.Endpoint;

/**
 * 普通一个类实现webService发布服务
 * 
 * @author admin
 *
 */
//只需要在类上面加上webService的注解
@WebService public class HelloService { public String sayHell(String name){ return name+"来了"; } public static void main(String[] args) { //通过jdk提供的Endpoint.publish方法将访问地址:ip+端口+服务名称 以及 服务对象传入,发布服务 Endpoint.publish("http://localhost:8080/hello", new HelloService()); System.out.println("服务启动成功"); } }

通过CXF框架与spring框架整合发布webservice

创建web工程

web.xml配置cxf

<?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_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>cxf_server</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 配置cxf 的servlet-->
  <servlet>
      <servlet-name>cxfServlet</servlet-name>
      <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
      <init-param>
          <param-name>config-location</param-name>
          <!-- 两种方式classpath WEB-INF -->
          <!-- 将applicationContext.xml放在src目录下
          <param-value>classpath:applicationContext.xml</param-value> -->
          <param-value>/WEB-INF/applicationContext.xml</param-value>
      </init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>cxfServlet</servlet-name>
      <url-pattern>/cxf/*</url-pattern>
  </servlet-mapping>
</web-app>

spring的配置文件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"
    xmlns:soap="http://cxf.apache.org/bindings/soap"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/bindings/soap 
    http://cxf.apache.org/schemas/configuration/soap.xsd
    http://cxf.apache.org/jaxws 
    http://cxf.apache.org/schemas/jaxws.xsd">
    <!-- 为什么使用applicationContext.xml spring和cxf整合 通过一个文件进行配置 -->
    <!-- 方式一: address访问服务地址 http://ip:端口/服务名称 implementorClass实现类的全路径 -->
    <jaxws:endpoint address="/moble" implementorClass="com.baoyuan.ws.service.impl.MobleAddressServiceImpl">
    </jaxws:endpoint>
    
    <!-- 注册一个实现类 -->
    <!-- <bean id="helloService" class="cn.itcast.cxf.HelloServiceImpl"></bean> -->
    <!-- 方式二: id:如果action或service注入的时候 -->
    <!-- <jaxws:server address="/hello" > <jaxws:serviceBean> <ref bean="helloService"/> 
        </jaxws:serviceBean> </jaxws:server> -->

</beans>

创建业务接口,类名上要加webService注解

package com.baoyuan.ws.service;

import javax.jws.WebParam;
import javax.jws.WebService;
/**
 * 模拟根据手机号码查询归属地
 * @author Administrator
 *
 */
//只需要在接口上加上webService注解
@WebService
public interface MobleAddressService {
    //模拟根据手机号码查询归属地   WebParam(name="mobleNo")注解表示下载后的源码参数的名字还是mobleNo不会改变
    public String getMobleAddress(@WebParam(name="mobleNo")String mobleNo);
}

创建实现类

package com.baoyuan.ws.service.impl;

import com.baoyuan.ws.service.MobleAddressService;
/**
 * 模拟根据手机号码查询归属地
 * @author Administrator
 *
 */
public class MobleAddressServiceImpl implements MobleAddressService{
    //模拟根据手机号码查询归属地
    @Override
    public String getMobleAddress(String mobleNo) {
        String result=mobleNo+" 归属地:长沙";
        return result; 
    }

}

然后访问url: http://localhost:8080/cxf_server/cxf/moble?wsdl      注释:cxf_server为项目名称,/cxf为在web.xml中配置的访问服务的路径,/moble为在spring配置文件中配置的address

<wsdl:definitions xmlns:ns1="http://service.ws.baoyuan.com/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.service.ws.baoyuan.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="MobleAddressServiceImplService" targetNamespace="http://impl.service.ws.baoyuan.com/">
<wsdl:import location="http://localhost:8080/cxf_server/cxf/moble?wsdl=MobleAddressService.wsdl" namespace="http://service.ws.baoyuan.com/"></wsdl:import>
<wsdl:binding name="MobleAddressServiceImplServiceSoapBinding" type="ns1:MobleAddressService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getMobleAddress">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getMobleAddress">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getMobleAddressResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MobleAddressServiceImplService">
<wsdl:port binding="tns:MobleAddressServiceImplServiceSoapBinding" name="MobleAddressServiceImplPort">
<soap:address location="http://localhost:8080/cxf_server/cxf/moble"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

编写客户端测试代码,下载客户端代码

wsimport -s . -p com.baoyuan.ws http://localhost:8080/cxf_server/cxf/moble?wsdl

创建工程,将下载的客户端代码复制复制过来,注意:代码可以在下载时用 -p指定包名,不允许下载完成后修改包名

编写测试代码,注意:测试时:服务端必须开启

package com.baoyuan.ws.test;

import com.baoyuan.ws.MobleAddressService;
import com.baoyuan.ws.MobleAddressServiceImplService;

public class TestCXF {
    public static void main(String[] args) {
        //实例化服务
        MobleAddressServiceImplService service = new MobleAddressServiceImplService();
        //创建代理对象
        MobleAddressService serviceImplPort = service.getMobleAddressServiceImplPort();
        //调用方法
        String mobleAddress = serviceImplPort.getMobleAddress("13333532525");
        System.out.println(mobleAddress); 
    }
}

 

以上是关于webservice的简单使用,cxf框架的的使用的主要内容,如果未能解决你的问题,请参考以下文章

彻底了解|利用Apache CXF框架开发WebService

webService-cxf框架的使用

使用CXF框架,发布webservice服务,并使用客户端远程访问webservice

2.1.3版cxf配置webservice备忘

webService总结——使用CXF公布和调用webService(不使用Spring)

WebService系列二:使用JDK和CXF框架开发WebService