问题的产生:

上班写了一个改接口的需求,其中涉及了一个WSDL这么一个概念

WSDL是个啥???? 翻了翻项目,里面就是个文件,以wsdl为后缀名

内容结构和XML相似,或者直接说是XML文件也可以

线索分析:

首先这个文件是放在Java包中的,这很神奇,一般Java包中只会存放Java文件

在这个项目中,wsdl文件也放在Java包中

所在的模块:wsdl所存在的位置是放在Interface模块中,也就是说,WSDL文件是和接口相关的

我们随意全文查找一个接口的信息来看看:

SD08本身:

package com.yonyou.dcs.intf.server.SD08;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; /**
* <p>anonymous complex type的 Java 类。
*
* <p>以下模式片段指定包含在此类中的预期内容。
*
* <pre>
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="in" type="{http://www.w3.org/2001/XMLSchema}string"/&gt;
* &lt;/sequence&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"in"
})
@XmlRootElement(name = "SD08")
public class SD08 { @XmlElement(required = true)
protected String in; /**
* 获取in属性的值。
*
* @return
* possible object is
* {@link String }
*
*/
public String getIn() {
return in;
} /**
* 设置in属性的值。
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setIn(String value) {
this.in = value;
} }

SD08Request:

package com.yonyou.dcs.intf.server.SD08;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType; /**
* <p>SD08_Request complex type?? Java ??
* */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SD08_Request", propOrder = {
"vin",
"engineNo",
"modelCode",
"productDate",
"factoryDate",
"saleDate",
"maintainHandbookNo",
"gearBoxManufactor",
"gearBoxModel",
"gearBoxNo",
"frontAxleManufactor",
"frontAxleModel",
"frontAxleNo",
"middleAxleManufactor",
"middleAxleModel",
"middleAxleNo",
"rearAxleManufactor",
"rearAxleModel",
"rearAxleNo",
"tbox",
"engineTypeInfo"
})
public class SD08Request { @XmlElement(required = true)
protected String vin;
@XmlElement(required = true)
protected String engineNo;
@XmlElement(required = true)
protected String modelCode;
@XmlElement(required = true)
protected String productDate;
@XmlElement(required = true)
protected String factoryDate;
@XmlElement(required = true)
protected String saleDate;
@XmlElement(required = true)
protected String maintainHandbookNo;
@XmlElement(required = true)
protected String gearBoxManufactor;
@XmlElement(required = true)
protected String gearBoxModel;
@XmlElement(required = true)
protected String gearBoxNo;
@XmlElement(required = true)
protected String frontAxleManufactor;
@XmlElement(required = true)
protected String frontAxleModel;
@XmlElement(required = true)
protected String frontAxleNo;
@XmlElement(required = true)
protected String middleAxleManufactor;
@XmlElement(required = true)
protected String middleAxleModel;
@XmlElement(required = true)
protected String middleAxleNo;
@XmlElement(required = true)
protected String rearAxleManufactor;
@XmlElement(required = true)
protected String rearAxleModel;
@XmlElement(required = true)
protected String rearAxleNo;
@XmlElement(required = true)
protected String tbox;
@XmlElement(required = true)
protected String engineTypeInfo;

SD08Response:

package com.yonyou.dcs.intf.server.SD08;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; /**
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"out"
})
@XmlRootElement(name = "SD08Response")
public class SD08Response { @XmlElement(required = true)
protected String out; /**
*/
public String getOut() {
return out;
} /**
*/
public void setOut(String value) {
this.out = value;
} }

最核心的代码是这个 【SD08SOAPImpl】

在这个部分调用了这个方法:

