CXF構建webservice解析

1.注意:cxf-3.0以上一般用jdk1.7,1.8版本。

什么是CXF?

? ? ? ?CXF是建立在SOAP協(xié)議上的一個Web service框架。什么是SOAP協(xié)議,簡單來說就是兩個不同項目(開發(fā)語言不同等)通過xml文件來描述要傳輸?shù)臇|西,然后通過HTTP協(xié)議傳輸,接收方把收到的xml解析成需要的對象使用,返回的時候又用xml封裝又通過http協(xié)議傳輸,如此就是SOAP協(xié)議。而CXF就是兩個項目之間為了提供服務,而開發(fā)的一個開源框架,使用CXF框架可以快速搭建web service。CXF就是將項目中暴露出來的接口(服務)包裝起來,成為wsdl,使用方通過wsdl來調用這些服務,跟CXF同樣功能的是XFIRE,AXIAS??墒乾F(xiàn)在都用CXF了,他整合了XFIRE。AXIAS也越來越少人用。

2 .什么是WebService?

Web service是一個平臺獨立的,低耦合的,自包含的、基于可編程的web的應用程序,可使用開放的XML標準通用標記語言下的一個子集)標準描述、發(fā)布、發(fā)現(xiàn)、協(xié)調和配置這些應用程序,用于開發(fā)分布式的互操作的應用程序。

3.構建過程

第一步: 安裝jdk,tomcat,ant,并配置環(huán)境,并在maven里配置jar包;

<?xml version="1.0" encoding="UTF-8"?>

<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>com.majian</groupId>

<artifactId>WebService02</artifactId>

<version>1.0-SNAPSHOT</version>

<packaging>war</packaging>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.source>1.7</maven.compiler.source>

<maven.compiler.target>1.7</maven.compiler.target>

<cxf.version>3.0.1</cxf.version>

<spring.version>4.3.12.RELEASE</spring.version>

</properties>

<dependencies>

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

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.31</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>wsdl4j</groupId>

<artifactId>wsdl4j</artifactId>

<version>1.6.2</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-transports-http-jetty</artifactId>

<version>3.1.6</version>

</dependency>

<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-jetty</artifactId>

<version>${cxf.version}</version>

</dependency>

</dependencies>

</project>


為什么要用到ant這個工具呢?Ant做為一種工具已經廣泛被使用,并且歷史悠久。

使用ant的內置命令,可以編譯java源文件(javac),運行java文件(java),給class文件打包(jar、war、ear),

也可以創(chuàng)建(mkdir)、刪除(del)、拷貝(copy),甚至可以使用ant執(zhí)行sql文件。

由于ant是用xml語言寫成的文件,并取默認名為build.xml文件。

所以,今后大家應該在見到名為build.xml文件時知道這是一個ant的文件。

第二步:Web.xml中添加該段配置,org.apache.cxf.transport.servlet.CXFServlet用于在web容器中發(fā)布WebService。

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

<display-name>Archetype Created Web Application</display-name>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/spring-context.xml</param-value>

</context-param>

<listener>

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

</listener>

<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>/services/*</url-pattern>

</servlet-mapping>

</web-app>


spring-context.xml中添加 implementor引用上面的bean,address和路徑中問號前的訪問相同。

<?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:jaxrs="http://www.springframework.org/schema/c"

? ? ? xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.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-*.xml" />

<import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />

<jaxws:endpoint id="sumAndMul" implementor="com.majian.service.impl.CountServiceImpl"

? ? ? ? ? ? ? ? address="/sumAndMul"></jaxws:endpoint>

</beans>


第三步:編寫接口CalculatorService.java,這個接口就是提供web服務的那個接口,里面的方法都是提供給人家調用。

package com.majian.service;

import javax.jws.WebService;

import java.math.BigDecimal;

/**

* Created by majian on 2018/9/14.

*/

@WebService

public interface CountService {

public String result(BigDecimal[] factors);

}


第四步:編寫接口的實現(xiàn)類CountServiceImpl.java,類里面要實現(xiàn)接口的方法。

package com.majian.service.impl;

import com.majian.service.CountService;

import javax.jws.WebService;

import java.math.BigDecimal;

/**

* Created by majian on 2018/9/14.

*/

@WebService(endpointInterface ="com.majian.service.CountService")

public class CountServiceImplimplements CountService{

@Override

? ? public String result(BigDecimal[] factors) {

BigDecimal add=new BigDecimal("0");

BigDecimal mul=new BigDecimal("1");

for (BigDecimal tmp :factors){

mul=mul.multiply(tmp);

add = add.add(tmp);

}

return "兩個數(shù)的和sum="+add.toString()+"\n 兩個數(shù)的積mul="+mul.toString();

}

}

第五步:調用服務

可以通過tomcat服務器,直接配合就行,啟動地址http://localhost:8081/{項目名}/services:

可以通過main方法,如下:

package com.majian.controller;

import com.majian.service.impl.CountServiceImpl;

import javax.xml.ws.Endpoint;

/**

* Created by majian on 2018/9/15.

*/

public class Server {

public static void main(String[] args) {

System.out.println("start Web...");

CountServiceImpl countService=new CountServiceImpl();

String address="http://localhost:8081/web/services";

Endpoint publish = Endpoint.publish(address, countService);

System.out.println("End Web....");

}

}


第六步:生成客戶端代碼

wsdl2java?http://localhost:8081/web/services/sumAndMul?wsdl

D:\workspace\WebClient02\src\main\java>wsdl2java http://localhost:8081/web/services/sumAndMul?wsdl

第七步:編寫客戶端代碼

package com.majian.service;

import com.majian.service.impl.CountServiceImplService;

import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.List;

/**

* Created by majian on 2018/9/14.

*/

public class Client {

public static void main(String[] args) {

CountServiceImplService factory =new CountServiceImplService();

CountService service = factory.getCountServiceImplPort();

List list=new ArrayList();

BigDecimal big1 =new BigDecimal(38);

BigDecimal big2=new BigDecimal(42);

list.add(big1);

list.add(big2);

String s = service.result(list);

System.out.println(s);

}

}


結果:
兩個數(shù)的和sum=80

兩個數(shù)的積mul=1596

服務端項目結構:


服務端結構

客戶端結構

客戶端結構

代碼后期會傳到GitHub上。。。。。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容