• idea创建webservice接口服务端与客户端并插入数据到数据库


    最近工作中需要对接接口,用到了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包。

  • 相关阅读:
    引入C/C++动态库
    Linux新手常用命令
    使用Dotfunsctor
    C#上传数据到HTTP,HTTPS 代码示例
    C#多个泛型约束问题
    创建DataTable与DataGridView进行绑定
    递归迭代vector三种方法实现二路归并排序
    区间贪心算法
    递归和非递归实现二叉树的遍历
    C语言实现全排列和回溯法总结
  • 原文地址:https://www.cnblogs.com/ljmm/p/13202835.html
Copyright © 2020-2023  润新知