/**
* Please modify this class to meet your needs
* This class is not complete
*/ package com.yonyou.dcs.intf.server.action; import java.sql.Timestamp; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import com.yonyou.dcs.intf.dto.IntfOprtMsgDTO;
import com.yonyou.dcs.intf.server.SD08.SAPDMS08Type;
import com.yonyou.dcs.intf.server.SD08.SD08Request;
import com.yonyou.dcs.intf.server.SD08.SD08Response;
import com.yonyou.dcs.intf.server.service.SD08ServImpl; /**
* This class was generated by Apache CXF 3.1.11 2017-06-07T10:50:58.568+08:00
* Generated source version: 3.1.11
*
* 车辆库接口
*
* 表 :tm_vehicle_base 所属微服vehCusView
*
* 新加字段表中未添加
*
*/ @javax.jws.WebService(serviceName = "SAP_DMS_08", portName = "SAP_DMS_08Port", targetNamespace = "http://wsServer.jmc.eai.infoservice.com/SAP_DMS_08/", wsdlLocation = "classpath:/com/yonyou/dcs/intf/server/wsdl/SD08.wsdl", endpointInterface = "com.yonyou.dcs.intf.server.SD08.SAPDMS08Type")
public class SD08SOAPImpl implements SAPDMS08Type { private static final Logger logger = LoggerFactory
.getLogger(SD08SOAPImpl.class);
private Timestamp startTime;
private Timestamp endTime; @Autowired
private SD08ServImpl serv; public com.yonyou.dcs.intf.server.SD08.SD08Response sd08(
SD08Request sd08Request) {
com.yonyou.dcs.intf.server.SD08.SD08Response _return = new SD08Response();
logger.info("Executing operation sd08");
// 判断数据是否为空
if (sd08Request == null) {
return _return;
} logger.info("sd08 start");
// try {
startTime = new Timestamp(System.currentTimeMillis());
IntfOprtMsgDTO oprtMsg = serv.processData(sd08Request);
endTime = new Timestamp(System.currentTimeMillis());
serv.addSd08Record(sd08Request, oprtMsg, startTime, endTime);// 时间日志 logger.info("sd08 end");
return _return;
// } catch (java.lang.Exception ex) {
// ex.printStackTrace();
// throw new RuntimeException(ex);
// }
}
}

在ServeImpl中:

package com.yonyou.dcs.intf.server.service;

import java.sql.Timestamp;
import java.util.List;
import java.util.Map; import com.yonyou.dcs.intf.po.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.yonyou.dcs.common.Constant;
import com.yonyou.dcs.common.bean.ElemBean;
import com.yonyou.dcs.common.util.CommonUtils;
import com.yonyou.dcs.common.util.POUtil;
import com.yonyou.dcs.common.util.ThrowableUtil;
import com.yonyou.dcs.intf.common.BaseTxn;
import com.yonyou.dcs.intf.common.IntfConstans;
import com.yonyou.dcs.intf.common.MsgSendServImpl;
import com.yonyou.dcs.intf.dto.IntfOprtMsgDTO;
import com.yonyou.dcs.intf.server.SD08.SD08Request;
import com.yonyou.dcs.intf.server.dao.SD08DAO; @Service
public class SD08ServImpl {
private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
private BaseTxn bt; @Autowired
private SD08DAO dao; @Autowired
private POUtil poUtil; @Autowired
private RecvServImpl recvServ; @Autowired
private MsgSendServImpl msgSendServ; public IntfOprtMsgDTO processData(SD08Request sd08Request) {
IntfOprtMsgDTO retMsg = null;
Long baseId = null;
try {
// Long companyId = getFactoryCompanyOfModel(sd08Request.getModelCode());
ElemBean companyInfo = getFactoryCompanysOfModel(sd08Request.getModelCode()); bt.beginTxn(IntfConstans.TXN_VEHCUSVIEW,
IntfConstans.JNDI_VEHCUSVIEW);// 开启事物 TmVehicleBasePO vehBaseInfo = dao.queryVehicleBaseByVin(sd08Request
.getVin()); TmEngineInfoPO engineInfo = dao.queryEngineInfoByVin(sd08Request
.getVin()); if (vehBaseInfo != null) {
setCommonField(sd08Request, vehBaseInfo, companyInfo.getLong("realCompanyId"));
dao.modifyVehicleBase(vehBaseInfo);
retMsg = new IntfOprtMsgDTO(Constant.INTF_OPRT_STATUS_UPTSUC,
"修改成功");
} else {
vehBaseInfo = new TmVehicleBasePO();
setCommonField(sd08Request, vehBaseInfo, companyInfo.getLong("realCompanyId"));
vehBaseInfo = dao.addVehicleBase(vehBaseInfo);
retMsg = new IntfOprtMsgDTO(Constant.INTF_OPRT_STATUS_ADDSUC,
"新增成功");
} if (null != engineInfo) {
setCommonFieldForEngineInfo(sd08Request, engineInfo);
dao.modifyEngineInfo(engineInfo);
// retMsg = new IntfOprtMsgDTO(Constant.INTF_OPRT_STATUS_UPTSUC,"修改成功");
} else {
engineInfo = new TmEngineInfoPO();
setCommonFieldForEngineInfo(sd08Request, engineInfo);
dao.addEngineInfo(engineInfo); // engineInfo =
// retMsg = new IntfOprtMsgDTO(Constant.INTF_OPRT_STATUS_ADDSUC,"新增成功");
} baseId = vehBaseInfo.getLongId(); // 判断是否是进出口、批售大客户,如果是要创建(如果没有)大客户信息,并将大客户与车表关联 // 增加其他公司
if(!companyInfo.isNull("otherCompanyIds")) {
String[] otherCompanyIds = companyInfo.getStr("otherCompanyIds").split(",");
for(String otherCompanyId : otherCompanyIds) {
TrVehbaseCompanyPO trvcPO = TrVehbaseCompanyPO.findFirst("VEHICLE_BASE_ID=? AND COMPANY_ID=?", baseId, otherCompanyId);
if(trvcPO != null) {
trvcPO.set("VALID_STATUS", Constant.STATUS_ENABLE);
trvcPO.saveIt();
} else {
trvcPO = new TrVehbaseCompanyPO();
trvcPO.set("VEHICLE_BASE_ID", baseId);
trvcPO.set("COMPANY_ID", otherCompanyId);
trvcPO.set("VALID_STATUS", Constant.STATUS_ENABLE);
trvcPO.saveIt();
}
}
} bt.endTxnTrue();
} catch (Exception ex) {
retMsg = new IntfOprtMsgDTO(Constant.INTF_OPRT_STATUS_SYSFAL,
ex.getMessage(), ThrowableUtil.getStackTraceToString(ex));
logger.error(ThrowableUtil.getStackTraceToString(ex));
bt.endTxnFalse();
} finally {
bt.txnClean();
} if(baseId != null) {
boolean suc = msgSendServ.sendVehicleBase(baseId);
logger.info("the sd08 send vehicle_base({}) is {}", baseId, suc);
} return retMsg;
} @SuppressWarnings("rawtypes")
private Long getFactoryCompanyOfModel(String modelCode) {
Long factoryCompanyId = null;
try {
bt.beginTxn(IntfConstans.TXN_GMSPUBLICSERV,
IntfConstans.JNDI_GMSPUBLICSERV); Map modelInfo = dao.queryModelInfo(modelCode);
factoryCompanyId = modelInfo.get("COMPANY_ID") == null ? null
: Long.parseLong(modelInfo.get("COMPANY_ID").toString()); bt.endTxnTrue();
} catch (Exception ex) {
logger.error(ThrowableUtil.getStackTraceToString(ex));
bt.endTxnFalse();
} finally {
bt.txnClean();
}
return factoryCompanyId;
} @SuppressWarnings("rawtypes")
private ElemBean getFactoryCompanysOfModel(String modelCode) {
ElemBean retBean = new ElemBean();
try {
bt.beginTxn(IntfConstans.TXN_GMSPUBLICSERV,
IntfConstans.JNDI_GMSPUBLICSERV); Map modelInfo = dao.queryModelInfo(modelCode);
if(modelInfo != null) {
retBean.put("realCompanyId", Long.parseLong(modelInfo.get("COMPANY_ID").toString()));
List<TrBrandCompanyPO> trbcPOs = TrBrandCompanyPO.find("BRAND_ID=? AND VALID_STATUS=10011001", modelInfo.get("BRAND_ID"));
String otherCompanyIds = "";
for(TrBrandCompanyPO trbcPO : trbcPOs) {
otherCompanyIds = otherCompanyIds + ("".equals(otherCompanyIds)?"":",") + trbcPO.getString("COMPANY_ID");
}
retBean.put("otherCompanyIds", otherCompanyIds);
} else {
retBean.put("realCompanyId", "");
retBean.put("otherCompanyIds", "");
} bt.endTxnTrue();
} catch (Exception ex) {
logger.error(ThrowableUtil.getStackTraceToString(ex));
bt.endTxnFalse();
} finally {
bt.txnClean();
}
return retBean;
} private void setCommonField(SD08Request req, TmVehicleBasePO po,
Long companyId) {
po.set("COMPANY_ID", companyId);
po.setString("COLOR", req.getModelCode().substring(14, 16));
po.setString("VIN", req.getVin());
po.setString("ENGINE_NO", req.getEngineNo());
if (!CommonUtils.checkIsNullStr(req.getFactoryDate())) {
po.set("FACTORY_DATE", req.getFactoryDate());
}
po.setString("MODEL_CODE", req.getModelCode());
if (!CommonUtils.checkIsNullStr(req.getProductDate())&&!"00000000000000".equals(req.getProductDate())) {
po.set("PRODUCT_DATE", req.getProductDate());
}
po.setString("MAINTAIN_HANDBOOK_NO", req.getMaintainHandbookNo());
po.set("GEAR_BOX_MANUFACTOR", req.getGearBoxManufactor());
po.set("GEAR_BOX_MODEL", req.getGearBoxModel());
po.set("GEAR_BOX_NO", req.getGearBoxNo());
po.set("FRONT_AXLE_MANUFACTOR", req.getFrontAxleManufactor());
po.set("FRONT_AXLE_MODEL", req.getFrontAxleModel());
po.set("FRONT_AXLE_NO", req.getFrontAxleNo());
po.set("MIDDLE_AXLE_MANUFACTOR", req.getMiddleAxleManufactor());
po.set("MIDDLE_AXLE_MODEL", req.getMiddleAxleModel());
po.set("MIDDLE_AXLE_NO", req.getMiddleAxleNo());
po.set("REAR_AXLE_MANUFACTOR", req.getRearAxleManufactor());
po.set("REAR_AXLE_MODEL", req.getRearAxleModel());
po.set("REAR_AXLE_NO", req.getRearAxleNo());
po.set("IS_JMC", 1);
po.set("IS_FACT_JMC", Constant.IF_TYPE_YES);
if (!CommonUtils.checkIsNullStr(req.getTbox())&&!"Y".equals(req.getTbox())) {
po.set("TBOX", Constant.IF_TYPE_YES);
}
} private void setCommonFieldForEngineInfo(SD08Request req, TmEngineInfoPO po) {
po.setString("vin", req.getVin());
po.setString("engin_info", req.getEngineTypeInfo());
} public void addSd08Record(SD08Request sd08Request, IntfOprtMsgDTO oprtMsg,
Timestamp startTime, Timestamp endTime) {
try {
bt.beginTxn(IntfConstans.TXN_INTF, IntfConstans.JNDI_INTF);
// 日志表
TiSd08RecordPO po = new TiSd08RecordPO();
poUtil.copyToPO(sd08Request, po);
po.set("HANDLE_STATUS", oprtMsg.getStatus());
po.setString("OPRT_MSG", oprtMsg.getMsg());
po.insert(); // 添加主记录
recvServ.addRecvRecord(oprtMsg, "SD08", po.getId(), startTime,
endTime);
bt.endTxnTrue();
} catch (Exception ex) {
logger.error(ThrowableUtil.getStackTraceToString(ex));
bt.endTxnFalse();
} finally {
bt.txnClean();
}
} }

