Servlet基础教程 (保姆级教学)

news2024/11/24 0:54:58

Servlet基础教程

  • 一、Servlet 是什么
  • 二、第一个 Servlet 程序
    • 2.1 创建项目
    • 2.2 引入依赖
    • 2.3 创建目录
    • 2.4 编写代码
    • 2.5 打包程序
    • 2.6 部署程序
    • 2.7 验证程序
  • 三、更方便的部署方式
    • 3.1 安装 Smart Tomcat 插件
    • 3.2 配置 Smart Tomcat 插件
  • 四、常见的访问出错
    • 4.1 出现 404
    • 4.2 出现 405
    • 4.3 出现 500
    • 4.4 出现 “空白页面”
    • 4.5 出现 “无法访问此网站”
    • 4.6 总结

一、Servlet 是什么

Servlet 是一种实现动态页面的技术。是一组 Tomcat 提供给程序猿的 API,帮助程序猿简单高效的开发一个 web app。

HTTP 服务器,本质上就是一个 TCP 服务器,只不过在此基础上加了一些按照 HTTP 协议格式进行解析 / 构造的代码。咱们写网站后端,要做的就是调用 Tomcat 提供的API进行二次开发。

静态页面也就是内容始终固定的页面。即使 用户不同/时间不同/输入的参数不同,页面内容也不会发生变化 (除非网站的开发人员修改源代码,否则页面内容始终不变) ~~
对应的,动态页面指的就是 用户不同/时间不同/输入的参数不同,页面内容会发生变化。

举个例子:
Tomcat 的主页 https://tomcat.apache.org/ 就是一个静态页面:
在这里插入图片描述

而 B 站的主页 https://www.bilibili.com/ 则是一个动态页面:

在这里插入图片描述

  • 静态页面:页面内容是固定的 (以文件的形式静静躺在硬盘的指定目录中)!
    无论什么时候访问,无论什么人来访问,得到的页面效果都一样 ~~
  • 动态页面:不是一个真实的硬盘文件,而是通过代码在内存中构造出的一个 “虚拟的资源”!
    这就可以根据访问时间的不同,访问人的不同,访问时带有的参数不同,来构造出不同的页面 ~~

构建动态页面的技术有很多,每种语言都有一些相关的库 / 框架来做这件事。
Servlet 就是 Tomcat 这个 HTTP 服务器提供给 Java 的一组 API (来进行二次开发),来完成构建动态页面这个任务。

Servlet 主要做的工作:

  • 允许程序猿注册一个类,在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类中的一些代码。
  • 帮助程序猿解析 HTTP 请求,把 HTTP 请求从一个字符串解析成一个 HttpRequest 对象。
  • 帮助程序猿构造 HTTP 响应,程序猿只要给指定的 HttpResponse 对象填写一些属性字段,Servlet 就会自动的安装 HTTP 协议的方式构造出一个 HTTP 响应字符串,并通过 Socket 写回给客户端。

当然,Servlet 还支持一些其他的辅助功能,此处暂时先不介绍。

简而言之,Servlet 是一组 Tomcat 提供的 API,让程序猿自己写的代码能很好的和 Tomcat 配合起来,从而更简单的实现一个 web app,而不必关注 Socket、HTTP协议格式、多线程并发等技术细节,降低了 web app 的开发门槛,提高了开发效率。

二、第一个 Servlet 程序

2.1 创建项目

使用 IDEA 创建一个 Maven 项目。
1)菜单 -> 文件 -> 新建项目 -> Maven
在这里插入图片描述
2)选择项目要存放的目录
在这里插入图片描述
3)创建完成
在这里插入图片描述

此处创建了一个 Maven 项目,Maven 是啥?
Maven 是一个构建工具 (build),包括但不限于编译、打包、部署…
之前咱们写代码,都是直接在idea里,点击main方法前面的三角号就自动编译运行了,这针对一些比较简单的程序还好。如果是一些更复杂的程序,尤其是有多个模块并且相互依赖,比如A依赖B,B依赖C,此时你要想编译运行A,就必须要先编译运行B;要想编译运行B,就需要先编译运行C…
构建工具就是为了解决这个问题,使我们在开发比较复杂的项目时,也可以比较方便地进行编译和打包操作!咱们使用 Maven 主要就是借助 Maven 进行编译、打包、管理依赖…
(在 Java 中,类似于 Maven 的构建工具是比较多的:Ant、Gradle…)

