最近工作中需要对接接口,用到了webservice技术,这里记录一下创建服务端和客户端项目的步骤,

demo地址:

  https://github.com/576016935/webServiceClient

  https://github.com/576016935/webService

 

创建服务端:

  1,打开idea,file-->new-->project,最后点击finish。

 

 

 

 2,创建完成后的结构图如下,会自动给新建一个类,这里我就不用这个了,自己新建一个可以接收xml格式报文数据、并且解析数据、插入到数据库的类

 

 

 3,新建的类,这里有报错,需要把解析xml格式的jar引入进来。dom4j-1.6.1.jar,服务端连接数据库时会报错,需要把数据库的mysql-connector-java-8.0.19.jar包放在Tomcatlib文件夹下。

两个jar包:

链接:https://pan.baidu.com/s/1EL5yGMuM0zlRPq1EWG49OA
提取码:lhnz

package example;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import javax.jws.WebService;
import javax.xml.ws.Endpoint;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@WebService
public class TestService {

/*    public static void main(String[] args) {
        *//**
         * 参数:1,本地的服务地址;
                2,提供服务的类;
                发布成功后 在浏览器输入 http://192.168.51.23:8080/Service/TestService?wsdl
         *//*
        Endpoint.publish("http://192.168.51.23:8080/Service/TestService",new TestService());
        System.out.println("发布成功");
        //getInsert(TestAxis.getRequestData("pushProToUtrl", true, "1466587993913"));


    }*/

