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的常用方法

返回值方法名说明
StringgetInitParameter(String name)根据参数名称获取参数的值
Enumeration<String>getlnitParameterNames()获取所有参数名称的枚举
String getServletName()获取Servlet的名称
ServletContextgetServletContext()获取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的常用方法

返回值方法名说明
StringgetInitParameter(String name)根据名称获取全局配置的参数
StringgetContextPath()获取当前应用的虚拟访问目录
StringgetRealPath(string path)根据虚拟目录获取应用部署的磁盘绝对路径
voidsetAttribute(String name,Object value)向应用域对象中存储数据
ObjectgetAttribute(String name)通过名称获取应用域对象中的数据
voidremoveAttribute(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 "";
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的祖…

《3D 数学基础》几何检测-相交性检测

目录 1. 2D直线相交 2. 3D射线相交点 3. 射线和平面的交点 4. 3个平面的交点 5. 射线和圆或者球交点 6. 两个圆或者球是否相交 7. 球和平面的相交性检测 8. 射线和AABB的相交性&#xff08;13.17&#xff09; 9. 射线和三角形的相交性&#xff08;13.16&#xff09; …

react–antd 实现TreeSelect树形选择组件,实现点开一层调一次接口

效果图: 注意: 当选择“否”&#xff0c;开始调接口&#xff0c;不要把点击调接口写在TreeSelect组件上&#xff0c;这样会导致问题出现&#xff0c;没有层级了 部分代码:

基于FPGA的视频接口之千兆网口(四配置)

简介 相信网络上对于FPGA驱动网口的开发板、博客、论坛数不胜数,为何博主需要重新手敲一遍呢,而不是做一个文抄君呢!因为目前博主感觉网络上描述的多为应用层上的开发,非从底层开始说明,本博主的思虑还是按照老规矩,按照硬件、底层、应用等关系,使用三~四篇文章,来详细…

android U广播详解(一)

概念介绍 进程队列 BroadcastQueueModernImpl 的设计围绕着为设备上的每个潜在进程维护一个单独的 BroadcastProcessQueue 实例。表明用于传送到特定进程的Pending {link BroadcastRecord} 条目队列。整个类都标记为 {code NotThreadSafe}&#xff0c;因为调用者有责任始终与…

Javascript笔记:Web页面中的事件处理

1 任务队列 2事件处理&#xff1a;⼀个只有宏任务的示例 3 Web⻚⾯中的事件处理 3.1 定时器与事件处理&#xff1a;一个实例 4 Web⻚⾯中的事件处理 5 事件在DOM中的传播 5.1 两个阶段

wins打开ftp服务,跳转到浏览器解决方式

问题: 在wins的资源管理器中输入 ftp://服务器ip的时候&#xff0c;会突然跳转到浏览器中 百度上的方法归纳汇总 解决方法: 百度上最多的方式&#xff0c;但是我电脑试了不行 启动 InternetExplorer 在 菜单栏 选择 工具 -> Internet 选项 -> 高级 -> 勾选 启用 …

平衡二叉树(AVL) 的认识与实现

文章目录 1 基本1.1 概念1.2 特点1.3 构建1.4 调整1.4.1 RR1.4.1.1 示例1.4.1.2 多棵树不平衡 1.4.2 LL1.4.2.1 示例 1.4.3 LR1.4.3.1 示例 1.4.4 RL1.4.4.1 示例 1.5 实现1.5.1 示例1.5.2 完善 1 基本 1.1 概念 平衡二叉树是一棵合理的二叉排序树 解释 对于这么一个序列 如…

【Ceph Block Device】块设备挂载使用

文章目录 前言创建pool创建user创建image列出image检索image信息调整image大小增加image大小减少image大小 删除image从pool中删除image从pool中“延迟删除”image从pool中移除“延迟删除的image” 恢复image恢复指定pool中延迟删除的image恢复并重命名image 映射块设备格式化i…

C++DAY44

#include <iostream>using namespace std;class Animal//封装 动物 基类 { private:string name; public:Animal() {}Animal(string n):name(n){}virtual void perform() //虚函数{cout << "欢迎来到动物园" << endl;} };class Lion:public Animal…

c/c++--字节对齐(byte alignment)

1. 默认字节对齐 在所有结构体成员的字节长度都没有超出操作系统基本字节单位(32位操作系统是4,64位操作系统是8)的情况下 按照结构体中字节最大的变量长度来对齐&#xff1b;若结构体中某个变量字节超出操作系统基本字节单位 那么就按照系统字节单位来对齐。 注意&#xff1…

视频监控系统/安防视频平台EasyCVR广场视频细节优化

安防视频监控系统/视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频汇聚平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;可实现视频监控直播、视频轮播、…

【Python 零基础入门 】安装 环境配置

【Python 零基础入门 】第一课 安装 & 环境配置 Python 零基础入门 第一课 安装 & 环境配置Python 的历史Python 的前景安装了解你的操作系统Python 安装环境配置 PyCharm 安装第一个程序 Python 零基础入门 第一课 安装 & 环境配置 在当今的技术时代, 编程语言正…

微信小程序/vue3/uview-plus form兜底校验

效果图 代码 <template><u-form :model"form" ref"formRole" :rules"rules"><u-form-item prop"nickname"><u-input v-model"form.nickname" placeholder"姓名" border"none" /&…

没用的知识增加了,尝试用文心实现褒义词贬义词快速分类

尝试用文心实现褒义词贬义词快速分类 一、我的需求二、项目环境搭建千帆SDK安装及使用流程 三、项目实现过程创建应用获取签名调用接口计算向量积总结 百度世界大会将于10月17日在北京首钢园举办&#xff0c;今天进入倒计时五天了。通过官方渠道的信息了解到&#xff0c;这次是…

Web后端开发登录校验及JWT令牌,过滤器,拦截器详解

如果用户名正确则成功进入 登录功能 代码 Controller Service Mapper 结果 若登录成功结果如下: 如果登录失败,结果如下 登录校验 为什么需要登录校验 有时再未登录情况下, 我们也可以直接访问部门管理, 员工管理等功能 因此我们需要一个登录校验操作, 只有确认用户登录…

【Debian】报错:su: Authentication failure

项目场景&#xff1a; 今天我重新刷了一个debian系统。 系统版本&#xff1a; # 查看系统版本 lsb_release -a 我的系统版本&#xff1a; No LSB modules are available. Distributor ID&#xff1a;Debian Description: Debian GNU/Linux 12 &#xff08;bookworm&#xff…

优雅而高效的JavaScript——箭头函数

&#x1f917;博主&#xff1a;小猫娃来啦 &#x1f917;文章核心&#xff1a;优雅而高效的JavaScript——箭头函数 文章目录 前言箭头函数的基本语法和特点箭头函数的语法箭头函数的词法绑定特性箭头函数的this值箭头函数无法使用arguments对象 箭头函数与传统函数的比较箭头函…

每年高考时间是几月几号 高考开始时间

高考是高中生最重要的一个阶段&#xff0c;甚至影响着很多学生的未来&#xff0c;相信大家都很关注高考的具体时间是什么时候&#xff0c;本次将详细给您介绍高考的具体开始时间以及结束时间。 每年高考的时间都是6月7日开始&#xff0c;一共持续三天时间左右&#xff0c;但是…

身份证号码,格式校验:@IdCard(自定义注解)

目标 自定义一个用于校验 身份证号码 格式的注解IdCard&#xff0c;能够和现有的 Validation 兼容&#xff0c;使用方式和其他校验注解保持一致&#xff08;使用 Valid 注解接口参数&#xff09;。 校验逻辑 有效格式 符合国家标准。 公民身份号码按照GB11643&#xff0d;…