到了Dao中就是具体的一些表操作了【数据访问层用的是 ActiveJDBC】

package com.yonyou.dcs.intf.server.dao;

import java.util.LinkedList;
import java.util.List;
import java.util.Map; import com.yonyou.dcs.intf.po.TmEngineInfoPO;
import org.springframework.stereotype.Repository; import com.yonyou.dcs.common.util.DcsDaoUtil;
import com.yonyou.dcs.intf.common.IntfConstans;
import com.yonyou.dcs.intf.po.TmVehicleBasePO; @Repository
public class SD08DAO { public TmVehicleBasePO queryVehicleBaseByVin(String vin) {
List<TmVehicleBasePO> list = TmVehicleBasePO.find("VIN = ?", vin);
return list == null || list.size() == 0 ? null : list.get(0);
} public TmEngineInfoPO queryEngineInfoByVin(String vin) {
List<TmEngineInfoPO> list = TmEngineInfoPO.find("VIN = ?", vin);
return list == null || list.size() == 0 ? null : list.get(0);
} public void modifyVehicleBase(TmVehicleBasePO po) {
po.set("UPDATED_BY", IntfConstans.UPDATE_BY_OEM);
po.set("QMS_IS_SCAN", 0);
po.set("FORDPASS_SCAN", 0);
po.saveIt();
} public void modifyEngineInfo(TmEngineInfoPO po) {
po.set("UPDATED_BY", IntfConstans.UPDATE_BY_OEM);
po.saveIt();
} public TmVehicleBasePO addVehicleBase(TmVehicleBasePO po) {
po.setLong("IS_DELIEVE", 0);
po.setString("MID_CONFIRM_FLAG", "0");
po.setLong("CREATED_BY", IntfConstans.CREATE_BY_OEM);
po.insert();
return po;
} public TmEngineInfoPO addEngineInfo(TmEngineInfoPO po) {
po.setLong("CREATED_BY", IntfConstans.CREATE_BY_OEM);
po.insert();
return po;
} @SuppressWarnings("rawtypes")
public Map queryModelInfo(String modelCode) {
String sql = "SELECT * FROM VW_PRODUCT T WHERE T.MODEL_CODE_NEW = ?"; List<Object> params = new LinkedList<Object>();
params.add(modelCode); List<Map> list = DcsDaoUtil.findAll(IntfConstans.JNDI_GMSPUBLICSERV,
sql, params); return list == null || list.size() == 0 ? null : list.get(0);
} }

所以到这里可以基本得出一些结论:

WSDL用来描述,或者说定义了接口的信息

Request类描述的这个接口的数据模型是怎样的【封装数据模型】

然后SOAPI的这个类承接了Controller的功能,处理请求的数据

再往下Service层和Dao层就是实际对接数据库的实现

工作的要求:

这里有点问题就是,一般来说一个接口对应的数据库的一张表

但是需求有变动,BA让我新增一张表来存储一个新的字段,所以我要完整的看完这个流程才知道接口干了什么。

关于百度上提供的WSDL概念我真没懂

越看我是越晕,我理解就是一个接口规范描述,或者数据传输协议

关于WSDL本身的东西并不是很多:

https://www.runoob.com/wsdl/wsdl-tutorial.html

翻看W3C或者菜鸟教程就行了,工作上有可能自己自动生成还是怎样,反正怎么效率高怎么来,不纠结这个

WSDL文件案例:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://wsServer.jmc.eai.infoservice.com/SAP_DMS_08/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SAP_DMS_08" targetNamespace="http://wsServer.jmc.eai.infoservice.com/SAP_DMS_08/">
<wsdl:types>
<xsd:schema targetNamespace="http://wsServer.jmc.eai.infoservice.com/SAP_DMS_08/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="SD08">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="SD08Response">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="SD08_Request" type="tns:SD08_Request"></xsd:element> <xsd:complexType name="SD08_Request">
<xsd:sequence>
<xsd:element name="vin" type="xsd:string"></xsd:element>
<xsd:element name="engineNo" type="xsd:string"></xsd:element>
<xsd:element name="modelCode" type="xsd:string"></xsd:element>
<xsd:element name="productDate" type="xsd:string"></xsd:element>
<xsd:element name="factoryDate" type="xsd:string"></xsd:element>
<xsd:element name="saleDate" type="xsd:string"></xsd:element>
<xsd:element name="maintainHandbookNo"
type="xsd:string">
</xsd:element>
<xsd:element name="gearBoxManufactor" type="xsd:string"></xsd:element>
<xsd:element name="gearBoxModel" type="xsd:string"></xsd:element>
<xsd:element name="gearBoxNo" type="xsd:string"></xsd:element>
<xsd:element name="frontAxleManufactor"
type="xsd:string">
</xsd:element>
<xsd:element name="frontAxleModel" type="xsd:string"></xsd:element>
<xsd:element name="frontAxleNo" type="xsd:string"></xsd:element>
<xsd:element name="middleAxleManufactor"
type="xsd:string">
</xsd:element>
<xsd:element name="middleAxleModel" type="xsd:string">
</xsd:element>
<xsd:element name="middleAxleNo" type="xsd:string"></xsd:element>
<xsd:element name="rearAxleManufactor"
type="xsd:string">
</xsd:element>
<xsd:element name="rearAxleModel" type="xsd:string"></xsd:element>
<xsd:element name="rearAxleNo" type="xsd:string"></xsd:element>
<xsd:element name="tbox" type="xsd:string"></xsd:element>
<xsd:element name="engineTypeInfo" type="xsd:string"></xsd:element> </xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="SD08Request">
<wsdl:part element="tns:SD08_Request" name="SD08_Request"/>
</wsdl:message>
<wsdl:message name="SD08Response">
<wsdl:part element="tns:SD08Response" name="SD08_Response"/>
</wsdl:message>
<wsdl:portType name="SAP_DMS_08Type">
<wsdl:operation name="SD08">
<wsdl:input message="tns:SD08Request"/>
<wsdl:output message="tns:SD08Response"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SAP_DMS_08Binding" type="tns:SAP_DMS_08Type">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="SD08">
<soap:operation soapAction="http://wsServer.jmc.eai.infoservice.com/SAP_DMS_08/SD08"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SAP_DMS_08">
<wsdl:port binding="tns:SAP_DMS_08Binding" name="SAP_DMS_08Port">
<soap:address location="http://wsServer.jmc.eai.infoservice.com/"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

