Java Web(八)--Servlet(二)

Servlet API 

Servlet API 包含以下4个Java包:

1. javax.servlet:其中包含定义Servlet和Servlet容器之间契约的类和接口。

2. javax.servlet.http:主要定义了与HTTP协议相关的HttpServlet类,HttpServletRequest接口和HttpServletResponse接口。

3. javax.servlet.annotation: 其中包含标注Servlet、Filter、Listener的标注。它还为被标注元件定义元数据。

4. javax.servlet.descriptor:其中包含提供程序化登录Web应用程序的配置信息的类型。


Servlet其他接口

ServletConfig接口

ServletConfig  类是为 Servlet 程序的配置信息的类;

    一个 Web 应用中可以存在多个 ServletConfig 对象,一个 Servlet 只能对应一个 ServletConfig 对象。即 Servlet 的初始化参数仅对当前 Servlet 有效。

注:Servlet  程序和 ServletConfig  对象都是由 Tomcat  负责创建。

返回值类型方法功能描述
StringgetInitParameter(String name)根据初始化参数名 name,返回对应的初始化参数值。
Enumeration<String>getInitParameterNames()

返回 Servlet 所有的初始化参数名的枚举集合;

如果该 Servlet 没有初始化参数,则返回一个空的集合。

ServletContextgetServletContext()返回一个代表当前 Web 应用的 ServletContext 对象。
StringgetServletName()返回 Servlet 的名字,即 web.xml 中 <servlet-name> 元素的值。

作用:

【1】获取初始化参数 init-param;

  //1. 直接从带参的 init() 方法中提取public class ServletConfigDemo extends HttpServlet {private ServletConfig servletConfig;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取Servlet得名字this.servletConfig.getServletName();}@Overridepublic void init(ServletConfig config) throws ServletException {//从带参init方法中,提取ServletConfig对象this.servletConfig = config;}}

【2】配置Servlet初始化参数的方式;

  在 web.xml 中可以使用一个或多个 <init-param> 元素为 Servlet 配置初始化参数:

  •  <init-param> 元素是 <servlet> 的子元素, 需要在 <servlet> 元素内使用,表示只对当前 Servlet 有效 。
  • <param-name> 子元素表示参数的名称。
  • <param-value> 子元素表示参数的值
web.xml参数配置:<servlet>
<--初始化参数--><init-param><!--参数名-->            <param-name>username</param-name><!--参数值--><param-value>root</param-value></init-param><init-param><!--参数名-->            <param-name>password</param-name><!--参数值--><param-value>123456</param-value></init-param>
</servlet>

 使用 @WebServlet 配置初始化参数:

@WebServlet(urlPatterns = {"/MyServlet"}, initParams = {@WebInitParam(name = "name", value = "编程"),        @WebInitParam(name = "URL", value = "www.biancheng.net")})

【3】获取  ServletContext 对象;