2.2 引入依赖

&emp;Maven 项目创建完毕后, 会自动生成一个 pom.xml 文件。我们需要在 pom.xml 中引入 Servlet API 依赖的 jar 包。
1)在 Maven中央仓库中搜索 “servlet”,一般都是第一个结果。
在这里插入图片描述

2)选择配套版本,这里选择 3.1.0 版本
在这里插入图片描述

Servlet 的版本要和 Tomcat 匹配,如果我们使用 Tomcat 8.5,那么就需要使用 Servlet 3.1.0,可以在 这个网址:https://tomcat.apache.org/whichversion.html 查询版本对应关系。

3)把中央仓库中提供的 xml 复制到项目的 pom.xml 中
在这里插入图片描述
修改后的 pom.xml 形如:
在这里插入图片描述
第一次使用可能有标红的现象,把文件下载下来了,标红就没有了。

<dependencies> 标签内部放置项目依赖的 jar 包,maven 会自动下载依赖到本地。
在这里插入图片描述

关于 groupId, artifactId, version
如果我们要把这个写的代码发布到中央仓库上,那么就需要设定好这几个 ID 了

  • groupId: 表示组织名称
  • artifactId: 表示项目名称
  • version: 表示版本号

中央仓库就是按照这三个字段来确定唯一一个包的 ~~
红色方框圈出来的部分, 就是这个 jar 包的 groupId, artifactId, version:
在这里插入图片描述

2.3 创建目录

当项目创建好了之后, IDEA 会帮我们自动创建出一些目录。形如:
在这里插入图片描述

  • src 表示源代码所在的目录;
  • main/java 表示源代码的根目录,后续创建 .java 文件就放到这个目录中;
  • main/resources 表示项目的一些资源文件所在的目录;
  • test/java 表示测试代码的根目录,此处暂时不关注。

虽然当下maven 帮我们创建了一些目录,但是还不足以支撑咱们写一个Servlet项目,因此需要手动的再创建一些目录和文件出来。

1)创建 webapp 目录
在 main 目录下,和 java 目录并列,创建一个 webapp 目录 (注意,不是 webapps)
在这里插入图片描述

2)创建 web.xml
在 webapp 目录内部创建一个 WEB-INF 目录,并创建一个 web.xml 文件。
在这里插入图片描述

3)编写 web.xml
往 web.xml 中拷贝以下代码:

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>
  • webapp 目录就是未来部署到 Tomcat 中的一个重要的目录。当前我们可以往 webapp 中放一些静态资源,比如 html、css 等。
  • 在这个目录中还有一个重要的文件 web.xml。Tomcat 找到这个文件才能正确处理 webapp 中的动态资源。
    在这里插入图片描述

2.4 编写代码

在 java 目录中创建一个类 HelloServlet,代码如下:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello servlet!");
        resp.getWriter().write("hello");
    }
}

解释:

  • 创建一个类 HelloServlet,继承自 HttpServlet
  • 在这个类上方加上 @WebServlet(“/hello”) 注解,表示 Tomcat 收到的请求中,路径为 /hello 的请求才会调用 HelloServlet 这个类的代码 (这个路径未包含 Context Path)。
  • 重写 doGet 方法。 doGet 的参数有两个,分别表示收到的 HTTP 请求 和要构造的 HTTP 响应。 这个方法会在 Tomcat 收到 GET 请求时触发。
    一个服务器的工作流程就可以分成三个典型的步骤:1)接收请求并解析;2)根据请求计算响应;3)构造响应数据,并返回给客户端
    1和3这两步,tomcat 已经帮我们做好了;2这步就是咱们程序猿自己要实现的逻辑,也就是doGet等方法要实现的内容!
  • HttpServletRequest 表示 HTTP 请求。Tomcat 按照 HTTP 请求的格式把字符串格式的请求转成了一个 HttpServletRequest 对象,后续想获取请求中的信息 (方法、url、header、body 等) 都是通过这个对象来获取。
  • HttpServletResponse 表示 HTTP 响应。代码中把响应对象构造好 (构造响应的状态码、header、body 等)
  • resp.getWriter() 会获取到一个流对象,通过这个流对象就可以写入一些数据,写入的数据会被构造成一个 HTTP 响应的 body 部分,Tomcat 会把整个响应转成字符串,通过 socket 写回给浏览器。

