JAVA发布基于cxf框架的webservice

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字符串) 

 

 

 

至此,webservice开发服务端和客户端完结!撒花!!!!!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_62430037

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值