WebService:CXF-SPRING 读书笔记

时间:2021-08-10 01:00:58

WEBSERVICE是给第三方提供一个接口,可以方便的与不同平台的系统进行通信,当然咯,这个只是我们通常运用到的最主要的作用,还有其他作用,见BAIDU知道。一个WEBSERVICE简单实例分为以下几个步骤:

一、配置服务器端 发布暴露给第三方的接口生成WSDL(WEBSERVICE DISCRAPTION LANGAGE)文件

二、配置客户端 写测试类 主要是通过访问生成的WSDL调用发布的接口程序。

服务器端:

生成WEBSERVICE的主要有这么2种,CXF(XFIRE的升级版) 和AXIS

我的配置环境是:MYECLIPSE8.6+TOMCAT7.0+CXF2.3  将CXF与SPRING整合

首先下载CXF,现在最新版本是2.5 阿帕奇官方网站可以下载。

1、新建WEB PROGRAM 将CXF解压,把LIB文件夹下的JAR包复制到工程文件WEB-INF下的LIB文件夹下。

在这里你将会发 下载的CXF包默认配置就是如SPRING整合一起的,所以包里包含了SPRING的相关JAR包。

2、新建接口类 HellWorld 代码如下:

package com.demo;

import javax.jws.WebService;
import javax.jws.WebParam;

@WebService           //必须标注 否则WSDL文件错误  必选的标注。用于导出的服务接口及其实现类

public  interface HelloWorld {
   String sayHi(@WebParam(name="text") String text);
}

这里需要说明的是,@WebService 是必须的,如果少了这个标注启动的适合直接报错。

@WebParam(name="text")这个标注在有的网上贴说也是必须加的,否则客户端传入的参数经过接口处理之后返回的是个NULL。这样说也是有道理的,因为WEBSERVICE 参数默认为arg0,arg1..所以当传入的参数名为text的时候他不认识了。

以下是 @WebParam(name="text")添加 与不添加的wsdl效果

WebService:CXF-SPRING 读书笔记   WebService:CXF-SPRING 读书笔记

3、接口实现类

package com.demo;

import javax.jws.WebService;

@WebService(endpointInterface = "com.demo.HelloWorld")
public class HelloWorldImpl implements HelloWorld {

public String sayHi(String text) {
  // TODO Auto-generated method stub
  System.out.println("sayHi called");  
        return "Hello, " + text; 
 }

}
@WebService(endpointInterface = "com.demo.HelloWorld") 也不是必须的,说明要暴露的接口类的CLASSPATH 这个类是接口实现类,客户端访问的时候 通过接口进入到这个方法里执行相关的操作。

4、新建WEBSERVICE-SPRING.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">

<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" />

<jaxws:endpoint id="helloWorld" implementor="com.demo.HelloWorldImpl" address="/HelloWorld" />

这里引入了CXF的相关配置文件,是必须的。<jaxws/>:implementor属性表明接口的实现类的CLASSPATH路径。address属性,这个属性是特别要注意的,很多调试失败跟这个属性有关,/HelloWorld表明此WSDL文件的地址为http://localhost:8080/工程名/CXFServlet访问路径/HelloWorld?wsdl 如果address写成/demo/HelloWorld 则为

http://localhost:8080/工程名/CXFServlet访问路径/demo/HelloWorld?wsdl 他表示的是个相对路径。

至于为什么有个/CXFServlet访问路径 后面将会阐述

5、修改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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WebService</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/WEBSERVICE-SPRING.xml</param-value>    <!--

标签将WEBSERVICE-SPRING.XML载入容器。

