加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

简单的WebService实现- cxf

发布时间:2020-12-16 22:48:23 所属栏目:安全 来源:网络整理
导读:1?????? 简介 2?????? 普通实现 2.1????? 定义WebService类 2.2????? 创建服务端 2.3????? 创建客户端 3?????? 基于Spring的实现 3.1????? 定义WebService类 3.2????? 创建服务端 3.3????? 创建客户端 1?????? 简介 ?????? Cxf有四个主要的类: ?????? Servi

1?????? 简介

2?????? 普通实现

2.1????? 定义WebService类

2.2????? 创建服务端

2.3????? 创建客户端

3?????? 基于Spring的实现

3.1????? 定义WebService类

3.2????? 创建服务端

3.3????? 创建客户端

1?????? 简介

?????? Cxf有四个主要的类:

  • ?????? Service:它是对应WebService服务类及其操作的抽象代表,包括数据绑定类型、正在使用的拦截器等其他信息。
  • ?????? Endpoint:它可以接收消息,其主要功能是持有拦截器,并且可以监听出现的错误,客户端和服务端都需要使用到Endpoint。
  • ?????? Server:服务端的代表。提供可以开始/结束Server、访问Endpoint的钩子。
  • ?????? Client:客户端的代表,可以管理客户端的消息。

?

?????? Cxf还有四个主要的帮忙创建服务端和客户端的工厂类:

  • ?????? AbstractServiceFactoryBean:它主要负责从一个WSDL文件或者class文件创建对应的Service,同时也可以设置一些数据绑定、拦截器等信息。它通常是藏在Server/ClientFactoryBean后面工作的,我们不会直接去使用它。常用的类有ReflectionServiceFactoryBean、JaxWsServiceFactoryBean。
  • ?????? ServerFactoryBean:创建Server端,常用的类有ServerFactoryBean、JaxWsServerFactoryBean。
  • ?????? ClientFactoryBean:创建Client端,常用的类有ClientFactoryBean、JaxWsClientFactoryBean。
  • ?????? ClientProxyFactoryBean:根据Client创建一个代理类,常用的类有ClientProxyFactoryBean、JaxWsProxyFactoryBean。

2?????? 普通实现

2.1???? 定义WebService类

?????? 对于服务端而言,我们首先要准备一个我们需要发布为WebService的类,而这个类通常是基于某个接口的。所以首先我们先在服务端定义一个接口及其实现类。

?

Java代码 ?

收藏代码

  1. public?interface?HelloWorld?{??
  2. ??
  3. ????public?String?sayHi(String?who);???
  4. ??????
  5. }??

??

Java代码 ?

收藏代码

  1. public?class?HelloWorldImpl?implements?HelloWorld?{??
  2. ??
  3. ????@Override??
  4. ????public?String?sayHi(String?who)?{??
  5. ????????return?"Hi,?"?+?who;??
  6. ????}??
  7. ??
  8. }??

2.2???? 创建服务端

?????? 上面我们已经定义好了需要发布为WebService的接口HelloWorld及其实现类HelloWorldImpl。接下来我们需要把它发布为一个WebService。

?

Java代码 ?

收藏代码

  1. public?class?Server?{??
  2. ??
  3. ????private?final?static?String?ADDRESS?=?"http://localhost:8080/test/services/HelloWorld";??
  4. ??????
  5. ????public?static?void?main(String?args[])?{??
  6. ????????HelloWorld?hw?=?new?HelloWorldImpl();??
  7. ????????ServerFactoryBean?sfb?=?new?ServerFactoryBean();??
  8. ????????sfb.setAddress(ADDRESS);//webService对应的访问地址??
  9. ????????sfb.setServiceClass(HelloWorld.class);//指定webService服务类型??
  10. ????????sfb.setServiceBean(hw);//webService对应的bean对象??
  11. ????????sfb.create();//这样就创建了一个webService的服务端??
  12. ????}??
  13. ??????
  14. }??

??????