import javax.servlet.ServletConfig;
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 DBServlet extends HttpServlet {/*** ServletConfig config 使用流程* 1. 当DBServlet对象初始化时, tomcat会同时创建一个 ServletConfig对象* 2. 这时如果DBServlet init() 方法中你调用 super.init(config),则调用父类 GenericServlet* GenericServlet源码:* public void init(ServletConfig config) throws ServletException {* this.config = config;* this.init();* }* 这时就会把 Tomcat创建的 ServletConfig对象赋给 GenericServlet的属性 config* 3.如果你想在其它方法通过 getServletConfig() 方法获取ServletConfig,则一定要记住 调用  super.init(config);*/@Overridepublic void init(ServletConfig config) throws ServletException {// ConcurrentHashMap, 是一个线程安全的容器.System.out.println("init" + config);super.init(config);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 在DBServlet 执行 doGet()/doPost() 时,可以获取到web.xml配置的用户名和密码/*** 1. getServletConfig() 方法是 GenericServlet* 2. 返回的 servletConfig对象是 GenericServlet private transient ServletConfig config;* 3. 当一个属性被 transient 修饰,表示该属性不会被串行化(有些重要信息,不希望保存到文件)*/ServletConfig servletConfig = getServletConfig();System.out.println("doPost=" + servletConfig);String username = servletConfig.getInitParameter("username");String pwd = servletConfig.getInitParameter("pwd");System.out.println("初始化参数username= " + username);System.out.println("初始化参数pwd= " + pwd);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

 ServletContext对象

        当 Tomcat 启动时,Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象;

        它与Servlet是一对多的关系,其内部封装的信息可以被同一web 应用内的所有Servlet共享,不同 Servlet 之间可以通过 ServletContext 对象实现数据通讯;因此 ServletContext 对象也被称为 Context 域对象。

        它代表当前的 Web 应用,该对象封装了当前 Web 应用的所有信息。可以利用该对象获取整个Web 应用程序的初始化信息、读取资源文件等。

        ServletContext 对象  是在  web  工程启动的时候创建,在  web 工程停止的时销毁;

 创建方式:

  • 可以通过 ServletConfig.getServletContext 方法获得对 ServletContext对象的引用
  • 可以通过 this.getServletContext()来获得其对象的引用。

作用:

【1】获取 web.xml 中配置的上下文参数

//通过 web.xml 中的 <context-param> 元素可以为 Web 应用设置一些全局的初始化参数,这些参数被称为上下文初始化参数。//与 Servlet 的初始化参数不同,应用中的所有 Servlet 都共享同一个上下文初始化参数。在 Web 应用的整个生命周期中,上下文初始化参数会一直存在,并且可以随时被任意一个 Servlet 访问<?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/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0" metadata-complete="false"><!--设置全局初始化参数 --><context-param><param-name>name</param-name><param-value>编程帮</param-value></context-param><context-param><param-name>url</param-name><param-value>www.biancheng.net</param-value></context-param></web-app>对以上标签说明如下:<context-param> 元素用来声明上下文初始化参数,必须在根元素 <web-app> 内使用。<param-name> 子元素表示参数名,参数名在整个 Web 应用中必须是唯一的。<param-value> 子元素表示参数值。

【2】实现 Servlet 之间的数据通讯        

ServletContext 的属性与上下文初始化参数都是存放在 ServletContext 对象。

不同点ServletContext 的属性上下文初始化参数
创建方式ServletContext 的属性通过调用 ServletContext 接口的 setAttribute() 方法创建上下文初始化参数通过 web.xml 使用 <context-param> 元素配置
可进行的操作ServletContext 的属性可以通过 ServletContext 接口的方法进行读取、新增、修改、移除等操作上下文初始化参数在容器启动后只能被读取,不能进行新增、修改和移除操作
生命周期ServletContext 中属性的生命周期从创建开始,到该属性被移除(remove)或者容器关闭结束上下文初始化参数的生命周期,从容器启动开始,到 Web 应用被卸载或容器关闭结束
作用使用 ServletContext 中的属性可以实现 Servlet 之间的数据通讯使用上下文初始化参数无法实现数据通讯

【3】读取 Web 应用下的资源文件

返回值类型方法方法描述
SetgetResourcePaths(String path)返回一个 Set 集合,该集合中包含资源目录中的子目录和文件的名称。
String getRealPath(String path) 返回资源文件的真实路径(文件的绝对路径)。
URL getResource(String path)返回映射到资源文件的 URL 对象。
InputStreamgetResourceAsStream(String path)返回映射到资源文件的 InputStream 输入流对象。

Request和Response

Servlet 处理 HTTP 请求的流程:

  1. Tomcat(Servlet容器)接收到来自客户端的 HTTP 请求后,容器会针对该请求分别创建一个 HttpServletRequest 对象和 HttpServletReponse 对象。
  2. 容器将 HttpServletRequest 对象和 HttpServletReponse 对象以参数的形式传入 service() 方法内,并调用该方法。
  3. 在 service() 方法中 Servlet 通过 HttpServletRequest 对象获取客户端信息以及请求的相关信息。
  4. 对 HTTP 请求进行处理。
  5. 请求处理完成后,将响应信息封装到 HttpServletReponse 对象中。
  6. Servlet 容器将响应信息返回给客户端。
  7. 当 Servlet 容器将响应信息返回给客户端后,HttpServletRequest 对象和 HttpServletReponse 对象被销毁

request对象

HttpServletRequest 对象专门用于封装 HTTP 请求消息,简称 request 对象;【HTTP 请求消息分为请求行、请求消息头和请求消息体三部分】

 HttpServletRequest 接口中定义了获取请求行、请求头和请求消息体的相关方法。通过调用request,getHeaderf);request.geWrlf );request.getQueryString^()等等方法,都可以得到浏览器当初发送的请求信息。

说明:

【1】中文乱码问题:

请求数据的http中文乱码问题:

1)POST 请求乱码的原因:
POST 提交的数据在请求体中,其所使用的编码格式是页面一致(即 utf-8)。
request 对象接收到数据之后,会将数据放到 request 缓冲区,缓冲区的默认字符集是 ISO-8859-1(该字符集不支持中文),两者使用的字符集不一致导致乱码。

2)GET 请求乱码的原因:

Get 请求将请求数据附加到 URL 后面作为参数,浏览器发送文字时采用的编码格式与页面编码保持一致(utf-8)。如果 Tomcat 没有设置字符集,接收 URL 时默认使用 ISO-8859-1 进行解码,ISO-8859-1 不兼容中文,无法正确解码,导致出现乱码。但  Tomcat 8 中已解决了 get 方式提交请求中文乱码的问题。

POST请求乱码解决办法:

    //在获取请求参数之前设置 request 缓冲区字符集为 utf-8
    request.setCharacterEncoding("utf-8");
    // 获取用户名
    String username = request.getParameter("username");


response对象

每次 HTTP 请求,Tomcat 会创建一个 HttpServletResponse 对象传递给 Servlet 程序去使用;HttpServletResponse 接口中定义了向客户端发送响应状态码、响应头、响应体的方法;

在传给Servlet时,response 对象是一个空的对象,Servlet逻辑处理后得到结果,最终通过response.write方法,将结果写入response内部的缓冲区。

Tomcat会在Servlet处理结束后,拿到response,遍历里面的信息,组装成HTTP响应发送给客户端。 遍历里面的信息,组装成HTTP响应发给客户端,即针对页面发送的请求做出数据响应,向页面输出信息,包括文本、图片、视频等。


说明:

【1】中文乱码问题:

response 对象向页面输出中文时可能出现乱码:

1)字节流:原因中文转成字节数组时与浏览器打开时采用的字符集不一致。

response.setHeader("Content-Type", "text/html;charset=UTF-8");

// 获取字节输出流
OutputStream os = response.getOutputStream();
byte[] str = "编程帮".getBytes("UTF-8");

// 输出中文
os.write(str);

2)字符流:通过字符流输出的内容是存放在 response 缓冲区的,response 缓冲区的默认字符集是 ISO-8859-1,该字符集不支持中文。

解决1:

// 设置response缓冲区的编码,即设置服务器字符集为UTF-8
response.setCharacterEncoding("UTF-8");

// 设置浏览器打开文件所采用的编码;即通过响应头,设置浏览器使用UTF-8字符集
response.setHeader("Content-Type", "text/html;charset=UTF-8");

// 输出中文
response.getWriter().write("编程");

解决2:

//setContentType会设置服务端和客户端都使用UTF-8字符集,还设置了响应头;

//setContentType要在获取流对象(getWriter)之前调用才有效

response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("编程"); 


三大组件

JavaWeb的三大组件包括Servlet 程序、 Listener 监听器、 Filter 过滤器。

Listener 监听器

介绍

监听器 Listener 是一个实现特定接口的 Java 程序,用来监听某种变化, 从而触发对应方法完成相应的任务;一般就是对象创建/销毁, 属性变化。采用观察者模式。

Servlet 规范中定义了 8 个监听器接口 :

  •     目前最常用的是  ServletContextListener;
  •     可以用于监听 ServletContext、HttpSession 和 ServletRequest 对象的生命周期和属性变化事件;

注册Servlet监听器的方式:

  •     在 web.xml 中注册监听器;
  •     使用 @WebListener 注册监听器:在监听器类上使用 @WebListener 注解,可以将该 Java 类注册为一个监听器类。

监听器的使用:

  •     定义监听器,根据需求实现对应接口;
  •     在web.xml中注册监听器,让监听器工作。

分类

【1】监听对象创建和销毁的监听器

1)ServletContextListener 监听器(接口):

    作用:监听 ServletContext 创建或销毁,即生命周期监听。当我们Web 应用启动时,就会创建 ServletContext。

    应用场景: (1)加载初始化的配置文件;比如 spring 的配置文件 ;(2)任务调度(配合定时器 Timer/TimerTask)。

    相关方法

  •         void contextInitialized(ServletContextEvent sce):创建 Servletcontext 时触发;
  •         void contextDestroyed(ServletContextEvent sce) :销毁 Servletcontext 时。