-->
  </context-param>
 
  <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>/*</url-pattern>
  </servlet-mapping>
  
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
 
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

说明:

<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
此配置说明了WEBSERVICE的访问方式,这个也不难理解,我们是要把WEBSERIVCE服务发布到WEB容器上的,同时WEBSERVICE采用的是SOAP通信协议,属于HTTP协议簇,就意味着WEBSERVICE将会通过某个WEB地址去访问,同时一次WEB访问都是通过一个SERVLET完成的,所以当我们访问WEBSERVICE的一个服务地址的时候,实际上我们的请求时交给这个CXFServlet来处理。

<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

此SERVLET的访问路径,注意这个同样是个相对路径。与先前我们在WEBSERVICE-SPRING.XML里配置的jaxws标签address属性结合起来理解,这里<url-pattern>指定的地址就是我们说的/CXFServlet地址 /*则会空

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

配置的SRPING的监听器 因为我将CXF与SPRING整合。

至此我们的服务器端就配置好了,发布到TOMCAT上 通过http://localhost:8080/工程名/HelloWorld?wsdl则可以看到我们生成的WSDL文件,在这里就不详细解释WSDL文件的内容,详情见百度。

提醒一句,如果发布不成功,一定要详细的查看异常,有可能是JAR包冲突,有可能是找不到路径,相关的解决办法在后续的博文中将会提及。

二、客户端

为了代码简便,客户端也用SPRING整合起来。

1、编写client-websevice.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-2.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd">

<bean id="client" class="com.demo.HelloWorld"
        factory-bean="clientFactory" factory-method="create" />
    <bean id="clientFactory"
        class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property name="serviceClass" value="com.demo.HelloWorld" />
        <property name="address" value="http://localhost:8080/WebService/HelloWorld" />
    </bean>

</beans>

注意   <property name="address" value="http://localhost:8080/WebService/HelloWorld" />

这里的value不要自己去写,去生成的WSDL文件里找,这样不会出错。

client对象通过JaxWsProxyFactoryBean工厂类来产生,JaxWsProxyFactoryBean类的详细介绍可以参照源码。

2、编写客户端程序。

public static void main(String args[]) throws Exception {

ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[]{"com/demo/client-webservice.xml"});
       
      HelloWorld  client = (HelloWorld) context.getBean("client");
     System.out.println("Server said: "+client.sayHi("HI"));
}
运行此程序在控制台上就开源看到如下信息:hello,HI

至此一个完整的WEBSERVICE的实例就配置完成了。

访问不成功时 第一反应就要去查看WEBSERVICE-SPIRNG.XML文件写的是否正确,以及访问的地址是不是正确的。

//-----------------------------------------------------------------------------------

现在对程序进行改动,把客户端测试放在另一个项目

1.新建java Project ,ws_client

2.新建java类

package com.demo;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
import org.apache.cxf.interceptor.*;   
public  class ClientTest2_Within_No_xml {  
 
   public static void main(String args[]) throws Exception {  
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();  
            factory.setServiceClass(HelloWorld.class);

   //ip是我本机ip地址,在本地可用localhost,ws_cxf_spring1是已经可以提供web服务的web项目,
            factory.setAddress("http://192.168.0.229:8080/ws_cxf_spring1/HelloWorld"); //ip是我本机ip地址,在本地可用localhost
        HelloWorld client = (HelloWorld) factory.create();  
 
        String reply = client.sayHi("HI");  
        System.out.println("Server said: " + reply);  
    }  
  }

这样,只要把服务程序挂在服务器上,在其他电脑上通过client程序访问(正确的ip配置前提下),输出如下效果。

本人已在电脑B上测试访问 电脑A上的服务程序,正确访问。

WebService:CXF-SPRING 读书笔记

WebService:CXF-SPRING 读书笔记的更多相关文章

  1. (转) Spring读书笔记-----Spring的Bean之配置依赖

    前一篇博客介绍了Spring中的Bean的基本概念和作用域(Spring读书笔记-----Spring的Bean之Bean的基本概念),现在介绍Spring Bean的基本配置. 从开始我们知道Jav ...

  2. Spring读书笔记——bean解析

    前情回顾 上篇<Spring读书笔记--bean加载>我们从代码角度介绍了有哪些类负责解析XML文件,又是如何一步步从XML格式脱变成我们熟悉的bean的,直到DefaultBeanDef ...

  3. Spring读书笔记——bean创建(上)

    通过<Spring读书笔记--bean加载>和<Spring读书笔记--bean解析>,我们明白了两件事. Spring如何加载消化一个xml配置文件 Spring如何将xml ...

  4. Spring读书笔记——bean创建(下)

    有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...

  5. WebService CXF Spring

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&quot ...

  6. Spring 读书笔记-----使用Spring容器(一)

    pring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口.他们都可代表Spring容器,Spri ...

  7. Spring读书笔记-----Spring的Bean之Bean的基本概念

    从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...

  8. Spring读书笔记-----使用Spring容器(二)

    一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFa ...

  9. spring读书笔记----Quartz Trigger JobStore出错解决

    将Quartz的JOBDetail,Trigger保持到数据库的时候发现,系统报错 The job (DEFAULT.jobDetail) referenced by the trigger does ...

随机推荐

  1. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  2. Nodejs与ES6系列1&colon;变量声明

    1.声明变量 在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域.变量分为两类,全局(global)的和局部的.其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都 ...

  3. 将PDM文件导出成CHM帮助文件

    实际开发中常常将维护数据库字段用 powerdesigner 维护起来,而实际要查阅 数据库用了什么字段是,常常又不方便去打开PDM 文件去找. 下面分享一个小工具,效果看下图: 有这个小工具, PD ...

  4. Oracle删除控制文件恢复

    控制文件被删除后,系统崩溃,下面介绍下如何恢复控制文件 SQL> conn / as sysdbaConnected to an idle instance.SQL> startup no ...

  5. Linux之常用命令【service】

    补充说明 service命令 是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动.停止.重新启动和关闭系统服务,还可以显示所有系统服务的当前状态. 语法 service(选项 ...

  6. Qt的pro文件--项目配置的部分字段

    Qt项目配置的部分字段: 库: LIBS += -L /usr/local/lib -lpcap INCLUDEPATH += /usr/local/include/

  7. 【转】Ubuntu&plus;apache绑定多个域名

    1. 将 http://www.a.com 与 http://www.b.com 的DNS解析到你的服务器IP上. 2. 删除apache的默认主机配置文件.你也不希望创建2个虚拟主机后人家还能直接访 ...

  8. java 将Map拷贝到另一个Map对象当中

      java 将Map拷贝到另一个Map对象当中 CreateTime--2018年6月4日09点46分 Author:Marydon 1.需求说明 将一个MapA对象中所有的键值对完全拷贝到另一个M ...

  9. PyCharm在win10的64位系统安装实例

    搭建环境 1.win10_X64,其他Win版本也可以. 2.PyCharm版本:Professional-2016.2.3. 搭建准备 1.到PyCharm官网下载PyCharm安装包. 2.选择W ...

  10. bash和zsh切换

    zsh切换bash bash切换zsh 切换bash chsh -s /bin/bash 切换zsh chsh -s /bin/zsh