JavaWeb---Servlet
1.Srvlet概述
Servlet是运行在java服务器端的程序,用于接收和响应来着客户端基于HTTP协议的请求
如果想实现Servlet的功能,可以通过实现javax。servlet。Servlet接口或者继承它的实现类
核心方法:service(),任何客户端的请求都会经过该方法

2.Servlet快速入门
1.创建一个WEB项目
2.重写一个类继承GenericServlet
3.重写service方法
4.在web.xml中配置Servlet
5.部署并启动项目
6.通过浏览器测试
例:
package servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;import java.io.IOException;/*Servlet快速入门*/
public class ServletDemo01 extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service执行了...");}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--Servlet快速入门1的配置--><servlet><servlet-name>servletDemo01</servlet-name><servlet-class>servlet.ServletDemo01</servlet-class></servlet><servlet-mapping><servlet-name>servletDemo01</servlet-name><url-pattern>/servletDemo01</url-pattern></servlet-mapping>
</web-app>

网页输入:http://localhost:8080/demo1/servletDemo01
Servlet的执行过程

Servlet关系视图

3.Servlet实现方式之HttpServlet
Servlet实现方式
1.第一种
实现Servlet接口,实现所有的抽象方法。该方法支持最大程度的自定义
2.第二种
继承GenericServlet抽象类,必须重写servic方法,其他方法可选择重写。该方法让我们开发Servlet变得简单。但是这种方式和HTTP协议无关
3.第三种
继承HttpServlet抽象类,需要重写doGet和doPost方法。该方式表示请求和响应都需要和HTTP协议相关
步骤
1.创建一个类继承HttpServlet
2.重写doGet和doPost方法
3.在web.xml中配置Servlet
4.部署并启动项目
5.通过浏览器测试
例:
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*快速入门02
*/
public class ServletDemo02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("方法执行了...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--Servlet快速入门1的配置--><servlet><servlet-name>servletDemo01</servlet-name><servlet-class>servlet.ServletDemo01</servlet-class></servlet><servlet-mapping><servlet-name>servletDemo01</servlet-name><url-pattern>/servletDemo01</url-pattern></servlet-mapping><!--Servlet快速入门2的配置--><servlet><servlet-name>servletDemo02</servlet-name><servlet-class>servlet.ServletDemo02</servlet-class></servlet><servlet-mapping><servlet-name>servletDemo02</servlet-name><url-pattern>/servletDemo02</url-pattern></servlet-mapping>
</web-app>
4.Servlet的生命周期
对象的生命周期,就是对象从出生到死亡的过程。即:出生 -> 活着 -> 死亡。官方说法是对象创建到销毁的过程
出生:请求第一次到达 Servlet 时,对象就创建出来,并且初始化成功。只出生(创建)一次,将对象放到内存中
活着:服务器提供服务的整个过程中,该对象一直存在,每次都是执行 service 方法
死亡:当服务停止时,或者服务器宕机时,对象死亡
例:
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*Servlet的生命周期
*/
public class ServletDemo03 extends HttpServlet {//对象出生的过程@Overridepublic void init() throws ServletException {System.out.println("对象创建并初始化成功");}//对象服务的过程@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("接收到了客户端的请求...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}//对象销毁的过程@Overridepublic void destroy() {System.out.println("对象销毁了...");}
}
web.xml:
<!--Servlet生命周期的配置--><servlet><servlet-name>servletDemo03</servlet-name><servlet-class>servlet.ServletDemo03</servlet-class></servlet><servlet-mapping><servlet-name>servletDemo03</servlet-name><url-pattern>/servletDemo03</url-pattern></servlet-mapping>
结论:Servlet 对象只会创建一次,销毁一次。所以 Servlet 对象只有一个实例。如果一个对象实例在应用中是唯一的存在,那么我们就称它为单例模式
5.Servlet线程安全问题
由于 Servlet 采用的是单例模式,也就是整个应用中只有一个实例对象。所以我们需要分析这个唯一的实例对象中的类成员是否线程安全
模拟用户登录功能来查看 Servlet 线程是否安全
例:
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
Servlet线程安全的问题*/
public class ServletDemo04 extends HttpServlet{//1.定义用户名成员变量private String username = null;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//2.获取用户名username = req.getParameter("username");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//3.获取输出流对象PrintWriter pw = resp.getWriter();//4.响应给客户端浏览器pw.print("welcome:" + username);//5.关流pw.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
<!--Servlet线程安全的配置--><servlet><servlet-name>servletDemo04</servlet-name><servlet-class>servlet.ServletDemo04</servlet-class></servlet><servlet-mapping><servlet-name>servletDemo04</servlet-name><url-pattern>/servletDemo04</url-pattern></servlet-mapping>
谷歌浏览器中url传递参数username=aaa
火狐浏览器中url传递参数username=bbb
结果两个浏览器都是welcome:bbb
结论:一个浏览器代表一个线程,多个浏览器代表多个线程。按理说我们期望的应该是每个浏览器查看的都应该是自己的用户名。而现在的结果是浏览器中数据混乱。因此,我们可以认为 Servlet 是线程不安全的!
解决:定义类成员要谨慎。如果是共用的,并且只会在初始化时赋值,其他时间都是获取的话,那么是没问题的。如果不是共用的,或者每次使用都有可能对其赋值,那就要考虑线程安全问题了,可以将其定义到 doGet 或 doPost 方法内或者使用同步功能即可。
方法1:将username由成员变量,放到方法中
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
Servlet线程安全的问题*/
public class ServletDemo04 extends HttpServlet{//1.定义用户名成员变量// private String username = null;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = null;//2.获取用户名username = req.getParameter("username");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//3.获取输出流对象PrintWriter pw = resp.getWriter();//4.响应给客户端浏览器pw.print("welcome:" + username);//5.关流pw.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
方法二:使用同步代码块
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
Servlet线程安全的问题*/
public class ServletDemo04 extends HttpServlet{//1.定义用户名成员变量private String username = null;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//String username = null;synchronized (this){//2.获取用户名username = req.getParameter("username");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//3.获取输出流对象PrintWriter pw = resp.getWriter();//4.响应给客户端浏览器pw.print("welcome:" + username);//5.关流pw.close();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
6.Servlet不同映射方式
第一种
具体名称的方式。访问的资源路径必须和映射配置完全相同
第二种
/ 开头 + 通配符的方式。只要符合目录结构即可,不用考虑结尾是什么
第三种
通配符 + 固定格式结尾的方式。只要符合固定结尾格式即可,不用考虑前面的路径
注意:优先级问题。越是具体的优先级越高,越是模糊通用的优先级越低。第一种 -> 第二种 -> 第三种
例:
第一种:具体名称的方式
访问:http://localhost:8080/demo1/servletDemo05
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*Servlet不同映射方式*/
public class ServletDemo05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletDemo05执行了...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}}
<!--Servlet不同映射方式--><!--指定名称的方式--><servlet><servlet-name>servletDemo05</servlet-name><servlet-class>servlet.ServletDemo05</servlet-class></servlet><servlet-mapping><servlet-name>servletDemo05</servlet-name><url-pattern>/servletDemo05</url-pattern></servlet-mapping>
第二种:/开头+通配符的方式
访问:http://localhost:8080/demo1/servlet/....
<!--/ 开头 + 通配符的方式--><servlet><servlet-name>servletDemo05</servlet-name><servlet-class>servlet.ServletDemo05</servlet-class></servlet><servlet-mapping><servlet-name>servletDemo05</servlet-name><url-pattern>/servlet/*</url-pattern></servlet-mapping>
第三种:通配符+固定格式结尾
访问:http://localhost:8080/demo1/xxx.do
<!--通配符+固定格式结尾的方式--><servlet><servlet-name>servletDemo05</servlet-name><servlet-class>servlet.ServletDemo05</servlet-class></servlet><servlet-mapping><servlet-name>servletDemo05</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
7.Servlet创建时机
1.第一次访问时创建
优势:减少对服务器内存的浪费。提高了服务器启动的效率
弊端:如果有一些要在应用加载时就做的初始化操作,无法完成
2.服务器加载时创建
优势:提前创建好对象,提高了首次执行的效率。可以完成一些应用加载时要做的初始化操作
弊端:对服务器内存占用较多,影响了服务器启动的效率
修改Servlet创建时间:在<servlet>标签中,添加<load-on-startu>标签

正整数代表服务器加载时创建,值越小、优先级越高。 负整数或不写代表第一次访问时创建
<load-on-startup>加载顺序的序号</load-on-startup>
序号为1,就是服务器启动时第一个加载
序号为2,就是服务器启动时第二个加载
如果两个Servlet都要配置为正整数,那么值小的优先级高
<!--Servlet生命周期的配置--><servlet><servlet-name>servletDemo03</servlet-name><servlet-class>servlet.ServletDemo03</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>servletDemo03</servlet-name><url-pattern>/servletDemo03</url-pattern></servlet-mapping>
会在启动tomcat的时候初始化
8.默认Servlet
默认Servlet是由服务器提供的一个Servlet,它配置在Tomcat的conf目录下的web.xml中
它的映射路径是<url-pattern>/<url-pattern>,我们在发送请求时,首先会在我们项目中的 web.xml 中查找映射配置,找到则执行。
但是当找不到对应的 Servlet 路径时,就去找默认的 Servlet,由默认 Servlet 处理。所以,一切都是 Servlet。
如果我们访问一个不存在的url,浏览器会加载一个404界面,这个404界面,其实就是tomcat配置的默认的Servlet处理的结果。
9.ServletConfig
1.ServletConfig概述
ServletConfig 是 Servlet 的配置参数对象,在 Servlet 的规范中,允许为每一个 Servlet 都提供一
些初始化的配置。所以,每个 Servlet 都有一个自己的 ServletConfig
作用:在 Servlet 的初始化时,把一些配置信息传递给 Servlet
生命周期
生命周期:和Servlet相同
如果Servlet配置了<load-on-startup>1</load-on-startup>,那么ServletConfig也会在应用加载时创建
ServletConfig的配置信息都是键值对的形式
2.ServletConfig的配置方式
在<servlet>标签中,通过<init-param>标签来配置。有两个子标签
<param-name>:代表初始化参数的 key
<param-value>:代表初始化参数的 value
一个init-param配置一个信息,一个信息由name和value组成(只允许一个键值对存在)
例:
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*ServletConfig的演示*/
public class ServletConfigDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置Servlet--><servlet><servlet-name>servletConfigDemo</servlet-name><servlet-class>servlet.ServletConfigDemo</servlet-class><!--配置ServletConfig初始化参数--><init-param><!--用于获取初始化参数的key--><param-name>encoding</param-name><!--初始化参数的值--><param-value>UTF-8</param-value></init-param><init-param><param-name>desc</param-name><param-value>This is ServletConfig</param-value></init-param></servlet><servlet-mapping><servlet-name>servletConfigDemo</servlet-name><url-pattern>/servletConfigDemo</url-pattern></servlet-mapping></web-app>
3.ServletConfig的常用方法
| 返回值 | 方法名 | 说明 |
|---|---|---|
| String | getInitParameter(String name) | 根据参数名称获取参数的值 |
| Enumeration<String> | getlnitParameterNames() | 获取所有参数名称的枚举 |
| String | getServletName() | 获取Servlet的名称 |
| ServletContext | getServletContext() | 获取ServletContext对象 |
package servlet;import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;/*ServletConfig的演示*/
public class ServletConfigDemo extends HttpServlet {//声明ServletConfig配置对象private ServletConfig config;//通过init方法来为ServletConfig配置对象赋值@Overridepublic void init(ServletConfig config) throws ServletException {this.config = config;}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//演示ServletConfig常用方法//根据key获取valueString encodingValue = config.getInitParameter("encoding");System.out.println(encodingValue);//获取所有的keyEnumeration<String> keys = config.getInitParameterNames();while (keys.hasMoreElements()){//获取每一个keyString key = keys.nextElement();//根据key获取valueString value = config.getInitParameter(key);System.out.println(key + "," + value);}//获取Servlet的名称String servletName = config.getServletName();System.out.println(servletName);//获取ServletContext对象ServletContext context = config.getServletContext();System.out.println(context);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
访问:http://localhost:8080/demo2/servletConfigDemo
10.ServletContext
1.ServletContext概述
ServletContext 是应用上下文对象(应用域对象)。每一个应用中只有一个 ServletContext 对象
作用:可以配置和获得应用的全局初始化参数,可以实现 Servlet 之间的数据共享
生命周期:应用一加载则创建,应用被停止则销毁。
出生——活着——死亡
出生: 应用一加载,该对象就被创建出来了。一个应用只有一个实例对象。(Servlet和ServletContext都是单例的)
活着:只要应用一直提供服务,该对象就一直存在。
死亡:应用被卸载(或者服务器挂了),该对象消亡。
域对象
域对象指的是对象有作用域。也就是有作用范围域对象可以实现数据的共享不同作用范围的域对象,共享数据的能力也不一样
在 Servlet 规范中,一共有 4 个域对象ServletContext 就是其中的一个它也是 web 应用中最大的作用域,也叫 application 域它可以实现整个应用之间的数据共享
2.ServletContext的配置方式
ServletContext 并不属于某个 Servlet 的配置,而是针对于整个应用的配置,也叫全局的初始化参数
在<web-app>标签中,通过<context-param>标签来配置。有两个子标签
<param-name>:代表全局初始化参数的 key
<param-value>:代表全局初始化参数的 value
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ServletContextDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
web.xml
<!--配置Servlet--><servlet><servlet-name>servletContextDemo</servlet-name><servlet-class>servlet.ServletContextDemo</servlet-class></servlet><servlet-mapping><servlet-name>servletContextDemo</servlet-name><url-pattern>/servletContextDemo</url-pattern></servlet-mapping><!--配置ServletContext--><context-param><param-name>globalEncoding</param-name><param-value>UTF-8</param-value></context-param><context-param><param-name>globalDesc</param-name><param-value>This is ServletContext</param-value></context-param>
3.ServletContext的常用方法
| 返回值 | 方法名 | 说明 |
|---|---|---|
| String | getInitParameter(String name) | 根据名称获取全局配置的参数 |
| String | getContextPath() | 获取当前应用的虚拟访问目录 |
| String | getRealPath(string path) | 根据虚拟目录获取应用部署的磁盘绝对路径 |
| void | setAttribute(String name,Object value) | 向应用域对象中存储数据 |
| Object | getAttribute(String name) | 通过名称获取应用域对象中的数据 |
| void | removeAttribute(String name) | 通过名称移除应用域对象中的数据 |
package servlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ServletContextDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取ServletContext对象ServletContext context = getServletContext();//常用方法演示//获取全局配置参数:getInitParameter(String key) 根据key获取valueString value = context.getInitParameter("globalDesc");System.out.println(value);//获取应用的虚拟目录:getContextPath()String contextPath =context.getContextPath();System.out.println(contextPath);//根据虚拟目录获取绝对路径:getRealPath(String path)String realPath = context.getRealPath("/");System.out.println(realPath);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
访问:http://localhost:8080/demo2/servletContextDemo

11.注解开发 Servlet
1.自动注解开发
1.创建一个web项目
2.定义一个类,继承HttpServlet
3.重写doGet和doPost方法
4.在类上使用@WebServlet注解配置Servlet
5.部署并启动项目
6.通过浏览器测试
package Servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*基于注解方式开发@WebServlet("Servlet路径")*/
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletDemo01执行了...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
2.注解详解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {//指定Servlet的名称。等效于web.xml文件<servlet>标签下的<servlet-name>String name() default "";//用于映射Servlet。等效于<url-pattern>String[] value() default {};String[] urlPatterns() default {};//指定Servlet的加载时机。等效于<load-on-startup>int loadOnStartup() default -1;//指定Servlet的初始化参数。等效于<init-param>WebInitParam[] initParams() default {};//指定Servlet是否支持异步boolean asyncSupported() default false;//指定Servlet的小图标String smallIcon() default "";//指定Servlet的大图标String largeIcon() default "";//指定Servlet的描述信息String description() default "";//指定Servlet的显示名称String displayName() default "";
}
相关文章:
JavaWeb---Servlet
1.Srvlet概述 Servlet是运行在java服务器端的程序,用于接收和响应来着客户端基于HTTP协议的请求 如果想实现Servlet的功能,可以通过实现javax。servlet。Servlet接口或者继承它的实现类 核心方法:service()…...
英语——方法篇——单词——谐音法+拼音法——50个单词记忆
theatre,剧场,太后th吃eat热re食物,就去剧场了 loud dolphin,做do脸皮厚plh在。。。里 humid,hu湖mi米d的 blender,b爸lend借给er儿。 tragedy,tr土人...
35道Rust面试题
这套Rust面试题包括了填空题、判断题、连线题和编码题等题型。 选择题 1 ,下面哪个是打印变量language的正确方法? A,println("{}", language); B,println(language); C,println!("{}", langu…...
01 时钟配置初始化,debug
1. 开启debug series,否则只能下载一次,再次下载要配置boot 2.f0外部时钟配置 h750 配置 实测可用...
Halcon我的基础教程(一)(我的菜鸟教程笔记)-halcon仿射变换(Affine Transformation)的探究与学习
目录 什么是仿射变换?仿射变换有哪些方式?任何仿射变换都能由以下基本变换构造而来:在Halocn中,仿射变换具有重要的作用,那我们本文章重点讨论仿射变换基础性知识。 使用Halcon中的重要算子,仿射变换一般解决步骤,案例应用会在以后的文章中我们重点解答与讨论。 我们首先…...
c++视觉---中值滤波处理
中值滤波(Median Filter)是一种常用的非线性平滑滤波方法,用于去除图像中的噪声。它不像线性滤波(如均值滤波或高斯滤波)那样使用权重来计算平均值或加权平均值,而是选择滤波窗口内的像素值中的中间值作为输…...
Edge使用猴油脚本实战(实验室安全考试系统刷在线时长——网站永久自动刷新)
介绍 篡改猴 (Tampermonkey) 是拥有 超过 1000 万用户 的最流行的浏览器扩展之一。它允许用户自定义并增强您最喜爱的网页的功能。用户脚本是小型 JavaScript 程序,可用于向网页添加新功能或修改现有功能。使用 篡改猴,您可以轻松在任何网站上创建、管理…...
Vue 中 KeepAlive 内置缓存使用
KeepAlive 介绍及使用场景 KeepAlive 是 vue 中的内置组件,当多个组件动态切换时可以对实例状态进行缓存,用法如下 <router-view v-slot"{ Component }"><keep-alive><component :is"Component" /></keep-al…...
语言模型编码中/英文句子格式详解
文章目录 前言一、Bert的vocab.txt内容查看二、BERT模型转换方法(vocab.txt)三、vocab内容与模型转换对比四、中文编码总结 前言 最近一直在学习多模态大模型相关内容,特别是图像CV与语言LLM模型融合方法,如llama-1.5、blip、meta-transformer、glm等大…...
【Node.js】路由
基础使用 写法一: // server.js const http require(http); const fs require(fs); const route require(./route) http.createServer(function (req, res) {const myURL new URL(req.url, http://127.0.0.1)route(res, myURL.pathname)res.end() }).listen…...
matlab 2ask 4ask 信号调制
1 matlab 2ask close all clear all clcL =1000;Rb=2822400;%码元速率 Fs =Rb*8; Fc=Rb*30;%载波频率 Ld =L*Fs/Rb;%产生载波信号 t =0:1/Fs:L/Rb;carrier&...
Python利用jieba分词提取字符串中的省市区(字符串无规则)
目录 背景库(jieba)代码拓展结尾 背景 今天的需求就是在一串字符串中提取包含,省、市、区,该字符串不是一个正常的地址;,如下字符串 "安徽省、浙江省、江苏省、上海市,冷运标快首重1kg价格xx元,1.01kg(含)-5kg(不含)续重价…...
MuLogin防关联浏览器帮您一键实现Facebook账号多开
导言: 在当今数字化时代,社交媒体应用程序的普及程度越来越高。Facebook作为全球最大的社交媒体平台之一,拥有数十亿的用户。然而,对于一些用户来说,只拥有一个Facebook账号可能无法满足他们的需求。有时,…...
【C语言】每日一题(半月斩)——day4
目录 选择题 1、设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( ) 2、运行以下程序后,如果从键盘上输入 65 14<回车> ,则输出结果为( &…...
Are you sure you want to continue connecting (yes/no) 每次ssh进
Lunix scp等命令不需要输入yes确认方法_scp不需要确认-CSDN博客 方法一:连接时加入StrictHostKeyCheckingno ssh -o StrictHostKeyCheckingno root192.168.1.100 方法二:修改/etc/ssh/ssh_config配置文件,添加: StrictHostKeyC…...
网络与信息系统安全设计规范
1、总则 1.1、目的 为规范XXXXX单位信息系统安全设计过程,确保整个信息安全管理体系在信息安全设计阶段符合国家相关标准和要求,特制订本规范。 1.2、范围 本规范适用于XXXXX单位在信息安全设计阶段的要求和规范管理。 1.3、职责 网络安全与信息化…...
在Linux怎么用vim实现把一个文件里面的文本复制到另一个文件里面
2023年10月9日,周一下午 我昨天遇到了这个问题,但在网上没找到图文并茂的博客,于是我自己摸索出解决办法后,决定写一篇图文并茂的博客。 情景 假设现在我要用vim把file_transfer.cpp的内容复制到file_transfer.hpp里面 第一步 …...
CCAK—云审计知识证书学习
目录 一、CCAK云审计知识证书概述 二、云治理概述 三、云信任 四、构建云合规计划 <...
3.springcloudalibaba gateway项目搭建
文章目录 前言一、搭建gateway项目1.1 pom配置1.2 新增配置如下 二、新增server服务2.1 pom配置2.2新增测试接口如下 三、测试验证3.1 分别启动两个服务,查看nacos是否注册成功3.2 测试 总结 前言 前面已经完成了springcloudalibaba项目搭建,接下来搭建…...
Debezium日常分享系列之:Debezium 2.3.0.Final发布
Debezium日常分享系列之:Debezium 2.3.0.Final发布 一、重大改变二、PostgreSQL / MySQL 安全连接更改三、JDBC 存储编码更改四、新功能和改进五、Kubernetes 的 Debezium Server Operator六、新的通知子系统七、新的可扩展信号子系统八、JMX 信号和通知集成九、新的…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