【WSDL】WebService描述语言的实践的更多相关文章

  1. WSDL(WebService描述语言)文件介绍

    一.WSDL 1.WSDL 文档的组成部分 <portType>:web service 执行的操作 <message>:web service 使用的消息 <types ...

  2. WSDL(Web服务描述语言)详细解析(全文转载学习用)

    WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务 ...

  3. WSDL/WebService/SOAP/REST/AXIS/CXF 开放式服务

    WebService是一种数据交换标准.通过WebService标准,你可以把项目中的方法作为接口提供给其他项目使用. 有时候我们习惯性地将具体提供服务的某个方法称为WebService.比如图书系统 ...

  4. 硬件描述语言Verilog设计经验总结

    一.硬件描述语言Verilog 粗略地看Verilog与C语言有许多相似之处.分号用于结束每个语句,注释符也是相同的(/* ... */和// 都是熟悉的),运算符"=="也用来测 ...

  5. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  6. 上一步是硬件描述语言,下一步是FPGA

    上一步是硬件描述语言,下一步是FPGA. 学习了硬件描述语言(Verilog或者VHDL)之后,FPGA该如何继续. 世上没有捷径,每一步都得踏踏实实的走.学习FPGA也是这样,在有了硬件描述语言的基 ...

  7. API的描述语言--Swagger

    Swagger是一种Rest API的表示方式. 有时也可以作为Rest API的交互式文档,描述形式化的接口描述,生成客户端和服务端的代码. 一,描述语言:Spec Swagger API Spec ...

  8. 高德渲染网关Go语言重构实践

    ​1.导读 高德启动Go业务建设已经有段时间了,主要包含Go应用落地,Go中间件建设,云原生三个部分.经过持续的发力,在这些方面取得了不错的进展.高德Go业务落地过程是如何实现的,遇到过哪些问题,如何 ...

  9. Blazor 002 : 一种开历史倒车的UI描述语言 -- Razor

    Razor是一门相当怪异丑陋的标记语言,但在实际使用中却十分高效灵活.本文主要介绍了Razor是什么,以及Razor引擎的一些浅薄的背后机理. 写文章前我本想一口气把Razor的基本语法,以及Blaz ...

  10. Go语言设计模式实践:组合(Composite)

    关于本系列 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代 ...

随机推荐

  1. Prometheus 聚合查询的两个方案

    问题背景 多个 Prometheus 集群或者多个 VictoriaMetrics 集群,在 Grafana 和夜莺里通常需要创建多个不同的数据源,这也就意味着,数据没法聚合查询,比如统一做一下 su ...

  2. 双等号==与equals的区别与联系

    ==与equals的区别与联系: 1)对于双等号==来说,比较的是值是否相等 如果双等号比较的是基本数据类型的变量,则直接比较变量的值是否相等, 如果双等号比较的是引用类型的变量,则比较的是所指向对象 ...

  3. SpringBoot3整合SpringDoc实现在线接口文档

    写在前面 在现目前项目开发中,一般都是前后端分离项目.前端小姐姐负责开发前端,苦逼的我们负责后端开发 事实是一个人全干,在这过程中编写接口文档就显得尤为重要了.然而作为一个程序员,最怕的莫过于自己写文 ...

  4. 关于vue中image控件,onload事件里,event.target 为null的奇怪问题探讨

    废话不多说(主要文笔比较差),直接上代码 一个简单的demo,如下 <img :src="orginalImgSrc" style="display: none;& ...

  5. MestReNova14.0中文版安装教程

    MestReNova 14是一款专业级的核磁共振(NMR)与质谱(MS)数据分析软件,专注于化合物结构解析和验证.该软件以卓越的谱图处理能力和智能化算法为核心,提供自定义参数调整.自动峰识别.精准积分 ...

  6. 一文学完所有的Hive Sql(两万字最全详解)

    Hive Sql 大全 本文基本涵盖了Hive日常使用的所有SQL,因为SQL太多,所以将SQL进行了如下分类: 一.DDL语句(数据定义语句): 对数据库的操作:包含创建.修改数据库 对数据表的操作 ...

  7. VUE中watch的详细使用教程

      1.watch是什么? watch:是vue中常用的侦听器(监听器),用来监听数据的变化 2.watch的使用方式如下 watch: { 这里写你在data中定义的变量名或别处方法名: { han ...

  8. .NET 个人博客-给文章添加上标签

    个人博客-给文章添加上标签 优化计划 置顶3个且可滚动或切换 推荐改为4个,然后新增历史文章,将推荐的加载更多放入历史文章,按文章发布时间降序排列. 标签功能,可以为文章贴上标签 推荐点赞功能 本篇文 ...

  9. socket 地址复用 SO_REUSEADDR

    背景 默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口(例如888),这时候,别的套接字就无法使用这个端口( 888 ) ref : https://blog.csdn.net/tenn ...

  10. Linux 环境编程:errno的基本用法

    背景 error是一个包含在<errno.h>中的预定义的外部int变量,用于表示最近一个函数调用是否产生了错误.若为0,则无错误,其它值均表示一类错误. errno只在函数返回错误时才有 ...