内容:如题
需求描述:现有springMvc框架的系统,里面跑着业务数据,又开发一QT界面,需要调用java系统的数据
思路: java端用cxf发布出webService接口 客户端:用Gsoap 将cxf发布的wsdl文件转换成c++文件,然后调用。
环境:win10 QT5+ cxf Springmvc
步骤:
一:gsoap安装
下载gsoap安装文件,很简单,下载后直接解压即可使用,我下载的是gsoap_2.8.51;
gsoap配置环境变量(当然影像不大,配置环境变量后,后面操作相对简单)
如下图所示:在path中增加gsoap的win32路径
二: 假设此处java项目中的webService可以访问(此处不再详细说明)
我的可以正常访问:如下图所示:
这时证明你 的服务端已经正常。
三:新建目录D:\QT\gsoapSource(可根据实际情况随意建立)
进入windows命令窗口
cd 进入到上述建立的目录下
cd D:\QT\gsoapSource
将wsdl文件转成.h文件
执行命令wsdl2h -o taskInfo.h http://(服务端的ip)/taskTodo/webService/taskInfo?wsdl (后面的地址为第二大项中的wsdl的地址)
此时,在D:\QT\gsoapSource 目录下,你会看到生成了,taskInfo.h文件
此时,再执行命令:soapcpp2 taskInfo.h -I E:\tools\应用软件\gsoap_2.8.51\gsoap-2.8\gsoap\import (备注:-I后面指定了gsoap的安装路径下的import路径,根据自己情况改动)
此时,会在目录下生成一堆文件,暂且不管是什么用途
至此,准备工作已经准备完成,接下来就是QT端的开发:
四:建立QT客户端工程(具体步骤不再细说)
工程结构如下图所示:
其中主要是.pro文件,widget.h及widget.cpp文件
生成项目后,先在widget.cpp平级的目录下的建立gsoap文件夹,将第三步最后生成在gsoapSource文件下的文件除了.xml文件之外的所有文件都复制到gsoap文件夹下(网上有人说没必要全要,此处为了避免漏掉,都拿过来),除此之外,还需要将gsoap安装路径下的3个重要文件(stdsoap2.cpp、stdsoap2.c、stdsoap2.h)复制到此文件夹下
接下来,看看QT里面上面所说的3个文件的代码
.pro代码 其中LIBS后面的值根据自己QT环境配置
#-------------------------------------------------
#
# Project created by QtCreator 2017-08-09T17:22:13
#
#-------------------------------------------------
QT += core gui
LIBS += C:\Qt\Qt5.6.2\Tools\mingw492_32\i686-w64-mingw32\lib\libws2_32.a
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Test
TEMPLATE = app
SOURCES += main.cpp\
widget.cpp\
gsoap/stdsoap2.cpp \
gsoap/soapClient.cpp \
gsoap/soapC.cpp
HEADERS += widget.h\
gsoap/stdsoap2.h \
gsoap/soapStub.h \
gsoap/soapH.h
INCLUDEPATH += gsoapwidget.c
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
#include <QTextEdit>
class QPushButton;
class QLineEdit;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
public slots:
void OnClicked();
private:
QPushButton *btn;
// QLineEdit *line;
QTextEdit *line;
QLabel *labelUserName;
QLineEdit *editUserName;
QLabel *labelPassWord;
QLineEdit *editPassWord;
QLabel *labelresult;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QPushButton>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QDebug>
#include <QGridLayout>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include "TaskInfoWebServiceSoapBinding.nsmap"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle(tr("获取任务信息"));
setFixedSize(800,500);
labelUserName =new QLabel(tr("用户名:"));
editUserName =new QLineEdit;
labelPassWord =new QLabel(tr("密码:"));
editPassWord =new QLineEdit;
labelresult = new QLabel(tr("结果:"));
btn =new QPushButton("提交");
line = new QTextEdit;
connect(btn,SIGNAL(clicked()),this,SLOT(OnClicked()));
QGridLayout *layout = new QGridLayout;
layout->addWidget(labelUserName,0,0);
layout->addWidget(editUserName,0,1);
layout->addWidget(labelPassWord,1,0);
layout->addWidget(editPassWord,1,1);
layout->addWidget(labelresult,2,0);
layout->addWidget(line,2,1);
layout->addWidget(btn,3,0);
setLayout(layout);
}
Widget::~Widget()
{
}
void Widget::OnClicked()
{
struct soap add_soap;
soap_init(&add_soap);
soap_set_mode(&add_soap,SOAP_C_UTFSTRING);
ns1__findUserTaskInfo req;
std::string name =editUserName->text().toStdString(); // 由赋值进行初始化
std::string password =editPassWord->text().toStdString();
req.userName=&name;
req.passWord=&password;
ns1__findUserTaskInfoResponse res;
QString str;
int result = soap_call___ns1__findUserTaskInfo(&add_soap,NULL,NULL,&req,res);
if (result == SOAP_OK)
{
// qDebug()<<res.return_->c_str();
str = QString::fromUtf8(res.return_->c_str());
}
else
{
str = tr("Failed");
}
line->setText(str);
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
运行QT工程如下图所示:
ok,至此,结束
注意:我的webService 接口是中接收两个参数,userName和passWord,然后调用数据库进行验证,返回对应用户的字符串数据,然后显示到QT的结果框中,测试的时候可以简单写个测试接口进行调用。