在这里插入图片描述

上面的代码虽然只有寥寥几行,但是包含的信息量是巨大的!

  1. 我们的代码不是通过 main 方法作为入口了。main 方法已经被包含在 Tomcat 里,我们写的代码会被 Tomcat 在合适的时机调用起来。此时我们写的代码并不是一个完整的程序,而是 Tomcat 这个程序的一小部分逻辑。
  2. 我们随便写个类都能被 Tomcat 调用吗?满足啥样条件才能被调用呢?主要满足三个条件:
    a) 创建的类需要继承自 HttpServlet;
    b) 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径;
    c) 这个类需要实现 doXXX 方法。
    当这三个条件都满足之后,Tomcat 就可以找到这个类,并且在合适的时机进行调用。

2.5 打包程序

使用 Maven 进行打包。打开 Maven 窗口 (一般在 IDEA 右侧就可以看到 Maven 窗口。如果看不到的话,可以通过 菜单 -> View -> Tool Window -> Maven 打开),然后展开 Lifecycle,双击 package 即可进行打包。
在这里插入图片描述

如果成功的话,会出现下面的字样:
在这里插入图片描述
如果代码/配置/环境存在问题, 可能会提示 BUILD FAILED, 可以根据具体提示的错误信息具体解决。

打包成功后,可以看到在 target 目录下,生成了一个 jar 包:
在这里插入图片描述
这样的 jar 包并不是我们需要的,Tomcat 需要识别的是另外一种 war 包格式。另外这个 jar 包的名字太复杂了,我们也希望这个名字能更简单一点。

war 包和 jar 包的区别:

  • jar 包是普通的 java 程序打包的结果,里面会包含一些 .class 文件。
  • war 包是 java web 的程序,里面除了会包含 .class 文件之外,还会包含 HTML、CSS、JavaScript、图片、以及其他的 jar 包。打成 war 包格式才能被 Tomcat 识别!!!

ServletHelloWorld-1.0-SNAPSHOT.jar 的由来:( pom.xml 文件中)
在这里插入图片描述
相当于把 artifactId 和 version 拼接起来了。

在 pom.xml 中新增一个 packing 标签,表示打包的方式是打一个 war 包:

	<packaging>war</packaging>

在 pom.xml 中再新增一个 build 标签, 内置一个 finalName 标签, 表示打出的 war 包的名字是HelloServlet:

    <build>
        <finalName>yyhjava</finalName>
    </build>

在这里插入图片描述
重新使用 maven 打包,可以看到生成的新的 war 包的结果:
在这里插入图片描述

2.6 部署程序

把 war 包拷贝到 Tomcat 的 webapps 目录下:
1)打开war的位置:
在这里插入图片描述
2)复制黏贴到tomcat文件夹下:
在这里插入图片描述

3)启动 tomcat:(双击 bin 目录的 startup.bat)
在这里插入图片描述
看到这个日志说明 Tomcat 已经正确识别了 ServletHelloWorld 这个 webapp。

2.7 验证程序

此时通过浏览器访问 http://127.0.0.1:8080/yyhjava/hello,就可以看到结果了:(记得启动 tomcat)
在这里插入图片描述

URL 中的 PATH 分成两个部分:其中 HelloServlet 为 Context Path,hello 为 Servlet Path。
在这里插入图片描述

学到这里,有些同学会纳闷,通过这么麻烦的方式得到的页面也不过如此,为啥还要通过 Tomcat 这么折腾???

  • 获得的是动态页面! 是通过 Java 代码生成的 ~~ (假如我们这里加个时间戳输出的话,页面内容每次刷新都会不一样!)
  • 并且 双击本地打开只能访问自己电脑的;使用 Tomcat 可以通过网络访问到别人电脑的网页! 但是此时并不可以,因为不在同一个局域网中 (NAT机制)!
    注意: 127.0.0.1 为环回 IP,表示当前主机。此时别人无法通过这个 IP 访问到本地电脑上的页面。内网 IP 是会重复的!要想能够远程访问,势必要有一个外网 IP,怎样才能有外网 IP?可以使用云服务器 ~~ (后续讲解)