//创建Listen
package com.lhyedu.listen;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("ServletContext 创建,完成 WEB 项目初始化的工作..");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("ServletContext 销毁,完成资源回收的工作");}
}web.xml配置;<listener>        
<listener-class>com.lhyedu.listen.MyServletContextListener</listener-class></listener>

2)HttpSessionListener 监听器

  •     作用:监听 Session 创建或销毁,即生命周期监听

    相关方法

  •         void sessionCreated(HttpSessionEvent se):创建session时调用
  •         void sessionDestroyed(HttpSessionEvent se): 销毁session时调用;使用方法和前面一样, 可以用于监控用户上线,离线

    应用场景:        可以用于监控用户上线,离线

1、定义监听器,根据需求实现对应接口,重写接口的方法//统计网站在线人数监听器:一个用户对应一个session,则统计session的数量即可统计在线人数
public class OnlineCountListener implements HttpSessionListener {@Override//创建session的监听:一旦创建session,就会触发一次这个事件public void sessionCreated(HttpSessionEvent httpSessionEvent) {ServletContext context = httpSessionEvent.getSession().getServletContext();Integer onlineCount = (Integer) context.getAttribute("OnlineCount");System.out.println(httpSessionEvent.getSession().getId());if (onlineCount == null) {onlineCount = new Integer(1);} else {int count = onlineCount.intValue();onlineCount = new Integer(count + 1);}context.setAttribute("OnlineCount", onlineCount);}@Override//销毁session的监听:一旦销毁session就会触发一次这个事件public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {ServletContext context = httpSessionEvent.getSession().getServletContext();Integer onlineCount = (Integer) context.getAttribute("OnlineCount");if (onlineCount == null) {onlineCount = new Integer(0);} else {int count = onlineCount.intValue();onlineCount = new Integer(count - 1);}context.setAttribute("OnlineCount", onlineCount);}
}2、注册监听器:
<!--注册监听器-->
<listener>    <listener-class>com.yue.listener.OnlineCountListener</listener-class>
</listener>3、在前端页面显示在线人数:<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body><h1>当前有<span style="color: brown"><%=application.getAttribute("OnlineCount")%></span>在线</h1></body>
</html>

3)ServletRequestListener 监听器

    作用:监听 Request 创建或销毁,即 Request 生命周期监听

    相关方法

  •         void requestInitialized(ServletRequestEvent sre):创建 request 时
  •         void requestDestroyed(ServletRequestEvent sre):销毁 request 时, 可以用来监控,  某个 IP 访问我们网站的频率,  日志记录 ,访问资源的情况.

    应用场景:用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况.


【2】监听对象中属性变更的监听器
事件源监听器监听器描述方法调用时机
ServletContextServletContextAttributeListener用于监听 ServletContext 对象的属性新增、移除和替换public void attributeAdded (ServletContextAttributeEvent scae) 当 ServletContext 对象中新增一个属性时
public void attributeRemoved (ServletContextAttributeEvent scae) 当删除 ServletContext 对象中的一个属性时
public void attributeReplaced (ServletContextAttributeEvent scae) 当 ServletContext 对象中的某个属性被替换时
HttpSessionHttpSessionAttributeListener用于监听 HttpSession 对象的属性新增、移除和替换public void attributeAdded  (HttpSessionBindingEvent  hsbe) 当 HttpSession 对象中新增一个属性时
public void attributeRemoved (HttpSessionBindingEvent  hsbe)当删除 HttpSession 对象中的一个属性时
public void attributeReplaced (HttpSessionBindingEvent  hsbe) 当 HttpSession 对象中的某个属性被替换时
HttpServletRequestServletRequestAttributeListener用于监听 HttpServletRequest 对象的属性新增、移除和替换public void attributeAdded (ServletRequestAttributeEvent srae)当 HttpServletRequest 对象中新增一个属性时
public void attributeRemoved (ServletRequestAttributeEvent srae)当删除 HttpServletRequest 对象中的一个属性时
public void attributeReplaced (ServletRequestAttributeEvent srae)当 HttpServletRequest 对象中的某个属性被替换时

【3】监听 HttpSession 中的对象状态改变的监听器

Session 中的对象的多种状态: 绑定到 Session 中、从 Session 中解除绑定、随 Session 对象持久化到存储设备中(钝化)、随 Session 对象从存储设备中恢复(活化)。

事件源监听器监听器描述方法调用时机
HttpSession

HttpSessionBindingListener

【感知监听器】