这样我们就把HelloWorldImpl发布为一个WebService了,地址为http://localhot:8080/test/services/HelloWorld。接下来我们在浏览器里面输入http://localhost:8080/test/services/HelloWorld?wsdl就可以查看该服务对应的WSDL文件了。通过http://localhost:8080/test/services/HelloWorld我们可以在客户端访问到其对应的Service及其操作。接下来我们来看看客户端如何创建。

2.3???? 创建客户端

?????? 客户端我们是通过ClientProxyFactoryBean针对于WebService发布的地址及其接口生成一个代理类。

?

Java代码 ?

收藏代码

  1. public?class?Client?{??
  2. ??
  3. ????private?final?static?String?ADDRESS?=?"http://localhost:8080/test/services/HelloWorld";??
  4. ??????
  5. ????public?static?void?main(String?args[])?{??
  6. ????????ClientProxyFactoryBean?cfb?=?new?ClientProxyFactoryBean();??
  7. ????????cfb.setAddress(ADDRESS);//指定发送请求的webService地址??
  8. ????????cfb.setServiceClass(HelloWorld.class);//指定webService对应的接口??
  9. ????????HelloWorld?hw?=?(HelloWorld)cfb.create();//创建一个针对WebService对应接口的代理类??
  10. ????????String?response?=?hw.sayHi("world");//调用代理类的对应方法,发送相关请求到对应Server??
  11. ????????System.out.println(response);??
  12. ????}??
  13. ??????
  14. }??

???

有了针对于WebService的代理类后,我们就可以通过该代理类访问WebService公布的对应方法进行相关操作了。客户端代理类在对WebService进行相关操作时并不是直接的对该WebService进行了操作,而是把请求操作封装为对应的信息发送给WebService发布的地址。WebService服务端在接收到对应的消息后把它解析为对应的参数和操作,之后在服务端对WebService进行操作,之后再将返回值封装为对应信息返回给客户端。客户端解析后返回给代理类。整个过程就是这样进行的。

3?????? 基于Spring的实现

3.1???? 定义WebService类

?????? 基于Spring的简单WebService实现也需要我们定义需要发布为WebService的类。这里跟上面一样,我们定义如下:

?

Java代码 ?

收藏代码

  1. public?interface?HelloWorld?{??
  2. ??
  3. ????public?String?sayHi(String?who);???
  4. ??????
  5. }??

?

Java代码 ?

收藏代码

  1. public?class?HelloWorldImpl?implements?HelloWorld?{??
  2. ??
  3. ????@Override??
  4. ????public?String?sayHi(String?who)?{??
  5. ????????return?"Hi,?"?+?who;??
  6. ????}??
  7. ??
  8. }??

3.2???? 创建服务端

?????? 基于Spring的服务端是通过配置文件来进行的。首先我们需要在web.xml文件中定义一个CXFServlet,用于拦截WebService请求。

?

Xml代码 ?