三、更方便的部署方式

上述这七个步骤是针对一个新的项目。项目创建好之后,后续修改代码时前三个步骤就不必重复了,直接从4-7进行操作即可。其中 打包程序 和 部署程序 可以进行优化!!!

我们使用 IDEA 中的 Smart Tomcat 插件完成这个工作!

3.1 安装 Smart Tomcat 插件

1)File -> Settings
在这里插入图片描述

2)选择 Plugins,选择 Marketplace,搜索 “tomcat”,点击 “Install”
在这里插入图片描述

3)安装完毕之后,会提示 “重启 IDEA”

3.2 配置 Smart Tomcat 插件

1)点击右上角的 “Add Configuration”
在这里插入图片描述

2)选择左侧的 “Smart Tomcat”
在这里插入图片描述

3)在 Name 这一栏填写一个名字 (可以随便写);在 Tomcat Server 这一栏选择 Tomcat 所在的目录,其他的选项不必做出修改
在这里插入图片描述

其中 Context Path 默认填写的值是项目名称。

4)点击 OK 之后, 右上角变成了如下:
在这里插入图片描述

点击绿色的三角号,IDEA 就会自动进行编译、部署、启动 Tomcat 的过程:
在这里插入图片描述

有的同学可能会出现下图这种情况,这是因为端口已经被服务器绑定了,再次启动一个程序绑定同一个端口,就会出现这个错误。解决方法就是关闭掉之前打开的 tomcat 即可。
在这里插入图片描述

5)访问页面
在浏览器中使用 http://127.0.0.1:8080/yyhjava/hello 访问页面。
在这里插入图片描述

四、常见的访问出错

4.1 出现 404

404 表示用户访问的资源不存在。

1)你请求的资源路径写的不对
2)路径虽然对,但是服务器没有正确把资源加载起来

错误实例1: 少写了 Context Path
通过 /hello 访问服务器
在这里插入图片描述

错误实例2: 少写了 Servlet Path
通过 /ServletHelloWorld 访问服务器
在这里插入图片描述

错误实例3: Servlet Path 写的和 URL 不匹配
这里是hello:
在这里插入图片描述
少了一个o:
在这里插入图片描述

错误实例4: web.xml 写错了
清除 web.xml 中的内容,重启 Tomcat 服务器。通过浏览器访问 URL, 可以看到:
在这里插入图片描述

4.2 出现 405

405 表示对应的 HTTP 请求方法没有实现。

错误实例: 没有实现 doGet 方法

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

}

重启 Tomcat 服务器,在浏览器中访问,可以看到:
在这里插入图片描述
在浏览器地址栏直接输入 URL,会发送一个 HTTP GET 请求。
此时就会根据 /ServletHelloWorld/hello 这个路径找到这个类 并且尝试调用
HelloServlet 的 doGet 方法。
但是如果没有实现 doGet 方法,就会出现上述现象。

4.3 出现 500

往往是 Servlet 代码中抛出异常导致的。

错误实例: 假如我们的代码如下,s指向null:
在这里插入图片描述

重启 Tomcat 服务器,重新访问页面,可以看到:
在这里插入图片描述
在页面上已经有具体的异常调用栈,异常信息里已经提示了出现异常的代码是 HelloServlet.java 的第 15 行。仔细检查这里的代码就可以看到空指针异常。

4.4 出现 “空白页面”

错误实例: 我们修改代码,去掉 resp.getWritter().write() 操作。
重启服务器,访问服务器,可以看到一个空白页面:
在这里插入图片描述

抓包可以看到,响应 body 中的内容就是 “空数据”。
在这里插入图片描述

4.5 出现 “无法访问此网站”

一般是 Tomcat 启动就失败了。

错误实例: Servlet Path 写错了。应该写作 “/hello”。
在这里插入图片描述

Tomcat 在启动的时候已经提示了相关的错误。Tomcat 启动的日志里面报错信息可能比较多,需要耐心观察,找到关键的提示。
在这里插入图片描述

看到的现象:
在这里插入图片描述

4.6 总结

初学 Servlet,遇到的这类问题会非常多。我们不光要学习 Servlet 代码的基本写法,也要学习排查错误的思路。

熟悉 HTTP 协议能够让我们调试问题事半功倍:

  • 4xx 的状态码表示路径不存在,往往需要检查 URL 是否正确,和代码中设定的 Context Path 以及 Servlet Path 是否一致。
  • 5xx 的状态码表示服务器出现错误,往往需要观察页面提示的内容和 Tomcat 自身的日志,观察是否存在报错。
  • 出现连接失败往往意味着 Tomcat 没有正确启动,也需要观察 Tomcat 的自身日志是否有错误提示。
  • 空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程。

观察日志是调试程序的重要途径!Tomcat 的日志往往很多,需要耐心阅读、经常阅读,熟练了就能更快速找到问题了 ~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【jrebel and xrebel问题记录】激活时出现LS client not configued

教程目录问题描述所使用的环境和版本解决过程手动下载jrebel结束语问题描述 笔者在重装另一台电脑的时候又遇到了这个安装jrebel and xrebel进行激活的问题 但是我在网上找了很多的办法&#xff08;其实都是相同的办法&#xff0c;只是在尝试别人不同的用于激活的服务器&#…

【Java编程进阶】方法初识

推荐学习专栏&#xff1a;Java 编程进阶之路【从入门到精通】 文章目录1. Java 方法初识2. 方法的创建与使用3. 方法的分类3.1 无参无返回值3.2 无参带返回值3.3 有参无返回值3.4 有参带返回值4. 递归方法5. 总结1. Java 方法初识 方法是组合在一起来执行操作语句的集合&#…

k8s收集日志

k8s收集日志 一.收集控制台日志 采用fluentdeskibana来做 所需要的文件可以在这里找 https://github.com/kubernetes/kubernetes/tree/v1.23.0/cluster/addons/fluentd-elasticsearch1.创建目录并下载所需文件 cd /root/k8s/yaml/efk [rootworker1 efk]# ll total 44 -rw-…

绝缘子红外图像检测项目(TF2)

目录 1. 项目背景 2. 图像数据集介绍 labelimg的安装流程&#xff1a; 1. 打开Anaconda Prompt&#xff08;Anaconda3&#xff09; 2. 创建一个新环境来安装labelimg 3. 激活新创建的环境labelimg 4.输入 5.输入labelimg 即可运行 3. 模型介绍 4. 模型性能测试 1. 项目…

Linux学习笔记——Linux实用操作(二)

04、Linux实用操作 4.6、IP地址、主机名 4.6.1、IP地址、主机名 学习目标&#xff1a; 掌握什么是IP地址掌握什么是主机名掌握什么是域名解析 4.6.1.1、IP地址 1、每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯。 IP地址主要有2个版本&#xff0…

2023上半年软考高级-信息系统项目管理师【名师授课班】

信息系统项目管理师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资…

2022年圣诞节 | matlab实现炫酷的圣诞树

*2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 这里的部分代码已经在网上出现过&#xff0c;做了部分优化。是matlab版本。 一、内容介绍 这段代码是一个生成3D圣诞树的Matlab函数。运行该函数时&#xff0c;它使用圆柱函数创建圣诞树的 3D 表面&#xff0c;对…

【一】微服务技术栈导学

微服务技术栈导学什么是微服务&#xff1f;微服务技术栈注册中心配置中心服务网关分布式缓存分布式搜索消息队列分布式日志服务&系统监控和链路追踪自动化部署微服务技术栈包含知识点学习路线知识内容来自于黑马程序员视频教学和百度百科。博主仅作笔记整理便于回顾学习。如…

Android设计模式详解之适配器模式

前言 适配器模式在Android开发中使用率很高&#xff0c;如ListView、RecyclerView&#xff1b; 定义&#xff1a;适配器模式把一个类的接口变换成客户端所期待的另一个接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作&#xff1b; 使用场景&…

2023年加密行业会更难吗?欧科云链研究院“七大趋势预测”

回望2022&#xff0c;加密行业遭遇了种种不可控因素而导致的艰难险阻&#xff0c;也在变革与发展中孕育着生机与活力。 这一年&#xff0c;我们亲眼目睹了Luna暴雷&#xff0c;三箭资本、FTX这些曾经被认为“大而不倒”的机构接连倒下&#xff0c;市场信心严重受挫&#xff1b;…

登陆港股市场,阳光保险的 “价值锚点”

不确定性环境里&#xff0c;信心比黄金还重要。 最近&#xff0c;利好信号频频出现在保险行业&#xff0c;资本信心不断加固。上个月月底&#xff0c;个人养老金制度启动实施&#xff0c;市场迅速传来喝彩声。这不仅将加快推动养老保险作为第三支柱的壮大&#xff0c;而且还为…

ARM体系架构中的存储系统

在计算机系统当中&#xff0c;数据的存储是以字节为单位的&#xff0c;每个地址单元当中都可以存放一个字节的数据&#xff0c;每个字节为8bit。在C语言中编译器为char型的数据分配了一个字节的存储空间&#xff0c;为long型的数据分配了4个字节的存储空间&#xff0c;为int型的…

【NI Multisim 14.0编辑环境——工具栏】

目录 序言 一、工具栏 &#x1f34a;1.“标准”工具栏 &#x1f34a; 2.视图工具栏 &#x1f34a;3.“主”工具栏 &#x1f34a;4.“元器件”工具栏 &#x1f34a;5.“Simulation”&#xff08;仿真&#xff09;工具栏 &#x1f34a;6.“Place probe”&#xff08;放置探针…

ARM64内存虚拟化分析(2)常用结构体

内存虚拟化相关的几个重要结构体如下图所示&#xff1a; 这里介绍几个结构体以及相互之间有关系。 &#xff08;1&#xff09;AddressSpace结构体 它用于表示一个虚拟机或虚拟CPU能够访问的所有物理地址。其中&#xff1a; root&#xff1a;指向根MR Current_map&#xff1…

营销在中国

&#xff08;1&#xff09;4P、4C、4R、4I作为一个企业&#xff0c;不外乎就是两个是&#xff1a;产-销。你生产-客户购买&#xff0c;这个交易能做成&#xff0c;不外乎在于交换的价值&#xff0c;以及交易的价格-成本。一、4P4P&#xff0c;是美国密歇根大学教授杰罗姆麦卡锡…

向量的点乘与X乘以及意义

一、向量的点乘 向量的点乘&#xff08;dot&#xff09;是一个标量积&#xff0c;也叫向量的内积、数量积。 点乘公式&#xff1a; 有向量a b a(a1,a2,a3,...,an) b(b1,b2,b3,...,bn); 那么向量a(dot)ba1b1a2b2a3b3....anbn 从上面我们能可以看出&#xff0c;点乘得到的结…

2022年个人融资方法和工具研究报告

第一章 理论和概况 1.1 融资概念 融资&#xff0c;英文为Financing&#xff0c;指为支付超过现金或转账的购货款而采取的货币交易手段&#xff0c;或者为取得特定资产而筹集资金所采取的货币手段。融资通常指货币资金的持有者和需求者之间&#xff0c;直接或间接地进行资金融…

Appium基础 — 模拟手势点击坐标

1、模拟手势点击坐标 在定位元素的时候&#xff0c;你使出了十八班武艺还是定位不到&#xff0c;怎么办呢&#xff1f;&#xff08;面试经常会问&#xff09; 那就拿出绝招&#xff1a;点击元素所在位置的坐标。&#xff08;坐标定位&#xff09; 详细说明&#xff1a; 如下…

OpenWrt无法打开国内网站的解决方法

最近小半个月以来根据lean和lieno源码编译的OpenWrt固件在使用了smartdns之后会出现无法打开国内网页的情况。 诡异的是&#xff0c; 重启防火墙之后&#xff0c; 能正常访问百度等国内网站&#xff0c; 但是&#xff0c; 过上一段时间&#xff0c; 就又不行了。 在经过近一个…

示波器应用(三)

示波器可做什么&#xff1f; 基础材质检查环境搭建校验 相似材质之间的细微差异分析 场景调光依据/竞品分析 定位曝光、色相问题 风格化调色监视 LUTs检查 材质检查 单看上图的分量示波器&#xff0c;仔细想一想这张图是什么色相&#xff1f; 公布答案 分量示波器rgb模…