用于监听 JavaBean 对象绑定到 HttpSession 对象和从 HttpSession 对象解绑的事件void  valueBound (HttpSessionBindingEvent event)当对象被绑定(添加)到 HttpSession 对象中时
void  valueUnbound (HttpSessionBindingEvent event)当对象从 HttpSession 对象中解除绑定(移除)时

HttpSessionActivationListener

【感知监听器】

用于监听 HttpSession 中对象活化和钝化的过程void sessionWillPassivate (HttpSessionBindingEvent event)当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前
void  sessionDidActive (HttpSessionBindingEvent event)当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后

Filter 过滤器

介绍

Filter  过滤器是  JavaEE 的规范,是接口,采用责任链模式。

作用:拦截请求,过滤响应。它可以对服务器管理的所有 Web 资源(例如 JSP、Servlet、静态 HTML 文件、静态图片等)进行拦截,从而实现一些特殊的功能。

应用场景

  •     用户的权限控制、过滤敏感词、设置统一编码格式等
  •     例如日志操作、事务管理等

工作流程

  1. 客户端请求访问容器内的 Web 资源;
  2. Servlet 容器接收请求,并针对本次请求分别创建一个 request 对象和 response 对象;
  3. 请求到达 Web 资源之前,先调用 Filter 的 doFilter() 方法,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作;
  4. 在 Filter 的 doFilter() 方法内,调用 FilterChain.doFilter() 方法,将请求传递给下一个过滤器或目标资源;
  5. 目标资源生成响应信息返回客户端之前,处理控制权会再次回到 Filter 的 doFilter() 方法,执行 FilterChain.doFilter() 后的语句,检查 response 对象,修改响应头和响应正文;
  6. 响应信息返回客户端。

接口

Filter接口

    开发过滤器要实现 javax.servlet.Filter 接口,并提供一个公开的不带参的构造方法。

返回值类型方法功能描述
voidinit (FilterConfig filterConfig)该方法用于初始化过滤器。
voiddoFilter(ServletRequest request,SeivletResponse response, FilterChain chain)该方法完成实际的过滤操作,当客户端请求的 URL 与过滤器映射的 URL 匹配时,容器会先调用该方法对请求进行拦截。
参数 request 和 response 表示请求和响应对象。
参数 chain 代表当前 Filter 链对象,在该方法内部,调用 chain.doFilter() 方法,才能把请求交付给 Filter 链中的下一个 Filter 或者 Web 资源。
voiddestroy()该方法在销毁 Filter 对象之前被调用,用于释放被 Filter 对象占用的资源。 
FilterConfig 接口

    FilterConfig 是 Filter 过滤器的配置类。

  • 用于在过滤器初始化期间向其传递信息;通过 filterConfig 对象就可以获得 Filter 的初始化参数。
  •  由容器实现,容器将它作为参数传入过滤器的 init() 方法。        

    Tomcat 每次创建 Filter 的时候,也会创建一个 FilterConfig 对象,这里包含了 Filter 配置文件的配置信息。        

返回值类型方法描述
StringgetInitParameter(String name)根据初始化参数名 name,返回对应的初始化参数值。
EnumerationgetInitParameterNames()返回过滤器的所有初始化参数名的枚举集合。
ServletContextgetServletContext()返回 Servlet 上下文对象的引用。
StringgetFilterName() 返回过滤器的名称。

生命周期

【1】初始化阶段

  •     Servlet 容器负责加载和实例化 Filter

容器启动时,读取 web.xml 或 @WebFilter 的配置信息对所有的过滤器进行加载和实例化。

加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Filter 实例;

在 Filter 的生命周期内, init() 方法只执行一次;

【2】拦截和过滤阶段,最重要的阶段

  •     当客户端请求的 URL 与过滤器映射匹配时,容器将该请求的 request 对象、response 对象以及 FilterChain 对象以参数的形式传递给 Filter 的 doFilter() 方法,并调用该方法对请求/响应进行拦截和过滤

【3】销毁阶段

  •     Filter 对象创建后会驻留在内存中,直到容器关闭或应用被移除时销毁
  •     销毁 Filter 对象之前,容器会先调用 destory() 方法,释放过滤器占用的资源
  •     在 Filter 的生命周期内,destory() 只执行一次。

FilterChain(过滤器链)

在处理某些复杂业务时,一个过滤器不够,可以设计多个过滤器共同完成过滤任务,形成过滤器链
javax.servlet 包中提供了一个 FilterChain 接口,该接口由容器实现。

执行顺序:Http 请求 -> A 过滤器 dofilter()-> A 过滤器前置代码 -> A 过滤器 chain.doFilter() -> B 过滤器dofilter() ->  B 过滤器前置代码 -> B 过滤器 chain.doFilter() -> 目标文件 -> B 过滤器后置代码 -> A 过滤器后置代码 ->返回给浏览器页面/数据。

多个 filter 和目标资源在一次 http 请求,在同一个线程中
当一个请求 url 和 filter 的 url-pattern 匹配时, 才会被执行;

  • 如果有多个匹配上,就会顺序执行,形成一个 filter 调用链。
  • 底层可以使用一个数据结构搞定

多个 filter 共同执行时,因为是一次 http 请求,  使用同一个 request 对象;
多个 filter 执行顺序,和 web.xml  配置顺序保持一致;

  •     执行顺序由 <filter-mapping> 标签的配置顺序决定
  •     通过 @WebFilter 注解配置的 Filter 过滤器,无法进行排序

chain.doFilter(req, resp)方法 将执行下一个过滤器的doFilter 方法,如果后面没有过滤器,则执行目标资源。

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

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

相关文章

Flask入门一(介绍、Flask安装、Flask运行方式及使用、虚拟环境、调试模式、配置文件、路由系统)

文章目录 一、Flask介绍二、Flask创建和运行1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装介绍watchdog使用python--dotenv使用&#xff08;操作环境变量&#xff09; 七、虚拟环境介绍Mac/linux创建虚拟环境…

CANoe学习笔记--MeasurementSetup的配置和使用

CANoe提供了一种非常特殊的数据分析模式&#xff0c;即基于数据流方向的测量和分析。MeasurementSetup也是基于图形化的设置模式&#xff0c;能够让工程人员一目了然。 如何理解“基于数据流方向的图形化配置”看下图 数据是像流水一样&#xff0c;定向的向左移动&#xff0c;…

SSP-RCP情景下全球1-km分辨率土地利用预测数据集(2020-2100)【耕地、林地、草地、城乡、工矿、居民用地、未利用地、水体】

作者基于ESA-CCI历史土地利用数据&#xff0c;使用GCAM模型估算了未来土地利用面积需求&#xff1b;然后采用一种改进的元胞自动机模型PLUS对需求进行高空间分辨率降尺度迭代模拟&#xff0c;得到SSP-RCP情景下全球1-km分辨率土地利用预测数据集&#xff08;2020-2100&#xff…

Ubuntu18.04 系统上配置并运行SuperGluePretrainedNetwork(仅使用CPU)

SuperGlue是Magic Leap在CVPR 2020上展示的研究项目&#xff0c;它是一个图神经网络&#xff08;Graph Neural Network&#xff09;和最优匹配层&#xff08;Optimal Matching layer&#xff09;的结合&#xff0c;训练用于对两组稀疏图像特征进行匹配。这个项目提供了PyTorch代…

【pytorch】函数记录

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 torch.sum()torch.argmax()torch.nn.Parametertorch.unbindtorch.optim.Adam()[^adam]torch.cattorch.unsqueeze()torch.normalize()[^l2]torch.eyetorch.mmto…

自主web服务器实现

目录 项目背景网络协议栈协议分层数据封装与分用 HTTP协议介绍HTTP协议简介认识URLURI、URL、URNHTTP的五大特点HTTP协议格式HTTP的请求方法HTTP的状态码HTTP常见的Header CGI机制介绍CGI机制概念CGI模式实现步骤CGI机制的流程 日志文件编写套接字相关代码编写HTTP服务器的主体…

Kotlin:协程基础

点击查看&#xff1a;协程基础 中文文档 点击查看&#xff1a;协程基础 英文文档 第一个协程程序 import kotlinx.coroutines.*fun main(){GlobalScope.launch {delay(1000L)//delay 是一个特殊的 挂起函数 &#xff0c;它不会造成线程阻塞&#xff0c;但是会 挂起 协程&…

react-JSX基本使用

1.目标 能够知道什么是JSX 能够使用JSX创建React元素 能够在JSX中使用JS表达式 能够使用JSX的条件渲染和列表渲染 能够给JSX添加样式 2.目录 JSX的基本使用 JSX中使用JS表达式 JSX的条件渲染 JSX的列表渲染 JSX的样式处理 3.JSX的基本使用 3.1 createElement()的问题 A. …

代码随想录算法训练营day24

题目&#xff1a;77. 组合 参考链接&#xff1a;代码随想录 回溯法理论基础 回溯三部曲&#xff1a;回溯函数模板返回值以及参数、回溯函数终止条件、回溯搜索的遍历过程。 模板框架&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&…

【算法与数据结构】复杂度深度解析(超详解)

文章目录 &#x1f4dd;算法效率&#x1f320; 算法的复杂度&#x1f320; 时间复杂度的概念&#x1f309;大O的渐进表示法。 &#x1f320;常见复杂度&#x1f320;常见时间复杂度计算举例&#x1f309;常数阶O(1)&#x1f309;对数阶 O(logN)&#x1f309;线性阶 O(N)&#x…

选择排序的简单介绍

选择排序是一种简单直观的排序算法&#xff0c;其原理如下&#xff1a; 1. 遍历数组&#xff0c;找到最小&#xff08;或最大&#xff09;的元素&#xff0c;并将其与数组的第一个元素交换位置。 2. 接着在剩下的元素中找到最小&#xff08;或最大&#xff09;的元素&#xff…

图论-算法题

797. 所有可能的路径 题目: 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i …

Openstack云计算架构及前期服务搭建

openstack介绍 Openstack是一个开源的云计算管理平台项目&#xff0c;由几个主要的组件组合起来完成具体工作&#xff0c;支持几乎所有的云环境&#xff0c;项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台 ----百度百科 Openstack是一个云操作系统&a…

wechat-bot-wechat4u微信机器人

欢迎使用&#x1f44f;&#x1f3fb;wechat-bot-wechat4u &#x1f306; 简介 wechat-bot-wechat4u&#xff0c;基于wechat4u进行开发&#xff0c;接收微信账号消息并提供自动回复、记录存储、消息推送、消息转发等功能&#xff0c;可通过自定义实现各种功能&#xff0c;诸如…

Acwing数学与简单DP(二)

摘花生 原题链接&#xff1a;https://www.acwing.com/problem/content/1017/ 最后一步&#xff0c;有两种可能&#xff1a; 从上面走从下面走 也就是max(dp[i-1][j],dp[i][j-1])&#xff0c;再加上最后一个位置的值。 #include"bits/stdc.h"using namespace std;i…

Rocky Linux 运维工具 ls

一、ls 的简介 ​​ls​ 用于列出当前目录下的文件和目录&#xff0c;以及它们的属性信息。通过 ​ls​命令可以查看文件名、文件大小、创建时间等信息&#xff0c;并方便用户浏览和管理文件。 二、ls 的参数说明 序号参数描述1-a显示所有文件&#xff0c;包括以 ​.​开头的…

golang学习7,glang的web的restful接口结构体传参

接口&#xff1a; //POST请求 返回json 接口传参json r.POST("/postJson", controller.PostUserInfo) 1.定义结构体 //定义结构体 type Search struct {Id intName string }2.结构体传参 //结构体传参 func PostUserInfo(c *gin.Context) {search : &Searc…

pytorch安装GPU版本 (Cuda12.1)教程

使用本教程前&#xff0c;默认您已经安装并配置好了python3以上版本 1. 去官网下载匹配的Cuda Cuda下载地址 当前最高版本的Cuda是12.1 我安装的就是这个版本 小提示&#xff1a;自定义安装可以只选择安装Cuda Runtime。Nvidia全家桶不必全部安装。把全家桶全部安装完直接系统…

VPX基于全国产飞腾FT-2000+/64核+复旦微FPGA的计算刀片

6U VPX计算板 产品简介 产品特点 飞腾计算平台&#xff0c;国产化率100% VPX-MPU6902是一款基于飞腾FT-2000/64核的计算刀片&#xff0c;主频2.2GHz&#xff0c;负责业务数据流的管控和调度。搭配自带独立显示芯片的飞腾X100芯片&#xff0c;可用于于各类终端及服务器类应用场…

【毕业设计推荐】基于MATLAB的水果分级系统设计与实现

一、课题介绍 现在商业行为中&#xff0c;在水果出厂前都需要进行质量检测&#xff0c;需要将不同等级的水果进行分级包装&#xff0c;以保证商业利益最大化。可是传统方法都是依靠人工进行检测&#xff0c;效率低下&#xff0c;主观成分大&#xff0c;并不能很好客观地评价出货…