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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM