当前位置: 首页 > news >正文

网站建设公司实力/广州网站优化运营

网站建设公司实力,广州网站优化运营,wordpress 用户 仪表盘,那家建设网站p2p公司最好?简介 在多系统交互中,有时候需要以Java作为客户端来调用SOAP方式的WebService服务,本文通过分析不同的调用方式,以Demo的形式,帮助读者在生产实践中选择合适的调用方式。 本文JDK环境为JDK17。 结论 推荐使用Axis2或者Jaxws&#…

简介

在多系统交互中,有时候需要以Java作为客户端来调用SOAP方式的WebService服务,本文通过分析不同的调用方式,以Demo的形式,帮助读者在生产实践中选择合适的调用方式。

本文JDK环境为JDK17。

结论

推荐使用Axis2或者Jaxws,以无客户端的形式来调用WebService。

有客户端,推荐Maven插件。

有客户端调用

主要时利用wsdl文档,自动生成对应的Java代码来实现

建议在pom文件中,配置对应的Maven插件来实现WebService客户端代码的自动生成。

JDK wsimport命令生成(不推荐)

简介

主要是利用jdk的自带工具wsimport工具实现,执行命令如下:

wsimport -s C:\tmp\com -p com.example.demo5.wsdl -encoding utf-8 http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl

优点

通常装有JDK的电脑或者服务器都可以直接运行,方便生成。

缺点

在实际的运用中wsimport命令会有很多问题,首先只有JDK1.8才支持这个命令,即使能使用,仍然存在一些问题。其次,在JDK17以上没有自带这个工具,可能要安装插件才能使用,但是笔者安装了一些插件仍然无法使用。

ApacheCXF自动生成(不推荐)

简介

ApacheCXF通过安装也可以自动生成对应的WebService客户端代码。具体操作可见链接。

缺点

需要额外安装ApacheCXF插件。

Maven插件自动生成(推荐)

简介

通过spring.io网址的Demo示例,可以配置pom的maven插件,自动生成代码。

demo获取链接如下:

Getting Started | Consuming a SOAP web service (spring.io)

pom配置示例如下:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- tag::wsdl[] --><plugin><groupId>com.sun.xml.ws</groupId><artifactId>jaxws-maven-plugin</artifactId><version>3.0.0</version><executions><execution><goals><goal>wsimport</goal></goals></execution></executions><configuration><packageName>com.example.consumingwebservice.wsdl</packageName><wsdlUrls>
<!--						<wsdlUrl>http://localhost:8080/ws/countries.wsdl</wsdlUrl>--><wsdlUrl>http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl</wsdlUrl></wsdlUrls><sourceDestDir>${sourcesDir}</sourceDestDir><destDir>${classesDir}</destDir><extension>true</extension></configuration></plugin><!-- end::wsdl[] --></plugins></build>

生成代码如下:

调用方式:

@RequestMapping(value = "/{ip}", method = RequestMethod.GET)public ArrayOfString searchIp(@PathVariable("ip") String ip) {IpAddressSearchWebServiceSoap ipAddressSearchWebServiceSoap = new IpAddressSearchWebService().getIpAddressSearchWebServiceSoap();ArrayOfString response = ipAddressSearchWebServiceSoap.getCountryCityByIp(ip);return response;}

优点

操作简单,改动小。

缺点

唯一的缺点,也是有客户端调用普遍存在的,自动生成代码后,需要重新部署一次。

Springboot集成Git插件实现

通过Springboot集成git插件,可以通过接口的形式来修改maven的wsdlUrls配置,然后推送到git服务,最后触发Jenkins自动部署。

以Git推送代码的形式来实现代码的自动生成,其缺点是,每次根据一份wsdl文件生成完代码,需要重启一次服务,但是笔者通过自动配置的形式可以做到一键部署。

其中触发Jenkins自动部署,可以通过git的配置实现,通过访问特定的url实现。配置好的git部署链接如下:

http://192.168.22.22:8080/job/demo_test/build?token=1987654567890hjkoijghfvgjjnmkjkmk

其中token的值可以自动定义,这样在借助代码的形式就可以做到一键部署。

其实现代码如下:

package com.example.consumingwebservice;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Date;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.jgit.transport.HttpConfig;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;public class GitUtil {//private static Log log = LogFactory.getLog(GitUtil.class);private GitUtil() {}public static Git getGit(String uri, CredentialsProvider credentialsProvider, String localDir) throws Exception {Git git = null;if (new File(localDir).exists() ) {git = Git.open(new File(localDir));} else {git = Git.cloneRepository().setCredentialsProvider(credentialsProvider).setURI(uri).setDirectory(new File(localDir)).call();}//设置一下post内存,否则可能会报错Error writing request body to servergit.getRepository().getConfig().setInt(HttpConfig.HTTP, null, HttpConfig.POST_BUFFER_KEY, 512*1024*1024);return git;}public static CredentialsProvider getCredentialsProvider(String username, String password) {return new UsernamePasswordCredentialsProvider(username, password);}public static Repository getRepository(Git git) {return git.getRepository();}public static void pull(Git git, CredentialsProvider credentialsProvider) throws Exception {git.pull().setRemote("origin").setCredentialsProvider(credentialsProvider).call();}public static void push(Git git, CredentialsProvider credentialsProvider, String filepattern, String message)throws Exception {git.add().addFilepattern(filepattern).call();git.add().setUpdate(true);git.commit().setMessage(message).call();git.push().setCredentialsProvider(credentialsProvider).call();}public static void main(String[] args) throws Exception {String uri = "http://192.168.9.11/test/webservice.git";String username = "343535@qq.com";String password = "xdfetrfrr";CredentialsProvider credentialsProvider = getCredentialsProvider(username, password);String localDir = "C:/tmp/git_test";Git git = getGit(uri, credentialsProvider, localDir);pull(git, credentialsProvider);changeFile(localDir + "/pom.xml");//        push(git, credentialsProvider, ".", "提交文件");push(git, credentialsProvider, "pom.xml", "修改pom文件" + new Date());}private static final String newText = "    <wsdlUrl>http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl</wsdlUrl>\r\n                    </wsdlUrls>";protected static void changeFile(String filePath) {try {// 读取文本文件的内容Path path = Paths.get(filePath);String content = Files.readString(path);System.out.println(content);// 替换内容String modifiedContent = content.replace("</wsdlUrls>", newText);// 将修改后的内容写回文本文件Files.write(path, modifiedContent.getBytes(), StandardOpenOption.WRITE);System.out.println("文本文件内容已成功修改!");} catch (IOException e) {System.out.println("修改文本文件内容时出现错误:" + e.getMessage());}}}

 如要实现流程图的规划,可以后台通过http的get请求上文的git部署链接,实现接口的自动部署。

无客户端调用

也就是不需要按wsdl的格式来生成对应的Java代码,原理时通过构建xml的形式来访问WebService。

这里推荐使用Axis2或者Jaxws的方式来调用,二者各有优劣。

Axis调用(不推荐)

简介

通过pom引入axis依赖,实现无客户端访问,所需依赖如下:

<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>

代码实现如下:

public static void main(String[] args){try {String nameSpac = "http://WebXml.com.cn/";URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");QName sname = new QName(nameSpac, "MobileCodeWS");QName pname = new QName(nameSpac, "MobileCodeWSSoap");Service service = new Service( url, sname);Call call = (Call)service.createCall(pname);call.setSOAPActionURI(nameSpac + "getMobileCodeInfo");call.setOperationName(new QName(nameSpac, "getMobileCodeInfo")); // 需要请求的方法call.addParameter(new QName(nameSpac, "mobileCode"), XMLType.XSD_STRING, ParameterMode.IN);  // 入参call.addParameter(new QName(nameSpac, "userID"), XMLType.XSD_STRING, ParameterMode.IN);  // 入参
//            call.addParameter("param3", XMLType.SOAP_STRING, ParameterMode.IN);  // 入参String param1 = "15932582632";  // 参数String param2 = null;  // 参数call.setReturnClass(String.class);  // 设置返回值call.setUseSOAPAction(true);Object invoke = call.invoke(new Object[]{param1, param2});// 调用获取返回值
//            Object invoke =  call.invoke(new Object[]{});// 调用获取返回值System.out.println(invoke);}catch (Exception e){e.printStackTrace();}}

优点

较少的代码量,依赖需要少,实现简单

缺点

通过笔者的实验,发现Axis的调用并不稳定,对于不同的接口,有的接口无参数调用可以调通,有参数调用会报错,有的接口有参数调用可以调通(如例),无参数调用会报错。

实际上,这个依赖在2006年便没有维护了,它的功能转移到了Axis2。

Axis2调用(推荐)

简介

通过pom引入axis2依赖,实现无客户端访问,所需依赖如下:

<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-jaxws</artifactId>
<version>1.7.0</version>
</dependency><dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-adb-codegen</artifactId>
<version>1.7.0</version>
</dependency><dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-local</artifactId>
<version>1.7.0</version>
</dependency><dependency>
<groupId>org.apache.axiom</groupId>
<artifactId>com.springsource.org.apache.axiom</artifactId>
<version>1.2.5</version>
</dependency>

代码实现如下:

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.transport.http.impl.httpclient3.HttpTransportPropertiesImpl;/**** @ClassName: MobileClientDoc* @Description: TODO* 方法二: 应用document方式调用 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合* 即使用org.apache.axis2.client.ServiceClient类进行远程调用web服务,不生成客户端** @date 2017年11月9日 下午1:27:17**/
public class SoapAxis2Client {private static String requestName = "getCountryCityByIp";public static void ipWS() {try {ServiceClient serviceClient = new ServiceClient();//创建服务地址WebService的URL,注意不是WSDL的URLString url = "http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx";EndpointReference targetEPR = new EndpointReference(url);Options options = serviceClient.getOptions();options.setTo(targetEPR);//确定调用方法(wsdl 命名空间地址 (wsdl文档中的targetNamespace) 和 方法名称 的组合)options.setAction("http://WebXml.com.cn/" + requestName);//设置密码HttpTransportPropertiesImpl.Authenticator auth = new HttpTransportPropertiesImpl.Authenticator();
//            auth.setUsername(username);  //服务器访问用户名
//            auth.setPassword(password); //服务器访问密码
//            options.setProperty(HTTPConstants.AUTHENTICATE, auth);OMFactory fac = OMAbstractFactory.getOMFactory();/** 指定命名空间,参数:* uri--即为wsdl文档的targetNamespace,命名空间* perfix--可不填*/OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn/", "");// 指定方法OMElement method = fac.createOMElement(requestName, omNs);// 指定方法的参数OMElement theIpAddress = fac.createOMElement("theIpAddress", omNs);theIpAddress.setText("111.249.198.56");
//            OMElement userID = fac.createOMElement("userID", omNs);
//            userID.setText("");method.addChild(theIpAddress);
//            method.addChild(userID);method.build();//远程调用web服务OMElement result = serviceClient.sendReceive(method);//值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。String xml = result.cloneOMElement().toString();System.out.println(xml);} catch (AxisFault axisFault) {axisFault.printStackTrace();}}public static void main(String[] args) throws AxisFault {ipWS();}}

优点

代码量较少,通过配置xml节点实现系统调用,可以设置灵活的调用方式。经过实验,对各种WebService接口的有参无参调用,都能取得正确的返回结果。

测试结果如下:

<getCountryCityByIpResponse xmlns="http://WebXml.com.cn/"><getCountryCityByIpResult><string>111.249.198.56</string><string>台湾省  </string></getCountryCityByIpResult></getCountryCityByIpResponse>

缺点

所需的pom配置文件较多,且引用不正确较难排查问题,且各个pom之间的版本冲突也需要解决。

Jaxws调用(推荐)

简介

引入对于的pom配置文件

<dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-jaxws</artifactId><version>1.7.0</version>
</dependency>

这里提前说下,下面代码大部分来自于csdn作者——LengYouNuan的文章,但是实在找不到对于作者了,提前声明。

还有它的原始代码并不能正常运行,会有服务器未能识别 HTTP 头 SOAPAction 的值的报错,笔者通过实验和研究,添加了如下配置,才能正常运行:

//这句话很重要,否则报错服务器未能识别 HTTP 头 SOAPAction 的值
dispatch.getRequestContext().put(SOAPACTION_URI_PROPERTY, nameSpace + elementName);
dispatch.getRequestContext().put(SOAPACTION_USE_PROPERTY, true);

由于使用的JDK17,对应的配置和以前不一样了:

public interface BindingProvider {String USERNAME_PROPERTY = "jakarta.xml.ws.security.auth.username";String PASSWORD_PROPERTY = "jakarta.xml.ws.security.auth.password";String ENDPOINT_ADDRESS_PROPERTY = "jakarta.xml.ws.service.endpoint.address";String SESSION_MAINTAIN_PROPERTY = "jakarta.xml.ws.session.maintain";String SOAPACTION_USE_PROPERTY = "jakarta.xml.ws.soap.http.soapaction.use";String SOAPACTION_URI_PROPERTY = "jakarta.xml.ws.soap.http.soapaction.uri";
......

应该主要是javax和jakarta的区别。

完整可运行代码如下:

package com.example.consumingwebservice;import com.sun.xml.ws.client.BindingProviderProperties;
import com.sun.xml.ws.developer.JAXWSProperties;
import jakarta.xml.soap.*;
import jakarta.xml.ws.Dispatch;
import jakarta.xml.ws.Service;
import org.w3c.dom.Document;import javax.xml.namespace.QName;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;import static jakarta.xml.ws.BindingProvider.SOAPACTION_URI_PROPERTY;
import static jakarta.xml.ws.BindingProvider.SOAPACTION_USE_PROPERTY;/*** soap方式调用webservice方式客户端** @author LengYouNuan* @create 2021-05-31 下午2:35*/
public class SoapJaxwsClient {String nameSpace = ""; //wsdl的命名空间String wsdlUrl = ""; //wsdl文档地址String serviceName = ""; //服务的名字String portName = "";String responseName = ""; //@WebResult:注解上的name值String elementName = ""; //默认是要访问的方法名 如果@WebMethod属性name有值 则是该值,实际还是以wsdl文档为主int timeout = 20000;/*** @param nameSpace* @param wsdlUrl* @param serviceName* @param portName* @param element* @param responseName*/public SoapJaxwsClient(String nameSpace, String wsdlUrl,String serviceName, String portName, String element,String responseName) {this.nameSpace = nameSpace;this.wsdlUrl = wsdlUrl;this.serviceName = serviceName;this.portName = portName;this.elementName = element;this.responseName = responseName;}/*** @param nameSpace* @param wsdlUrl* @param serviceName* @param portName* @param element* @param responseName* @param timeOut      毫秒*/public SoapJaxwsClient(String nameSpace, String wsdlUrl,String serviceName, String portName, String element,String responseName, int timeOut) {this.nameSpace = nameSpace;this.wsdlUrl = wsdlUrl;this.serviceName = serviceName;this.portName = portName;this.elementName = element;this.responseName = responseName;this.timeout = timeOut;}public String sendMessage(HashMap<String, String> inMsg) throws Exception {// 创建URL对象URL url = null;try {url = new URL(wsdlUrl);} catch (Exception e) {e.printStackTrace();return "创建URL对象异常";}// 创建服务(Service)QName sname = new QName(nameSpace, serviceName);Service service = Service.create(url, sname);// 创建Dispatch对象Dispatch<SOAPMessage> dispatch = null;try {dispatch = service.createDispatch(new QName(nameSpace, portName), SOAPMessage.class, Service.Mode.MESSAGE);} catch (Exception e) {e.printStackTrace();return "创建Dispatch对象异常";}// 创建SOAPMessagetry {//这句话很重要,否则报错服务器未能识别 HTTP 头 SOAPAction 的值dispatch.getRequestContext().put(SOAPACTION_URI_PROPERTY, nameSpace + elementName);dispatch.getRequestContext().put(SOAPACTION_USE_PROPERTY, true);SOAPMessage msg = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL).createMessage();msg.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "UTF-8");SOAPEnvelope envelope = msg.getSOAPPart().getEnvelope();// 创建SOAPHeader(不是必需)// SOAPHeader header = envelope.getHeader();// if (header == null)// header = envelope.addHeader();// QName hname = new QName(nameSpace, "username", "nn");// header.addHeaderElement(hname).setValue("huoyangege");// 创建SOAPBodySOAPBody body = envelope.getBody();QName ename = new QName(nameSpace, elementName, "");SOAPBodyElement ele = body.addBodyElement(ename);// 增加Body元素和值for (Map.Entry<String, String> entry : inMsg.entrySet()) {ele.addChildElement(new QName(nameSpace, entry.getKey())).setValue(entry.getValue());}// 超时设置dispatch.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT, timeout);dispatch.getRequestContext().put(JAXWSProperties.REQUEST_TIMEOUT, timeout);// 通过Dispatch传递消息,会返回响应消息SOAPMessage response = dispatch.invoke(msg);// 响应消息处理,将响应的消息转换为doc对象Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();String ret = doc.getElementsByTagName(responseName).item(0).getTextContent();return ret;} catch (Exception e) {e.printStackTrace();throw e;}}public static void main(String[] args) throws Exception {
//        SoapClient soapClient=new SoapClient("http://spring.io/guides/gs-producing-web-service","http://localhost:8080/ws/countries.wsdl",
//                "CountriesPortService","CountriesPortSoap11","getCountry",
//                "getCountryResponse",
//                2000);SoapJaxwsClient soapClient = new SoapJaxwsClient("http://WebXml.com.cn/", "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl","MobileCodeWS", "MobileCodeWSSoap", "getDatabaseInfo","getDatabaseInfoResponse",2000);
//        SoapClient soapClient=new SoapClient("http://WebXml.com.cn/","http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.wsdl",
//                "IpAddressSearchWebService","IpAddressSearchWebServiceSoap","getCountryCityByIp",
//                "getCountryCityByIpResult",
//                2000);//封装请求参数HashMap<String, String> msg = new HashMap<>();
//        msg.put("theIpAddress","111.249.198.56");
//        msg.put("mobileCode","18702750020");
//        msg.put("userID","");String s = soapClient.sendMessage(msg);System.out.println(s);}
}

测试结果:

优点

pom配置简单,无须解决各种版本依赖的问题。

缺点

可以看到Jaxws的调用和Axis2一样,都具有较高的灵活性,都可以自定义xml的节点数据。

所不同的是,它的调用代码稍显繁琐,但如果在生产中,有良好的封装,这应该不是问题。

小结

对于SOAP方式WebService的调用,有客户端的调用,推荐maven插件自动生成代码的形式,唯一的缺点是需要重新部署一次。

对于无客户端的调用,推荐Axis2或者Jaxws的形式,考虑到二者实现其实各有优劣,有需要的读者可以自行甄别选用。

相关文章:

Java客户端调用SOAP方式的WebService服务实现方式分析

简介 在多系统交互中&#xff0c;有时候需要以Java作为客户端来调用SOAP方式的WebService服务&#xff0c;本文通过分析不同的调用方式&#xff0c;以Demo的形式&#xff0c;帮助读者在生产实践中选择合适的调用方式。 本文JDK环境为JDK17。 结论 推荐使用Axis2或者Jaxws&#…...

华为机试真题--字符串序列判定

题目描述: 输入两个字符串S和L,都只包含英文小写字母,其中S长度<=100,L长度<=500000,请判定S是否是L的有效字串。 判定规则: S中的每个字符在L中都能找到(可以不连续),且S在L中字符的前后顺序与S中顺序要保持一致。(例如,S="ace"是L="abcd…...

Linux内核 -- 虚拟化之virtqueue结构

Linux Kernel中的Virtqueue Virtqueue是Linux Kernel中用于实现Virtio设备的一个关键数据结构。Virtio是一种虚拟I/O设备标准&#xff0c;旨在简化虚拟化环境中虚拟设备与虚拟机之间的通信。Virtqueue则是实现这种通信的核心机制。以下是Virtqueue的一些关键点&#xff1a; V…...

【pytorch18】Logistic Regression

回忆线性回归 for continuous:y xwbfor probability output:yσ(xwb) σ:sigmoid or logistic 线性回归是简单的线性模型&#xff0c;输入是x&#xff0c;网络参数是w和b&#xff0c;输出是连续的y的值 如何把它转化为分类问题?加了sigmoid函数&#xff0c;输出的值不再是…...

PostgreSQL的使用

PostgreSQL的使用 1.首先&#xff0c;使用docker进行安装pgvector数据库&#xff0c;具体的安装步骤可以查看我之前发的博文。 2.docker exec -it pgvector /bin/bash 进入docker容器内部&#xff0c;操作数据库&#xff0c;上述命令是以交互式命令进入了容器的内部&#xf…...

python 高级技巧 0706

python 33个高级用法技巧 列表推导式 简化了基于现有列表创建新列表的过程。 squares [x**2 for x in range(10)] print(squares)[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]字典推导式 用简洁的方式创建字典。 square_dict {x: x**2 for x in range(10)} print(square_dict){0…...

面试经典 106. 从中序与后序遍历序列构造二叉树

最近小胖开始找工作了&#xff0c;又来刷苦逼的算法了 555 废话不多说&#xff0c;看这一题&#xff0c;上链接&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/?envTypestudy-plan-v2&envIdtop-inte…...

如何解决群晖Docker注册表查询失败/无法拉取镜像等问题

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 问题概述 📒📒 解决方案 📒🔖 方法一🔖 方法二🔖 方法三⚓️ 相关链接 🚓️📖 介绍 📖 在群晖(Synology)NAS设备上使用Docker时,我们可能会遇到查询Docker注册表失败,无法拉取Docker镜像的问题。这种情况…...

【Scrapy】 深入了解 Scrapy 中间件中的 process_spider_input 方法

准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 &#x1f3b5; 陈慧娴《傻女》 Scrapy 是…...

数据库MySQL---基础篇

存储和管理数据的仓库 MySQL概述 数据库相关概念 数据库&#xff08;DataBase&#xff09;---数据存储的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统&#xff08;DBMS&#xff09;-----操纵和管理数据库的大型软件 SQL----操作关系型数据库的编程语言&#xff…...

欧姆龙安全PLC及周边产品要点指南

电气安全、自动化设备作业安全&#xff0c;向来是非常非常之重要的&#xff01;越来越多的客户在规划新产线、改造既有产线的过程中&#xff0c;明确要求设计方和施工方将安全考虑进整体方案中进行考虑和报价&#xff01;作为一名自动化电气工程师&#xff0c;尤其是高级工程师…...

tableau气泡图与词云图绘制 - 8

气泡图及词云图绘制 1. 气泡图绘制1.1 选择相关属性字段1.2 选择气泡图1.3 设置颜色1.4 设置标签1.5 设置单位 2. 气泡图绘制 - 22.1 类别筛选2.2 页面年份获取2.3 行列获取2.4 历史轨迹显示 3. 词云图绘制3.1 筛选器3.2 选择相关属性3.3 选择气泡图3.4 设置类型颜色3.5 设置形…...

C语言 找出一个二维数组中的鞍点

找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。 #include <stdio.h>int main() {int matrix[4][4] {{10, 17, 13, 28},{21, 14, 16, 40},{30, 42, 23, 39},{24, 11, 19, 17}};int n 4, m 4;int found 0;for (int i 0; i …...

【笔记】在linux中设置错文件如何重置

以mysql的auto.cnf文件为例...

DNS中的CNAME与A记录:为什么无法共存A解析和C解析?

在互联网的世界中&#xff0c;DNS&#xff08;域名系统&#xff09;扮演着至关重要的角色&#xff0c;它将易于记忆的域名转换为计算机可识别的IP地址。在这个过程中&#xff0c;两种常见的DNS记录类型——CNAME记录和A记录——经常被提及。然而&#xff0c;它们之间存在着一些…...

线程和进程

文章目录 进程和线程进程线程案例 时间片概念调度方式线程的创建和启动第一种创建方式第二种创建方式&#xff08;匿名内部类&#xff09;第三种创建方式&#xff08;Runnable接口&#xff09;main线程和t线程之间的关系 线程的名字线程的优先级线程状态 进程和线程 进程 在计…...

【JavaEE】 简单认识CPU

&#x1f435;本篇文章将对cpu的相关知识进行讲解 一、认识CPU 下图是简略的冯诺依曼体系结构图 上图中&#xff0c;存储器用来存储数据&#xff0c;注意在存储器中都是以二进制的形式存储数据的&#xff0c;CPU就是中央处理器&#xff0c;其功能主要是进行各种算术运算和各种…...

《数字图像处理-OpenCV/Python》第17章:图像的特征描述

《数字图像处理-OpenCV/Python》第17章&#xff1a;图像的特征描述 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第17章&#xff1a;图像的特征描述 特征检测与匹配是计算机视觉的…...

考研数学什么时候开始强化?如何保证进度不掉队?

晚了。我是实在人&#xff0c;不给你胡乱吹&#xff0c;虽然晚了&#xff0c;但相信我&#xff0c;还有的救。 实话实说&#xff0c;从七月中旬考研数一复习完真的有点悬&#xff0c;需要超级高效快速... 数二的时间也有点紧张... 中间基本没有试错的时间&#xff0c;让你换…...

Node.js的下载、安装和配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

java.util.Properties类介绍

java.util.Properties 是 Java 编程语言中的一个类,用于管理应用程序的配置信息,它继承自 java.util.Hashtable 类,因此它也是基于键值对的数据结构。主要用途是存储应用程序的配置参数,比如数据库连接信息、用户设置等。 以下是 Properties 类的一些主要特点和用法: 存储…...

SpringBoot后端验证码-防止密码爆破功能

一、简介 为了防止网站的用户被通过密码典爆破。引入验证码的功能是十分有必要的。而前端的验证码又仅仅是只防君子不防小人。通过burpsuit等工具很容易就会被绕过。所以后端实现的验证码才是对用户信息安全的一大重要保障。 实现思路&#xff1a; 1.引入图形生成的依赖 2.生成…...

ChatEval:通过多代理辩论提升LLM文本评估质量

论文地址:ChatEval: Towards Better LLM-based Evaluators through Multi-Agent Debate | OpenReviewText evaluation has historically posed significant challenges, often demanding substantial labor and time cost. With the emergence of large language models (LLMs…...

关于美国服务器IP的几个常见问题

在租用美国服务器时&#xff0c;与之密切相关的一个要素就是IP&#xff0c;关于IP的问题总是有人问起&#xff0c;这里列举几项常见的问题&#xff0c;以供参考。 一、IP收费吗&#xff1f; 一般情况下&#xff0c;在租用服务器时&#xff0c;会赠送几个IP&#xff0c;因为这些…...

redis运维:sentinel模式如何查看所有从节点

1. 连接到sentinel redis-cli -h sentinel_host -p sentinel_port如&#xff1a; redis-cli -h {域名} -p 200182. 发现Redis主服务器 连接到哨兵后&#xff0c;我们可以使用SENTINEL get-master-addr-by-name命令来获取当前的Redis主服务器的地址。 SENTINEL get-master-a…...

价格疑云?格行WiFi创始人亲解谜团,性价比之王如何炼成?

随身wifi行业乱象频出&#xff0c;作为行业领跑品牌的格行随身wifi&#xff0c;关于价格问题一直备受质疑。关于设备上的“格行自有格行的骄傲”也被外界认定为是自大&#xff0c;甚至发展的线下一万多家门店也被同行不认可。近日&#xff0c;企业财经专访记者有幸采访了格行随…...

揭秘“消费即赚”的循环购模式

大家好&#xff0c;我是吴军&#xff0c;今天我将带您深入探索一种颠覆传统的新型商业模式——循环购模式。在这个模式中&#xff0c;消费者不仅能享受到购物的乐趣&#xff0c;还能通过消费获得实实在在的回报&#xff0c;甚至实现“边消费边赚钱”的奇妙体验。您是否好奇&…...

javaweb个人主页设计(html+css+js)

目录 1 前言和要求 1.1 前言 1.2 设计要求 2 预览 2.1 主页页面 2.2 个人简介 2.3 个人爱好 2.4 个人成绩有代码&#xff0c;但是图片已省略&#xff0c;可以根据自己情况添加 2.5 收藏夹 3 代码实现 3.1 主页 3.2 个人简介 3.3 个人爱好 3.4 个人成绩&#xff…...

Android常用设计模式(小白必看)

不要担心冗长&#xff0c;3分钟解决面试和学习问题&#xff0c;收藏再看 目的&#xff1a;当作一种模板&#xff0c;结合自身特点&#xff0c;针对项目需求来使用 目录 单例模式 特点&#xff1a; 实现方式&#xff1a; 1、饿汉式 2、线程安全的懒汉式 3、双重校验锁 使…...

swift获取app网络和本地网络权限

请求蓝牙权限&#xff1a; //蓝牙if #available(iOS 13.1, *) {let autostate CBManager.authorizationif(autostate .notDetermined){print("")self.manager CBCentralManager(delegate: nil, queue: DispatchQueue.main,options: [CBCentralManagerOptionShowPo…...