    public String getInsert(String xml){
        System.out.println(xml);
        Map<String,Object> map = new HashMap<>();
        String name = "";
        Document doc = null;
        try {
            doc = DocumentHelper.parseText(xml); // 将字符串转为XML
            Element rootElt = doc.getRootElement(); // 获取根节点

/*            Iterator iter = rootElt.elementIterator("Body"); // 获取根节点下的子节点Body
            // 遍历Body节点
            while (iter.hasNext()) {
                Element recordEle = (Element) iter.next();
                String title = recordEle.elementTextTrim("title"); // 拿到head节点下的子节点title值
                System.out.println("title:" + title);
                Iterator iters = recordEle.elementIterator("script"); // 获取子节点head下的子节点script
                // 遍历Header节点下的Response节点
                while (iters.hasNext()) {
                    Element itemEle = (Element) iters.next();
                    String username = itemEle.elementTextTrim("username"); // 拿到head下的子节点script下的字节点username的值
                    String password = itemEle.elementTextTrim("password");
                    System.out.println("username:" + username);
                    System.out.println("password:" + password);
                }
            }*/

            Iterator iterss = rootElt.elementIterator("Body"); ///获取根节点下的子节点body
            // 遍历body节点
            while (iterss.hasNext()) {
                Element recordEless = (Element) iterss.next();
                String sysPass = recordEless.elementTextTrim("sysPass"); // 拿到body节点下的子节点sysPass值
                System.out.println("sysPass:" + sysPass);
                Iterator itersElIterator = recordEless.elementIterator("prop"); // 获取子节点body下的子节点prop
                // 遍历prop节点下的Response节点
                while (itersElIterator.hasNext()) {
                    Element itemEle = (Element) itersElIterator.next();

                    map.put("projectName",itemEle.elementTextTrim("projectName")); // 拿到body下的子节点prop下的字节点的值
                   

                    System.out.println(map);

                    //加载驱动程序
                    Class.forName("com.mysql.cj.jdbc.Driver");
                    //连接数据库
                    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/oa?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true", "root", "root");

                    //编写SQL
                    PreparedStatement preparedStatement = connection.prepareStatement("insert into XML (projectName,opening_area,construction) VALUE (?,?,?)");

                    //占位符,从1开始
                    preparedStatement.setString(1, (String) map.get("projectName"));
                    //返回的结果是一个整数表示该操作影响了数据表中的几条数据
                    int i = preparedStatement.executeUpdate();

                    if(i>0){
                        name = "{\"msg\":\"true\",\"message\":\"新增成功\"}";
                    }else{
                        name = "{\"msg\":\"false\",\"message\":\"新增失败\"}";
                    }
                    //关闭
                    preparedStatement.close();
                    connection.close();

                    System.out.println(i);

                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return name;
    }
}

4,把这个包放入lib文件夹下,

 

 

 5,然后点击idea右上角的按钮,或者Ctrl+Alt+shift+s,最后点击+号找到刚刚复制进去放到lib文件里的jar包,最后点击OK

 

 

 

 

 

 

 

 

 

 6,新建完成后在配置文件把刚刚添加的类配置一下。默认是有一个helloworld的,复制一下,名字改成刚刚创建的类名,不添加的话后面操作无法自动生成WSDL文件。

 

 

 7,生成wsdl,右键点击刚刚新建的类找到webservice,如图,最后点击OK,会自动生成一个WSDL文件

 

 

如果这里报这个错,就回来第六步看看有没有配置新建的类,配置了还报错的话重新编译一下。

 

 

 8,最后就是配置Tomcat了,这里就不作演示了。。。 配置完成后通过Tomcat启动,这个时候访问还是会报错。还需要在这里配置一下,因为还要给部署的 Artifact 添加 Apache Axis 包的依赖。最后点击OK。重新启动

 

 9,浏览器访问localhost:8080/services 出现如下就成功了,下面有两个类,一个是创建项目时自动附带的,另一个就是自己手动新建的

 

 

地址栏输入http://localhost:8080/services/TestService?wsdl ,也可以点击上图的TestService接口,显示如下

 

 

 

 

 至此,服务端创建OK,下面开始创建客户端,调用服务端并传送xml数据

 

客户端:

  1,点击file-->new--project,往下拉找到webservice Client,并勾选,点击next。最后点击finish

 

 

 

 

  2,创建成功会弹出如下弹框,也可以关掉,手动右键点击项目下的src选择webservice打开。地址栏找到刚刚创建的服务端生成的WSDL文件,包名可以选择也可以自己手动填写,会自动创建的。

 

 

 

 

 

 

 

 

 

 

   3,最后生成了如下文件

 

 

 4,新建两个类,一个用来调用服务端,另一个用来生成xml格式报文

  调用类:

package test;


import com.webService.TestServiceServiceLocator;
import com.webService.TestService_PortType;

import javax.xml.rpc.ServiceException;
import java.rmi.RemoteException;

public class WebService {
    public static void main(String[] args) {
        try {
            //这里new的是生成的服务端代码,在通过地址去调用服务端。
            TestService_PortType portType = new TestServiceServiceLocator().getTestService();
                System.out.println("生成的xml:"+TestXML.getTestXML());
               String success = portType.getInsert(TestXML.getTestXML());
               System.out.println("调用服务端接口:"+success);

        } catch (ServiceException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }

    }
}

 

  拼接xml格式报文。

package test;

public class TestXML {

    public static void main(String[] args) {
        System.out.println(getTestXML());
    }

    public static String getTestXML(){
        String xml="";
        StringBuilder builder = new StringBuilder();

        builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        builder.append("<xml-body>");
        builder.append("<Head>");
        builder.append("<Version>1.0</Version>");
        builder.append("<MethodCode></MethodCode>");
        builder.append("<BeanId>webService</BeanId>");
        builder.append("<ParamType>xml</ParamType>");
        builder.append("</Head>");

        builder.append("<Body>");
        builder.append("<sysPass>QQQQ</sysPass>");

        builder.append("<prop>");

        //这里是传输的主要数据内容,username是字段名,中间是数据,需要什么就拼接什么
        builder.append("<projectName>我是传输到服务端的内容</projectName>");

        builder.append("</prop>");
        builder.append("</Body>");
        builder.append("</xml-body>");

        xml = builder.toString();
        return xml;
    }
}

  5,启动客户端。服务端也需要启动。直接右键启动main方法

  客户端控制台显示:

  

 

 

   服务端控制台显示:

 

 

   6,检查数据库是否新增成功,

 

 

  7,检查一下生成的xml格式报文格式。https://www.sojson.com/xml.html

 

 

 

 

 

 到这里就是全部的步骤了。如果有报错多注意有没有漏什么,是否缺少相应的jar包。