收藏代码

  1. <web-app?version="2.5"?xmlns="http://java.sun.com/xml/ns/javaee"??
  2. ?????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  3. ?????????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee???
  4. ?????????http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">??
  5. ????<display-name>Archetype?Created?Web?Application</display-name>??
  6. ??
  7. ????<servlet>??
  8. ????????<display-name>cxf</display-name>??
  9. ????????<servlet-name>cxf</servlet-name>??
  10. ????????<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>??
  11. ????????<load-on-startup>1</load-on-startup>??
  12. ????????<init-param>??
  13. ????????????<param-name>config-location</param-name>??
  14. ????????????<param-value>WEB-INF/cxf-servlet.xml</param-value>??
  15. ????????</init-param>??
  16. ????</servlet>??
  17. ??
  18. ????<servlet-mapping>??
  19. ????????<servlet-name>cxf</servlet-name>??
  20. ????????<url-pattern>/services/*</url-pattern>??
  21. ????</servlet-mapping>??
  22. ??
  23. </web-app>??????

在web.xml文件中定义了CXFServlet之后,在Web容器启动的时候,CXFServlet默认会到WEB-INF目录下寻找名叫cxf-servlet.xml的配置文件中定义的WebService进行发布。如果不想CXFServlet在默认位置寻找默认配置文件,我们可以通过CXFServlet的init-param指定参数config-location的值为配置文件的位置。

?

?????? 配置好CXFServlet之后,我们来定义我们的cxf-servlet.xml。cxf-servlet.xml文件的写法是基于Spring的bean配置文件来的。这里我们定义如下:

?

Xml代码 ?

收藏代码

  1. <beans?xmlns="http://www.springframework.org/schema/beans"??
  2. ??????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  3. ??????xmlns:simple="http://cxf.apache.org/simple"??
  4. ??????xmlns:soap="http://cxf.apache.org/bindings/soap"??
  5. ??????xsi:schemaLocation="??
  6. http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.0.xsd??
  7. http://cxf.apache.org/bindings/soap?http://cxf.apache.org/schemas/configuration/soap.xsd??
  8. http://cxf.apache.org/simple?http://cxf.apache.org/schemas/simple.xsd">??
  9. ???
  10. ??<simple:server?id="helloWorld"?serviceClass="com.tiantian.cxftest.sample.simple.HelloWorld"?address="/HelloWorld">??
  11. ????<simple:serviceBean>??
  12. ????????<bean?class="com.tiantian.cxftest.sample.simple.HelloWorldImpl"?/>??
  13. ????</simple:serviceBean>??
  14. ??</simple:server>??
  15. ????
  16. </beans>??

????

在上述文件中我们引入了简单WebService的simple命名空间。该命名空间下主要有两个元素,simple:server和simple:client。Server用于服务端,client用于客户端。上述的address是基于CXFServlet的url-pattern来的。

3.3???? 创建客户端

?????? 基于Spring的客户端的写法也是定义一个配置文件,类似于Spring的配置文件,然后把我们的WebService定义成一个普通的Spring bean对象。这主要有两种方式:第一种是通过simple命名空间来定义,第二种是通过ClientProxyFactoryBean来定义。

?

第一种

?????? 先在配置文件中加上simple的命名空间,之后通过simple:client来定义一个WebService的客户端。这里我们在类路径的根目录下定义一个cxf-client.xml文件,其内容如下所示:

?

Xml代码 ?

收藏代码

  1. <beans?xmlns="http://www.springframework.org/schema/beans"??
  2. ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:simple="http://cxf.apache.org/simple"??
  3. ????xmlns:soap="http://cxf.apache.org/bindings/soap"??
  4. ????xsi:schemaLocation="??
  5. http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.0.xsd??
  6. http://cxf.apache.org/bindings/soap?http://cxf.apache.org/schemas/configuration/soap.xsd??
  7. http://cxf.apache.org/simple?http://cxf.apache.org/schemas/simple.xsd">??
  8. ??
  9. ????<simple:client?id="helloWorld"??
  10. ????????serviceClass="com.tiantian.cxftest.sample.simple.HelloWorld"?address="http://localhost:8080/test/services/HelloWorld"?/>??
  11. ??????????
  12. </beans>??

?

第二种

Xml代码 ?

收藏代码

  1. <!--?ClientProxyFactoryBean?-->????
  2. <bean?id="factoryBean"?class="org.apache.cxf.frontend.ClientProxyFactoryBean">??
  3. ???<property?name="address"?value="http://localhost:8080/test/services/HelloWorld"/>??
  4. ???<property?name="serviceClass"?value="com.tiantian.cxftest.sample.simple.HelloWorld"/>??
  5. </bean>??
  6. ??
  7. <bean?id="hw"?factory-bean="factoryBean"?factory-method="create"/>??

?

? ? ? ?之后我们就可以把它当做一个普通的Spring bean对象来使用了。如:

Java代码 ?

收藏代码

  1. public?class?SpringClient?{??
  2. ??
  3. ????public?static?void?main(String?args[])?{??
  4. ????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("cxf-client.xml");??
  5. ????????HelloWorld?hw?=?context.getBean("helloWorld",?HelloWorld.class);??
  6. ????????String?response?=?hw.sayHi("world");??
  7. ????????System.out.println(response);??
  8. ????????System.out.println(context.getBean("hw",?HelloWorld.class).sayHi("HelloWorld"));??
  9. ????}??
  10. ??????
  11. }?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读