webservice搭建:开发语言——JAVA,使用Spring整合CXF开发webservice服务
一、webservice简介
Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。 XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。 Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。 WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。 UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
(本次开发的目的是接受xml文档数据并解析写入数据库,与其他系统进行数据交互)
二、环境准备
1.开发环境使用2021版idea集成开发,需要导入的pom依赖:
<!--cxf需要的依赖-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.0.1</version>
</dependency>
<!--数据库需要的依赖mysql和sqlservice的-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
<scope>compile</scope>
</dependency>
<!--durid德鲁伊连接池的依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>
<!--dom4j解析xml文档的依赖-->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!--日志框架以及其他的依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--slf4j日志门面"-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<!--slf4j适配器"-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.14.0</version>
</dependency>
<!-- junit 开发包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- 指定打包位置依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 指定web.xml的路径 -->
<webXml>web\WEB-INF\web.xml</webXml>
<!-- 指定jsp、js、css的路劲 -->
<warSourceDirectory>web</warSourceDirectory>
</configuration>
</plugin>
2.此处多嘴一句,配置cxf客户端需要wsdl2java下载文档说明书方法以及配置jdk和tomcat(为了防止自己以后忘记)
(本人小白,需要通过jar包方式) 下载压缩包apache-cxf-2.7.11.zip 链接:百度网盘 请输入提取码 提取码:yxlx
2.1 配置环境变量
变量名:CXF_HOME
变量值(解压后放的位置):E:\apache-CXF\apache-cxf-2.7.11
2.2 配置jdk1.8环境
变量名:JAVA_HOME
变量值(解压后放的位置):D:\jdk1.8
2.3 配置tomcat环境
变量名:CATALINA_HOME
变量值(解压后放的位置):E:\tomcat8.5\apache-tomcat-8.5.89
2.4 最后都需要在path上加上
%JAVA_HOME%\bin
%JAVA_HOME\jre\bin(java环境运行不起来可以在加这个)
%CXF_HOME%\bin
%CATALINA_HOME%\bin
到此环境准备完毕!!!
三、开发WebService服务端,发布一个webservice服务(本文示例为发布一个可以接收客户端传来的xml文档然后解析并写入数据库的方法)
1.使用发布服务工厂方式进行发布:
1.1 在开发之前我们先来了解一下各注解的意思
@WebService:
作用在具体类上。而不是接口。 一个类只有添加了此注解才可以发布为一个web服务。 一个添加了此注解的类,必须要至少包含一个实例方法。静态方法和final方法不能被发布为服务方法。 WebService注解包含以下参数: String endpointInterface --服务端点接口的名称, String name -- webservice的名称, String portName -- webservice的端口名称, String serviceName --webservice的服务名称, String targetNamespace --命名空间, String wsdlLocation --服务的预定义wsdl位置,
@WebMethod:
此注解用在方法上,用于修改对外暴露的方法。 1.String action --此操作的动作 2.boolean exclude --将方法标记为不作为web方法公开 3.String operationName --与此方法匹配的wsdl:operation的名称
@WebResult:
@WebResult用于定制返回值到WSDL的映射 1.String name --返回值的名称 2.String partName --表示此返回值的wsdl:part的名称 3.String targetNamespace --返回值的XML名称空间
@WebParam:
@WebParam用于定制返回值到WSDL的映射 1.WebParam.Mode mode --参数的流向(IN,OUT或INOUT之一) 2.String name --参数的名称 3.String partName --表示参数的wsdl:part的名称 4.String targetNamespace --参数的XML名称空间
包结构如下:
1.2 首先定义一个接口 WService(注意:这只是一个示例,不能直接运行,需要自己修改数据库那一块代码,否则报错,如果只是想测试是否发布成功,则把数据库的代码删除,查看客户端返回值即可)
使用@WebService注解,声明这是一个webservice服务
package webcxf.service.Iwervice;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding;
/**
* 对外发布的接口
*/
@WebService
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
public interface WService {
/**
* 发布接口的方法
*/
public String xmlservice(@WebParam(name="xmlStr")String xmlStr);
}
1.3 定义此接口的实现方法ServiceImpl,进行解析xml文档写入数据库并返回指定格式的xml文档字符串,日志使用的框架是jdk自带的jul(实现方法自己设置)
package webcxf.service.impl;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import webcxf.service.Iwervice.WService;
import webcxf.service.date.durconn;
import javax.jws.WebMethod;
import javax.ws.rs.core.Response;
import java.io.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.*;
import java.util.logging.Formatter;
public class ServiceImpl implements WService {
public static final Logger logger = Logger.getLogger("ServiceImpl");
//获取当前部署当前项目的路径
public static final String projectPath = System.getProperty("user.dir");
//获取当前系统日期,把客户端传如的文件进行保存
@WebMethod
public String xmlservice(String xmlStr) {
//获取系统时间并保存xml源文件以xml+当前系统时间命名
SimpleDateFormat ntime = new SimpleDateFormat("yyyyMMddHHmmss");
SimpleDateFormat ntime2 = new SimpleDateFormat("yyyyMMdd");
String ntime1 = ntime.format(System.currentTimeMillis());
String ntime3 = ntime2.format(System.currentTimeMillis());
//获取项目文件地址,创建存放日志的路径,参照路径——D:\IDEAxiangmu\CXF-LF-Service1\var\errorlog按照天数来进行记录
LogPath.mkdirFile();
//指定存放的路径和名称
String ERROR_LOG_FILE = projectPath +File.separator+ "logs" +File.separator+ ntime3+"error"+File.separator+ntime3+"错误日志.log";
String WARNING_LOG_FILE = projectPath +File.separator+ "logs" +File.separator+ ntime3+"warning"+File.separator+ntime3+"警告日志.log";
String LOG_FILE = projectPath +File.separator+ "logs" +File.separator+ ntime3+"Info"+File.separator+ntime3+"运行日志.log";
logger.setLevel(Level.ALL);
logger.info("开始记录日志");
try {
logger.info("开始写入文件");
FileHandler fileHandler = new FileHandler(LOG_FILE,true);
//logger.addHandler(fileHandler); // 将FileHandler添加到Logger中
SimpleFormatter formatter = new SimpleFormatter();
fileHandler.setFormatter(new MyFormatter());
logger.addHandler(fileHandler);
// 创建并配置警告日志的FileHandler
FileHandler warningFileHandler = new FileHandler(WARNING_LOG_FILE);
warningFileHandler.setLevel(Level.WARNING);
warningFileHandler.setFormatter(new SimpleFormatter());
logger.addHandler(warningFileHandler);
// 创建并配置错误日志的FileHandler
FileHandler errorFileHandler = new FileHandler(ERROR_LOG_FILE);
errorFileHandler.setLevel(Level.SEVERE);
errorFileHandler.setFormatter(new SimpleFormatter());
logger.addHandler(errorFileHandler);
} catch (IOException e) {
logger.severe("写入失败"+e);
}
logger.severe("this is server");
logger.warning("this is waring");
String xmlpath = projectPath +File.separator+"xmlsources";
File xmlfile = new File(xmlpath);
if (!xmlfile.exists()){
xmlfile.mkdir();
}
File file = new File(projectPath +File.separator+"xmlsources"+File.separator+ "xml"+ntime1+".txt");
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file, true));
bw.write(xmlStr);
logger.info("xml源文件已保存:"+projectPath +File.separator+"xmlsources"+File.separator+ "xml"+ntime1+".txt");
bw.close();
}catch (Exception e){
logger.severe("将接收到的xml文件保存到目录失败"+e);
}
UUID uuid = UUID.randomUUID();
String guid = uuid.toString();
try {
logger.info("接口xmlservice开始处理数据");
//1.创建sax解析器
SAXReader saxReader = new SAXReader();
//2.设置被解析的文件
Document document = parseXMLString(xmlStr);
//3.获取根节点
Element root = document.getRootElement();
//System.out.println(root.getName());
logger.info("开始解析文件" + document);
//解析xml文档,这只是一个示例
List<Element> cList = root.elements();
for (Element c : cList) {
//System.out.println(c.getName());
List<Element> cList1 = c.elements();
for (Element c1 : cList1) {
//System.out.println("1\t"+c1.getName());
List<Element> cList2 = c1.elements();
for (Element c2 : cList2) {
//System.out.println("2\t"+c2.getName());
List<Element> cList3 = c2.elements();
for (Element c3 : cList3) {
//System.out.println("3\t"+c3.getName());
List<Element> cList4 = c3.elements();
for (Element c4 : cList4) {
//System.out.println("4\t"+c4.getName());
List<Element> cList5 = c4.elements();
for (Element c5 : cList5) {
//System.out.println("5\t"+c5.getName());
List<Element> cList6 = c5.elements();
for (Element c6 : cList6) {
//System.out.println("6\t"+c6.getName());
List<Element> cList7 = c6.elements();
for (Element c7 : cList7) {
//System.out.println("7\t"+c7.getName());
List<Element> cList8 = c7.elements();
for (Element c8 : cList8) {
// System.out.println("8\t"+c8.getName());
List<Element> cList9 = c8.elements();
for (Element c9 : cList9) {
//System.out.println("9\t"+c9.getName());
List<Element> cList0 = c9.elements();
for (Element c0 : cList0) {
List<Element> cList11 = c0.elements();
for (Element c11 : cList11) {
//System.out.println("11\t"+c11.getName());
List<Element> cList12 = c11.elements();
for (Element c12 : cList12) {
//System.out.println("12\t"+c12.getName());
}
}
}
}
}
}
}
}
}
}
}
}
}
} catch (Exception e) {
logger.severe("解析出错:"+e);
} finally {
String FileName = projectPath +File.separator+"xmlsources"+File.separator+ "xml"+ntime1+".txt";
logger.info("解析完成!");
//插入数据库
Properties properties = new Properties();
try {
//写好你的数据库配置文件
FileInputStream fis = new FileInputStream("/src/main/resources/druid.properties");
String path =projectPath+"/src/main/resources/druid.properties";
properties.load(fis);
}catch (IOException e){
logger.severe("读取数据库配置文件出错"+e);
}
// 从Properties对象中获取用户名密码驱动
logger.info(projectPath);
logger.info("从配置文件获取数据库代理信息");
String username = properties.getProperty("druid.username");
String password = properties.getProperty("druid.password");
String url = properties.getProperty("druid.url");
logger.info("开始登录数据库:"+url);
Connection conn = durconn.CreateJdbcSqlserverConnect(url, username, password);
PreparedStatement ps=null;
Statement statm = null;
String nu="null";
if (conn == null){logger.severe("连接数据库失败"+conn);}
logger.info("开始插入数据");
String sql = "insert into HisRx_Org values("")";
try{
statm = conn.createStatement();
int rowsAffected = statm.executeUpdate(sql);
logger.info("插入完成!");
System.out.println("数据插入成功!影响行数:" + rowsAffected);
} catch (Exception e) {
logger.severe("插入数据异常"+e);
}finally {
try {
conn.close();statm.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
// 关闭日志Handler
for (Handler handler : logger.getHandlers()) {
handler.close();
}
//判断客户端是否传入数据成功,返回200则成功
int re = Response.status(Response.Status.OK).build().getStatus();
return re;
}
1.4 创建durid连接池的连接类及方法名称durconn
package webcxf.service.date;
import com.alibaba.druid.pool.DruidDataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class durconn {
//建立连接
public static Connection CreateJdbcSqlserverConnect(String AConnStr, //jdbc:sqlserver://127.0.0.1:3001;databaseName=testdb
String AAccount, //登录账号
String Apwd //密码
){
Connection conn=null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn= DriverManager.getConnection(AConnStr,AAccount,Apwd);//连接到目标数据库
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
conn=null;
} catch (SQLException e) {
System.out.println(e.getMessage());
conn=null;
}
return conn;
}
}
1.5 定义创建日志文件夹类的方法LogPath(先在项目运行目录下判断如果没有logs文件夹就创建并在此目录下创建指定为年月日+日志级别的文件夹,一共三个,分别为info,error,waring)
package webcxf.service.impl;
import org.junit.Test;
import java.io.File;
import java.text.SimpleDateFormat;
public class LogPath {
@Test
public static void mkdirFile(){
String projectPath = System.getProperty("user.dir");//获取项目路径
SimpleDateFormat ntime2 = new SimpleDateFormat("yyyyMMdd");
String ntime3 = ntime2.format(System.currentTimeMillis());
//创建失败目录
String LogPath = projectPath + File.separator + "logs";
String LogPath1 = projectPath + File.separator + "logs"+ File.separator + ntime3+"error";
File LogFile = new File(LogPath);File LogFile1 = new File(LogPath1);
System.out.println(LogPath1);
if (!LogFile.exists()){
if (!LogFile1.exists()) {
LogFile.mkdir(); LogFile1.mkdir();
}
}else {
if (!LogFile1.exists()) {
LogFile1.mkdir();
}
}
//创建警告目录
String LogPathwar = projectPath + File.separator + "logs";
String LogPathwar1 = projectPath + File.separator + "logs"+ File.separator + ntime3+"warning";
File LogFilewar = new File(LogPathwar);File LogFilewar1 = new File(LogPathwar1);
System.out.println(LogPathwar1);
if (!LogFilewar.exists()){
if (!LogFilewar1.exists()) {
LogFilewar.mkdir(); LogFilewar1.mkdir();
}
}else {
if (!LogFilewar1.exists()) {
LogFilewar1.mkdir();
}
}
//创建运行目录
String LogPathIn = projectPath + File.separator + "logs";
String LogPathIn1 = projectPath + File.separator + "logs"+ File.separator + ntime3+"Info";
File LogFilewarIn = new File(LogPathIn);File LogFilewarIn1 = new File(LogPathIn1);
System.out.println(LogPathIn1);
if (!LogFilewarIn.exists()){
if (!LogFilewarIn1.exists()) {
LogFilewarIn.mkdir(); LogFilewarIn1.mkdir();
}
}else {
if (!LogFilewarIn1.exists()) {
LogFilewarIn1.mkdir();
}
}
}
}
1.6 编写发布服务的实现类fbservice,测试是否可以进行发布
package webcxf.service.FBService;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import webcxf.service.Iwervice.WService;
import webcxf.service.impl.ServiceImpl;
import java.util.logging.Logger;
public class fbservice {
private static final Logger logger = Logger.getLogger("fbservice");
public static void main(String[] args) {
try {
//发布服务的工厂
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
//设置服务地址
factory.setAddress("http://localhost:8101/ws/Lf");
factory.setServiceClass(WService.class);
//设置服务类
factory.setServiceBean(new ServiceImpl());
//添加日志输入输出拦截器,观察soap请求,soap响应内容
//factory.getInInterceptors().add(new LoggingInInterceptor());
// factory.getOutInterceptors().add(new LoggingOutInterceptor());
// logger.info(String.valueOf(factory.getInInterceptors().add(new LoggingInInterceptor())));
//发布服务
factory.create();
logger.info("发布成功");
System.out.println("发布成功,端口8101");
}catch (Exception e){
logger.severe("发布失败,异常"+e);
}
}
}
运行结果如下:
运行成功之后我们就可以访问说明书地址了,把我们发布的地址复制,并在后面加上?wsdl——http://localhost:8101/ws/Lf?wsdl
在此啰嗦两句,关于说明书地址如何查看:
服务视图,webservice的服务结点,它包括了服务端点
为每个服务端点定义消息格式和协议细节
服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过 binding指向portType
定义一个操作(方法)的数据参数(可有多个参数)
定义 web service 使用的全部数据类型
这里通过说明书我们就找到了发布服务的接口以及方法(这里是通过类的方式来发布服务,下面讲讲如何通过spring来发布)
2.通过spring方式来发布webservice,首先我们要添加框架支持
然后我们就可以看到有一个web文件了
2.1 项目结构如下(最重要的就是这两个文档)
2.2 applicationContext.xml,在此文件里面设置我们的bean
bean id="ivfgetxml",id名字可以随便取。
class="webcxf.service.impl.ServiceImpl",class为实现类的路径。
address="/Lf",address为服务http://localhost:8101/ws/Lf的后缀名称。
serviceClass="webcxf.service.Iwervice.WService",serviceClass为服务的接口类路径。
ref bean="ivfgetxml",需要和id名对应
<?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://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
<bean id="ivfgetxml" class="webcxf.service.impl.ServiceImpl"></bean>
<jaxws:server address="/Lf" serviceClass="webcxf.service.Iwervice.WService">
<jaxws:serviceBean>
<ref bean="ivfgetxml"></ref>
</jaxws:serviceBean>
</jaxws:server>
</beans>
2.3 web.xml 在在里面设置服务发布的servlet
<param-value>classpath:applicationContext.xml</param-value>这里的文件是我们刚刚配置的applicationContext.xml文件
listener 设置监听器
<url-pattern>/ws/*</url-pattern> 服务的地址ws的设置 》http://localhost:8101/ws/Lf
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/log4j2.xml</param-value>
</context-param>
</web-app>
2.4 至此,我们的文件配置完毕,需要到tomcat里面运行,接下来是部署到我们的tomcat里面
第一步,添加tomcat
第二步,部署工件,设置端口
第三步,运行tomcat发布服务
运行成功之后会跳出这个界面
然后输入我们的地址进行访问
发布成功!!!
2.5 使用tomcat的启动脚本进行发布
第一步,将我们的项目进行打包,需要打war包,打包成功之后会出现target目录,我们的war包就在里面,需要注意的是:我们进行maven打包时要注意顺序
打完包要检查里面是否已有我们的项目内容和结构
第二步,到我们tomcat安装目录下的webapps里面,把我们打好的包放上去
在这里我们设置一下端口和重置一下tomcat的登录账号密码,防火墙入站规则要添加一下端口,否则会访问失败,也不要使用默认的8080
首先,防火墙新增入站端口,把需要开通的端口添加上去即可,我的是8101
其次,是重置我们tomcat的账号和密码,找到conf目录,找到tomcat-users.xml,把user打开
然后是设置一下我们的端口为8101,找到conf目录,找到server.xml,把8080改掉
第三步,启动我们的运行脚本, bin目录下的startup.bat
第四步,查看是否已经部署完成,访问我们的tomcat,登录localhost:8101,之后可以看到这个界面,点击这个查看我们部署的项目
输入我们刚才设置的
登录进行就可以看到我们的项目工程
访问我们的web项目
至此,服务端的开发和发布完成!!!! 注意:如果你的tomcat没有运行起来或者报一下错,检查一下,可能是你的tomcat的lib里面没有相关的jar包,要把相关的jar包添加进去,lib文件我已放入链接
四、开发客户端
1.开发环境开头已经已部署好,这里依然使用idea作为开发环境,基于cxf框架的webservice使用同一种语言就好办了,我们不需要下载说明书即可访问。 值得注意的是,使用此方法需要开发环境和语言是一样的才可以,这里只是测试,首先,我们要保证所依赖的jar包或pom依赖已添加,其次我们要保证包的 结构和方法都是一致的
1.1 新建一个maven项目,按照服务端的包结构进行创建,名字也要一致
客户端
服务端
1.2 创建完成之后编写和服务端一样的接口和方法WService
package webcxf.service.Iwervice;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding;
/**
* 对外发布的接口
*/
@WebService
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
public interface WService {
/**
* 发布接口的方法
*/
public String xmlservice(@WebParam(name="xmlStr")String xmlStr);
}
1.3 创建一个主类进行服务的方法调用及数据传输Client
xmlString需要定义自己要传输的内容,格式必须要和服务端的一致,设置之前要沟通好格式内容。
package itheima;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import webcxf.service.Iwervice.WService;
import javax.jws.WebMethod;
public class Client {
@WebMethod
public static void main(String[] args) throws Exception {
//String xmlString = "D:/IDEAxiangmu/CXF-ivf-Client/src/JH0308-1.xml";
String xmlString = "";
//服务接口访问地址http://192.168.0.23:8080/Ws/hello
//创建代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//设置远程访问对象192.168.0.23
factory.setAddress("http://localhost:8101/CXF_LF_Service/ws/Lf");
//factory.setAddress("http://localhost:8101/Ws/Lf");
//设置接口类型
factory.setServiceClass(WService.class);
//对接口生成代理对象cglib子类代理[java代理,1.静态代理;2.动态代理(jdk接口代理,cglib子类代理)]
WService service = factory.create(WService.class);
//代理对象
// System.out.println(webcxf.service.getClass());
//远程访问服务端方法
String n = service.xmlservice(xmlString);
System.out.println(n);
}
}
1.4 运行之后即可看到服务端给我们的返回结果(这里需要自定义,我设置服务端返回的结果是一段xml字符串)