使用CXF开发WebService

CXF优点及功能

优点

Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,我们可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM® WebSphere® 或 BEA WebLogic。

功能

该框架提供了以下功能[1]

  • Web 服务标准支持:CXF 支持以下 Web 服务标准:
    • Java API for XML Web Services (JAX-WS)
    • SOAP
    • Web 服务描述语言(Web Services Description Language ,WSDL)
    • 消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)
    • WS-Basic Profile
    • WS-Addressing
    • WS-Policy
    • WS-ReliableMessaging
    • WS-Security
  • 前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端。
  • 工具支持:CXF 提供了用于在 Java Bean、Web 服务和 WSDL 之间进行转换的不同工具。它提供了对 Maven 和 Ant 集成的支持,并无缝地支持 Spring 集成。
  • RESTful 服务支持:CXF 支持代表性状态传输(Representational State Transfer,RESTful )服务的概念,并支持 Java 平台的 JAX-RS 实现。(本系列的第 2 部分将提供有关 RESTful 服务的更多信息。)
  • 对不同传输和绑定的支持:CXF 支持不同种类的传输,从 XML 到逗号分隔值 (CSV)。除了支持 SOAP 和 HTTP 协议绑定之外,它还支持 Java Architecture for XML Binding (JAXB) 和 AEGIS 数据绑定。
  • 对非 XML 绑定的支持:CXF 支持非 XML 绑定,例如 JavaScript Object Notation (JSON) 和 Common Object Request Broker Architecture (CORBA)。它还支持 Java 业务集成(Java Business Integration,JBI)体系架构和服务组件体系架构(Service Component Architecture,SCA)。

CXF环境搭建

在初次搭建CXF环境时,作为一个rookie的我在网上也查了很多资料。但是结果仍是一头雾水,因为不清楚什么文件要放在什么路径下,所以我把我的结构图发上来希望有所帮助。
代码结构

其中:

  • 目录src用来存放DAO层、服务端及工具类的接口类和实现类
  • 目录WEB-INF下的lib文件夹用来存放CXF服务所依赖的包
  • 配置文件applicationContext-server.xml使用 JAX-WS 前端将该服务类定义为 Spring Bean
  • 配置文件web.xml用来Spring 和 CXF

因此我在开发CXF服务时,进行的步骤是:

  1. 将服务所依赖的包放到lib目录下。因为这个WebService的作用是查询mysql数据库中的数据,所以有个用来连接mysql数据库的jar包(mysql-connector-java-5.1.39.zip),其他所有包都可从Apache CXF官方网站下载并从解压缩后的lib目录中找到;
    这里写图片描述
  2. 创建服务接口类,并定义一个将公开为 Web 服务的方法;
  3. 创建服务实现类,并将其标注为 Web 服务;
  4. 创建 applicationContext-server.xml;
  5. 创建 web.xml 。

CXF服务端测试代码

1.服务接口类:定义getNameById为Web服务的方法。

package sample.ws.cxf.service;

import javax.jws.WebService;

@WebService
public interface ISampleService {
    public String getNameById(long id);
}

2.服务实现类:其中WebService注解中endpointInterface放该服务类接口的路径, serviceName指调用该接口的别名是什么,在后面的applicationContext-server.xml配置中会用到。

package sample.ws.cxf.service.impl;

import javax.jws.WebService;
import sample.ws.cxf.dao.impl.StudentDaoImpl;
import sample.ws.cxf.service.ISampleService;

@WebService(endpointInterface = "sample.ws.cxf.service.ISampleService", serviceName = "sampleService")
public class SampleServiceImpl implements ISampleService {

    @Override
    public String getNameById(long id) {

        StudentDaoImpl std = new StudentDaoImpl();
        String name = std.getNameById(id);

        return "Hello: "  + name;
    }
}

3.DAO层接口

package sample.ws.cxf.dao;

public interface IStudentDao {
    public String getNameById(long id);
}

4.DAO层实现

package sample.ws.cxf.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import javax.jws.WebService;
import sample.ws.cxf.dao.IStudentDao;
import sample.ws.cxf.util.DBHelper;

public class StudentDaoImpl implements IStudentDao {

    static String sql = null;
    static DBHelper db1 = null;
    static ResultSet ret = null;

    @Override
    public String getNameById(long id) {
        sql = "select name from student where id='"+id+"'";
        db1 = new DBHelper(sql);
        String name = null;
        try {
            ret = db1.pst.executeQuery();
            while(ret.next()) {
                name = ret.getString(1);
            }
            ret.close();
            db1.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return name;
    }
}

5.工具类实现,用来连接数据库

package sample.ws.cxf.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DBHelper {
    public static final String url = "jdbc:mysql://127.0.0.1/demo";
    public static final String name = "com.mysql.jdbc.Driver";
    public static final String user = "root";
    public static final String password = "root";

    public Connection conn = null;
    public PreparedStatement pst = null;

    public DBHelper(String sql) {
        try {
            Class.forName(name);
            conn = DriverManager.getConnection(url,user,password);
            pst = conn.prepareStatement(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            this.conn.close();
            this.pst.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

6.配置文件applicationContext-server.xml:文件中的< jaxws:endpoint >标记将 SampleServiceImpl Web 服务指定为 JAX-WS 端点,这实际上意味着 CXF 在内部使用 JAX-WS 来发布此 Web 服务。

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

    <!-- 其中endpoint的id为SampleServiceImpl中WebService注解定义的serviceName -->
    <!-- implementor指服务实现类的路径,address指在url中调用该服务的路径 --> 
    <jaxws:endpoint id="sampleService" 
     implementor="sample.ws.cxf.service.impl.SampleServiceImpl" 
     address="/sampleService" />         
</beans>

7.配置文件web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name>CXFDemo</display-name>

  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext-server.xml</param-value>
  </context-param>

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

  <!-- 注册 CXFServlet 以处理来自客户端程序的所有请求 -->
  <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>

通过tomcat运行该项目后,可以通过以下地址:http://localhost:8080/CXF-WS-Demo2/ws/sampleService?wsdl来访问该服务。其中CXF-WS-Demo2是指eclipse中的项目名称,ws是在web.xml中url-pattern处指定,sampleService是在applicationContext-server.xml中address处指定。

使用SoupUI进行测试

最后使用SoupUI来测试发布的Web Service,步骤是:
1.通过File->New SOAP Project来新建一个Project,并将http://localhost:8080/CXF-WS-Demo2/ws/sampleService?wsdl放入Initial WSDL中
这里写图片描述

2.依次点开CXF-DEMO->sampleServiceSoapBinding->getNameById->Requst 1,结果如下所示
这里写图片描述

3.最后在arg0参数处输入数据库表中的Id,运行后得到如下结果表示成功(当然前提是数据库中有数据)
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值