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

[Spring] SpringMVC 简介(一)

目录

一、SpringMVC 简介

1、什么是 MVC

2、什么是 SpringMVC

3、SpringMVC 实现原理

4、SpringMVC 的特点

二、简单案例

1、引入依赖

2、在 web.xml 中配置前端控制器 DispatcherServlet

3、创建 SpringMVC 的配置文件

 4、创建请求控制器

5、测试页面

6、访问不到 Controller

7、修改项目结构

三、@RequestMapping

1、@RequestMapping 注解的功能

2、@RequestMapping 注解的位置

3、@RequestMapping 的 value 属性

4、@RequestMapping 的 method 属性

5、SpringMVC 支持 ant 风格的路径

6、@RequestMapping 中的占位符(@PathVariable 重点)

四、SpringMVC 获取请求参数

1、通过 ServletAPI 获取

2、通过设置方法形参名与请求参数名一致

3、通过 POJO 获取请求参数

4、解决中文乱码


一、SpringMVC 简介

1、什么是 MVC

记住一句话:SpringMVC 封装了 Servlet

(1)MVC

M:Model,模型层,指工程中的JavaBean,作用是处理数据

JavaBean分为两类:

  • 一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
  • 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。

V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据

C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器

(2)工作流程

用户通过视图层发送请求到服务器,在服务器中请求被 Controller 接收,Controller 调用相应的 Model 层处理请求,处理完毕将结果返回到 Controller,Controller 再根据请求处理的结果找到相应的 View 视图,渲染数据后最终响应给浏览器。

2、什么是 SpringMVC

(1)三层架构

我们通过浏览器访问前端页面,前端页面通过异步提交的方式,发送请求到后端服务器,后端服务器采用 web层(servlet)、业务层(service)、数据层(dao)的三层架构形式进行开发,其中数据的交互使用 json 来传输。

  • 我们最开始在数据层使用的是 Jdbc 技术,而 MyBatis 就是对 Jdbc 技术的又一层封装,也可以称之为数据层框架。
  • 现在所讲的 SpringMVC,在 web 层中与 servlet 的关系,就好比 Jdbc 与 MyBatis 的关系,也就是一个表现层的框架。

(2)SpringMVC 是一种基于 Java 实现 MVC 模型的轻量级 Web 框架

  • 框架:半成品软件,加速开发过程。
  • 相比较 Servlet,使用更简单,开发更便捷,更灵活

3、SpringMVC 实现原理

(1)用户发送请求到前端控制器 DispatcherServlet

  • DispatcherServlet的作用:接收请求,调用其它组件处理请求,响应结果,相当于转发器、中央处理器,是整个流程控制的中心

(2)DispatcherServlet 收到请求后调用处理器映射器 HandlerMapping

  • 处理器映射器 HandlerMapping 找到 Controller 的具体方法(可以根据 xml 配置或注解进行查找),并将该方法返回给 DispatcherServlet;

(3)DispatcherServlet 调用处理器适配器 HandlerAdapter

(3-1)HandlerAdapter 经过适配调用具体的 Controller 的方法;(Controller--> service --> Dao --> 数据库)

  • Controller 执行完成后返回 ModelAndView;
  • Model:模型数据,即 Controller 处理的结果,是一个 Map
  • View:逻辑视图名,即 负责展示结果的 html 页面的名字

(3-2)HandlerAdapter 将 Controller 执行的结果 ModelAndView 返回给 DispatcherServlet

(4)DispatcherServlet 将执行的结果 ModelAndView 传给视图解析器 ViewReslover

  • 视图解析器 ViewReslover 根据逻辑视图 View 解析后返回具体 html 页面

(5)DispatcherServlet 根据 Model 对 View 进行渲染(将模型数据填充至视图中)

  • DispatcherServlet 将填充了数据的网页响应给用户

4、SpringMVC 的特点

  • Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
  • 基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理(不在需要自己编写 Servlet 处理请求)
  • 代码清新简洁,大幅度提升开发效率
  • 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
  • 性能卓著,尤其适合现代大型、超大型互联网项目要求

二、简单案例

1、引入依赖

即将使用 Thymeleaf 视图模板技术,因此引入了相关依赖。

<dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.1</version></dependency><!-- Spring5和Thymeleaf整合包 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version></dependency>
</dependencies>

2、在 web.xml 中配置前端控制器 DispatcherServlet

<servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

(1)标签中使用 / 和 /* 的区别

  • /:匹配浏览器向服务器发送的所有请求,不包括 jsp;
  • /*:匹配浏览器向服务器发送的所有请求,包括 jsp;

JSP 是通过 Tomcat 的 JspServlet 来处理的,然后 JspServlet 将响应结果回传给页面,所以 DispatcherServlet 处理不了 jsp 页面。

  • 因此 DispatcherServlet 要使用 /,而不能用 /*。
  • 在使用过滤器时,若需要对所有请求进行过滤,就需要使用 /* 的写法。

3、创建 SpringMVC 的配置文件

(1)SpringMVC 的配置文件的默认地址和名称:

  • 地址:在 WEB-INF 目录下;
  • 名称:<servlet-name>-servlet.xml;(<servlet-name> 是 web.xml 内 DispatcherServlet 的值,比如 DispatcherServlet-servlet.xml)

实际开发中,通常将 SpringMVC 的配置文件放在 resource 目录下

(2)Thymeleaf 模板文件路径

  • 物理视图:视图前缀 + 逻辑视图 + 视图后缀;
  • 逻辑视图:把物理视图中的视图前缀和视图后缀去掉,得到的就是逻辑视图;

我们通常在 WEB-INF 目录下建立一个 templates 目录,用来存放视图模板。而访问 WEB-INF 目录下的资源,需要服务器端进行请求转发,所以逻辑视图就被用上了。 

(3)配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 配置Thymeleaf视图解析器 --><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/> <!-- 优先级 --><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"> <!-- 模板引擎 --><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"> <!-- 模板解析器 --><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!-- 视图前缀 --><property name="prefix" value="/WEB-INF/templates/"/><!-- 视图后缀 --><property name="suffix" value=".html"/><!-- 以 html5 作为模板 --><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean></beans>

 4、创建请求控制器

(1)@Controller

由于 DispatcherServlet 已经对浏览器发送的请求进行了统一的处理,所以我们不需要自己创建 Servlet 去处理请求。

但是具体的请求有不同的处理过程,因此需要创建处理具体请求的类,即请求控制器

package com.demo.controller;import org.springframework.stereotype.Controller;@Controller
public class HelloController {}

SpringMVC 的控制器由一个 POJO(普通的Java类)担任,因此需要通过 @Controller 注解将其标识为一个控制层组件,交给 Spring 的 IOC 容器管理,此时 SpringMVC 才能够识别控制器的存在。

(2)@RequestMapping

请求映射:把浏览器发送的请求,映射到具体方法去处理。

(2-1)其中的 value 属性值,填写的是方法的路径:

  • /:代表该路径为绝对路径;
  • / 由服务器解析:代表 http://ip:port/工程名;
  • / 由浏览器解析:代表当前服务器路径,http://ip:port;

当 value 的值,与浏览器发送的请求路径是一样的,说明这个方法就是用来处理该请求的方法。

(2-2)方法返回值

前面我们说到,服务器端进行请求转发需要用到逻辑视图,那么怎么用呢?

其实我们返回的字符串,就是所谓的逻辑视图。紧接着 web.xml 中配置的视图解析器,就会将这个返回值用视图前缀和视图后缀组装起来,最终形成了请求转发的地址。

package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {@RequestMapping("/")public String index() {System.out.println("index");// 返回逻辑视图return "index";}@RequestMapping("/hello")public String hello() {return "hello";}}

5、测试页面

注意:测试页面使用了 Thymeleaf 的语法。

(1)index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1> index 页面 </h1><a th:href="@{/hello}"> 测试 SpringMVC </a><br/><a href="/hello"> 测试绝对路径</a>
</body>
</html>

(2)hello.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1> hello </h1>
</body>
</html>

(3)项目结构

6、访问不到 Controller

SpringMVC 访问不到 Controller,网上有很多解决方法,如果再尝试之后都没有办法解决(比如我),那么可以尝试删除当前工件,新建一个该项目的工件。

有关更多项目结构问题,可以查看:https://www.bilibili.com/video/BV1Ry4y1574R?p=15 

按照其中的步骤,设置 web 目录即可。

7、修改项目结构

将 DispatcherServlet-servlet.xml 文件,放到 resource 目录下,然后在 web.xml 文件中作如下修改:

<servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:SpringMVC.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

(1)contextConfigLocation

这是正常项目中 Spring 配置文件放置在 resource 目录下的写法。

(2)<load-on-startup>

由于 DispatcherServlet 需要初始化的内容非常地多,因此将其放在服务器启动期间去初始化,可以节省页面访问的时间。

三、@RequestMapping

1、@RequestMapping 注解的功能

  • @RequestMapping 注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。
  • SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。

2、@RequestMapping 注解的位置

  • @RequestMapping 仅仅标识了方法,那么可以直接访问到这个方法;
  • @RequestMapping 标识了类,那么想要访问方法,请求路径就必须添加标识类上面写的路径;

如下面代码所示:

@Controller
@RequestMapping("/manager")
public class ManagerController {@RequestMapping("/user")public String user() {return "user";}
}

请求路径为:

http://ip:port/工程路径/manager/user
  • 而如果在两个不同的 Controller 里面有相同的 @RequestMapping,那么会直接报错。
  • 但是对于同一个资源,只要请求路径不同,那么就不会报错,比如:/manager/hello 和 /hello,都可以访问到 hello.html。

3、@RequestMapping 的 value 属性

一个 Servlet 可以处理多个请求(在 url-pattern 中设置),同样的,value 属性值为数组的时候,就可以接收多个请求。

@Controller
@RequestMapping("/manager")
public class ManagerController {@RequestMapping({"/hello", "/also_hello"})public String hello() {return "hello";}
}

4、@RequestMapping 的 method 属性

  • method 属性通过请求的请求方式(get 或 post)匹配请求映射。
  • method 属性是一个 RequestMethod 类型的数组,表示该请求映射能够匹配多种请求方式的请求。

若当前请求的请求地址满足请求映射的 value 属性,但是请求方式不满足 method 属性,则浏览器报错 405。

@RequestMapping(value = {"/hello"},method = {RequestMethod.GET, RequestMethod.POST}
)
public String hello() {return "hello";
}

(1)对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解

  • 处理get请求的映射–>@GetMapping
  • 处理post请求的映射–>@PostMapping
  • 处理put请求的映射–>@PutMapping
  • 处理delete请求的映射–>@DeleteMapping

(2)常用的请求方式有get,post,put,delete

  • 但是目前浏览器只支持 get 和 post,若在 form 表单提交时,为 method 设置了其他请求方式的字符串(put 或 delete),则按照默认的请求方式 get 处理
  • 若要发送 put 和 delete 请求,则需要通过 spring 提供的过滤器 HiddenHttpMethodFilter,在 RESTful 部分会讲到

5、SpringMVC 支持 ant 风格的路径

ant 风格的路径是指:

  • ?:表示任意的单个字符
  • *:表示任意的0个或多个字符
  • **:表示任意的一层或多层目录

在 @RequestMapping 中,value 属性值可以包含上面三种格式。

@RequestMapping("/a?a/test/ant")
public String testAnt() {return "hello";
}
@RequestMapping("/a?a/*/ant")
public String testAnt2() {return "hello";
}
@RequestMapping("**ant")
public String testAnt3() {return "hello";
}

以上代码,下面三种请求路径都能访问到 hello.html: 

6、@RequestMapping 中的占位符(@PathVariable 重点)

@RequestMapping 修饰的方法想要使用请求参数的方法有很多,其中一种就是在 @RequestMapping 的 value 属性中使用“占位符{ }”。

(1)书写格式

假设请求路径 /func 可以访问到目标方法,通常我们添加参数,请求路径会这么写:

/func?id=1&name=admin

而如果使用 @RequestMapping,那么应该这么写:

/func/1/admin

(2)对应地,在代码中要怎么获取到这两个参数呢?

@RequestMapping("/func/{id}/{name}")
public String func(@PathVariable("id") String id, @PathVariable("name") String name) {System.out.println("id: " + id);System.out.println("name: " + name);return "index";
}

(3)请求路径:

(4)输出结果:

四、SpringMVC 获取请求参数

1、通过 ServletAPI 获取

如果要使用 servlet 相关的方法,那么给方法的参数列表添加 request 等参数即可。

(1)测试代码

(1-1)controller(success.html 可以自己写)

@RequestMapping("/login")
public String login(HttpServletRequest req) {System.out.println("username: " + req.getParameter("username"));System.out.println("password: " + req.getParameter("password"));return "success"; // return 相当于请求转发
}

(1-2)index.html

<form th:action="@{/login}" method="post"><input type="text" name="username"/> <br/><input type="password" name="password"/> <br/><input type="submit" value="submit"/>
</form>

 (2)输出结果

2、通过设置方法形参名与请求参数名一致

在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参。

(1)测试代码

(1-1)controller

@RequestMapping("/login/param")
public String loginParam(String username, String password) {System.out.println("username: " + username);System.out.println("password: " + password);return "success";
}

(1-2)index.html(改了 action)

<form th:action="@{/login/param}" method="post"><input type="text" name="username"/> <br/><input type="password" name="password"/> <br/><input type="submit" value="submit"/>
</form>

(2)输出结果

 (3)@RequestParam

  • 如果在请求参数名方法参数名不一致,那么就会导致方法获取不到值,值为 null。

为了保证一定能获取到对应值,可以使用 @RequestParam:

public String loginParam(@RequestParam(value = "username", required = true) String username, String password)
  • value = "userName":设置从 userName 请求参数获取值,并且方法参数名不再需要与请求参数名一致
  • required = true:设置没有该请求参数,则不能发送请求;(默认就是 true)
  • required = false:设置可以不传该请求参数,若不传递,则值为 null
  • defaultValue:设置未传递参数时的默认值;(与 required 无关)

(4)@RequestHeader

  • 将请求头信息与控制器方法的参数进行绑定,当为方法参数加上 @RequestHeader,那么该参数就不再对应请求参数,而是对应请求头信息。

用法与 @RequestParam 一致。

@RequestMapping("/login/param")
public String loginParam(@RequestParam(value = "username") String name,String password,@RequestHeader(value = "referer") String refer) {System.out.println("username: " + name);System.out.println("password: " + password);System.out.println("referer: " + refer);return "success";
}

(5)@CookieValue

  • 将 cookie 数据与控制器方法的参数进行绑定,因为一开始还没有 JSESSIONID 的 cookie,因此需要先调用一次 request.getSession() 来创建 JSESSIONID 的 cookie。

用法与 @RequestParam 一致。

@RequestMapping("/login")
public String login(HttpServletRequest req) {HttpSession session = req.getSession();System.out.println("创建 JSESSIONID: " + session.getId());return "index"; // return 相当于请求转发
}@RequestMapping("/login/param")
public String loginParam(@RequestParam(value = "username") String name,String password,@RequestHeader(value = "referer") String refer,@CookieValue(value = "JSESSIONID") String sessionId) {System.out.println("username: " + name);System.out.println("password: " + password);System.out.println("referer: " + refer);System.out.println("JSESSIONID: " + sessionId);return "success";
}

(5-1)先访问 /login,使服务器创建 JSESSIONID

(5-2)输入 username、password,点击登录,观察控制台输出

3、通过 POJO 获取请求参数

通常情况下,我们会有非常多的方法参数需要设置/获取请求参数值,如果都用 @RequestParam 这几个注解来获取,也非常麻烦。

(1)解决方法

  • 我们可以用一个 pojo 类当作方法的参数,让这个 pojo 类的成员变量名,与请求参数名一致,就可以将请求参数值,封装到 pojo 类的成员变量。
@RequestMapping("/login/pojo")
public String pojo(User user) {System.out.println(user);return "success";
}

(2) 输出结果

4、解决中文乱码

因为没有 request 和 response,所以无法用这两个变量设置。

并且就算使用 request 和 response,其实也无法设置,因为其他参数都是已经从请求中获取到了,再设置也没有用了。

注意:

  • Tomcat 7.0 的 get 和 post 请求都有乱码;Tomcat 8.0 以上 get 请求没有乱码,post 请求会乱码。

(1)解决方法

解决获取请求参数的乱码问题,可以使用 SpringMVC 提供的编码过滤器 CharacterEncodingFilter,再所有 servlet 处理之前,拦截所有请求,然后设置编码。

需要注意的是,CharacterEncodingFilter 必须在 web.xml 中进行注册:

  • init-param 设置 encoding = utf-8,相当于 request.CharacterSetEncoding("UTF-8");
  • init-param 设置 forceEncoding = true,会把 request 和 response 都设置成 encoding(前面那个);

(2)web.xml 配置文件

<!--配置springMVC的编码过滤器-->
<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

(3)输出结果

相关文章:

[Spring] SpringMVC 简介(一)

目录 一、SpringMVC 简介 1、什么是 MVC 2、什么是 SpringMVC 3、SpringMVC 实现原理 4、SpringMVC 的特点 二、简单案例 1、引入依赖 2、在 web.xml 中配置前端控制器 DispatcherServlet 3、创建 SpringMVC 的配置文件 4、创建请求控制器 5、测试页面 6、访问不到 …...

机器学习基础之《回归与聚类算法(2)—欠拟合与过拟合》

一、背景 1、上一篇说正规方程的时候&#xff0c;实际情况中使用很少&#xff0c;主要原因它不能解决过拟合。 2、训练集上表现的好&#xff0c;测试集上表现不好—过拟合 二、欠拟合和过拟合 1、欠拟合 训练集&#xff1a;有3个训练集&#xff0c;告诉机器都是天鹅 机器学…...

flutter dio 请求封装(空安全)

一、添加依赖 dio: ^5.3.2二、请求封装 class HttpHelper {static Dio? mDio;static BaseOptions? options;static HttpHelper? httpHelper;CancelToken cancelToken CancelToken();static const String GET get;static const String POST post;static const String PU…...

chatgpt GPT-4V是如何实现语音对话的

直接上代码 https://chat.openai.com/voice/get_token 1. 请求内容 Request:GET /voice/get_token HTTP/1.1 Host: ios.chat.openai.com Content-Type: application/json Cookie: _puiduser***Fc9T:16962276****Nph%2Fb**SU%3D; _uasid"Z0FBQUF***nPT0"; __cf_bmBUg…...

C++项目-求水仙花数

求水仙花数 #include <iostream> using namespace std;int main() {int n 100;do {int a 0;int b 0;int c 0;a n % 10; //个位b n / 10 % 10; //十位c n / 100 % 10; //百位if (a * a * a b * b * b c * c * c n) {cout << n << endl;}…...

从零开始基于LLM构建智能问答系统的方案

本文首发于博客 LLM应用开发实践 一个完整的基于 LLM 的端到端问答系统&#xff0c;应该包括用户输入检验、问题分流、模型响应、回答质量评估、Prompt 迭代、回归测试&#xff0c;随着规模增大&#xff0c;围绕 Prompt 的版本管理、自动化测试和安全防护也是重要的话题&#x…...

Android---Synchronized 和 ReentrantLock

Synchronized 基本使用 1. 修饰实例方法 public class SynchronizedMethods{private int sum 0;public synchronized void calculate(){sum sum 1;} } 这种情况下的锁对象是当前实例对象&#xff0c;因此只有同一个实例对象调用此方法才会产生互斥效果&#xff1b;不同的…...

【解题报告】牛客挑战赛70 maimai

题目链接 这个挑战赛的 F F F是我出的&#xff0c;最后 zhoukangyang 爆标了。。。orzorz 记所有有颜色的边的属性集合 S S S 。 首先在外层容斥&#xff0c;枚举 S ∈ [ 0 , 2 w ) S\in [0,2^w) S∈[0,2w)&#xff0c;计算被覆盖的的边中不包含 S S S 中属性&#xff0c…...

算启新程 智享未来 | 紫光展锐携手中国移动共创数智未来

10月11日-13日&#xff0c;2023年中国移动全球合作伙伴大会在广州举行&#xff0c;此次大会以“算启新程 智享未来”为主题&#xff0c;与合作伙伴一起共商融合创新&#xff0c;共创数智未来。作为中国移动每年规模最大、最具影响力的盛会&#xff0c;吸引了数百家世界500强企业…...

thinkphp5.1 获取缓存cache(‘cache_name‘)特别慢,php 7.0 unserialize 特别慢

thinkphp5.1 获取缓存cache(‘cache_name’)特别慢&#xff0c;php 7.0 unserialize 特别慢 场景&#xff1a; 项目中大量使用了缓存&#xff0c;本地运行非常快&#xff0c;二三百毫秒&#xff0c;部署到服务器后 一个表格请求就七八秒&#xff0c;最初猜想是数据库查询慢&am…...

【Linux】UNIX 术语中,换页与交换的区别和Linux 术语中,换页与交换的区别?

UNIX换页和交换的区别 在UNIX中&#xff0c;换页&#xff08;Paging&#xff09;是一种内存管理技术&#xff0c;用于在程序运行时动态地将其代码和数据从磁盘加载到内存中。当程序需要访问的页面不在内存中时&#xff0c;就会发生页错误&#xff08;page error&#xff09;&a…...

零基础学python之集合

文章目录 集合1、创建集合2、集合常见操作方法2、1 增加数据2、2 删除数据2、3 查找数据 3、总结 集合 目标 创建集合集合数据的特点集合的常见操作 1、创建集合 创建集合使用{}或set()&#xff0c; 但是如果要创建空集合只能使用set()&#xff0c;因为{}用来创建空字典。 …...

PromptScript:轻量级 DSL 脚本,加速多样化的 LLM 测试与验证

TL&#xff1b;DR 版本 PromptScript 是一个轻量级的 Prompt 调试用的 DSL &#xff08;Yaml&#xff09;脚本&#xff0c;以用于快速使用、构建 Prompt。 PromptScript 文档&#xff1a;https://framework.unitmesh.cc/prompt-script Why PromptScript &#xff1f; 几个月前&…...

强化学习(Reinforcement Learning)与策略梯度(Policy Gradient)

写在前面&#xff1a;本篇博文的内容来自李宏毅机器学习课程与自己的理解&#xff0c;同时还参考了一些其他博客(懒得放链接)。博文的内容主要用于自己学习与记录。 1 强化学习的基本框架 强化学习(Reinforcement Learning, RL)主要由智能体(Agent/Actor)、环境(Environment)、…...

JUC之ForkJoin并行处理框架

ForkJoin并行处理框架 Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理&#xff0c;最后将子任务结果合并成最后的计算结果&#xff0c;并进行输出。 类似于mapreduce 其实&#xff0c;在Java 8中引入的并行流计算&#xff0c;内部就是采用的ForkJoinPool来实现…...

【牛客面试必刷TOP101】Day8.BM33 二叉树的镜像和BM36 判断是不是平衡二叉树

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…...

CSS padding(填充)

CSS padding&#xff08;填充&#xff09;是一个简写属性&#xff0c;定义元素边框与元素内容之间的空间&#xff0c;即上下左右的内边距。 padding&#xff08;填充&#xff09; 当元素的 padding&#xff08;填充&#xff09;内边距被清除时&#xff0c;所释放的区域将会受到…...

C语言达到什么水平才能从事单片机工作

C语言达到什么水平才能从事单片机工作 从事单片机工作需要具备一定的C语言编程水平。以下是几个关键要点&#xff1a;基本C语言知识&#xff1a; 掌握C语言的基本语法、数据类型、运算符、流控制语句和函数等基本概念。最近很多小伙伴找我&#xff0c;说想要一些C语言学习资料&…...

Java架构师理解SAAS和多租户

目录 1 云服务的三种模式1.1 IaaS(基础设施即服务)1.2 PaaS(平台即服务)1.3 SaaS(软件即服务)1.4 区别与联系2 SaaS的概述2.1 Saas详解2.2 应用领域与行业前景2.3 Saas与传统软件对比3 多租户SaaS平台的数据库方案3.1 多租户是什么3.2 需求分析3.3 多租户的数据库方案分析…...

关于Java线程池相关面试题

【更多面试资料请加微信号&#xff1a;suns45】 https://flowus.cn/share/f6cd2cbe-627a-435f-a6e5-1395333f92e8 【FlowUs 息流】&#x1f4e3;suns-Java资料 访问密码&#xff1a;【请加微信号&#xff1a;suns45】 ————线程相关的面试题———— 0&#xff1a;创建线…...

ExcelBDD Python指南

在Python里面支持BDD Excel BDD Tool Specification By ExcelBDD Method This tool is to get BDD test data from an excel file, its requirement specification is below The Essential of this approach is obtaining multiple sets of test data, so when combined with…...

基于深度学习的驾驶员疲劳监测系统的设计与实现

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88421622?spm1001.2014.3001.5503 基于深度学习的驾驶员疲劳监测系统的设计与实现 1 绪论 在21世纪&#xff0c;各国的经济飞速发展&#xff0c;人民越来越富裕&#xff0c;道路上的汽车也逐…...

B树、B+树详解

B树 前言   首先&#xff0c;为什么要总结B树、B树的知识呢&#xff1f;最近在学习数据库索引调优相关知识&#xff0c;数据库系统普遍采用B-/Tree作为索引结构&#xff08;例如mysql的InnoDB引擎使用的B树&#xff09;&#xff0c;理解不透彻B树&#xff0c;则无法理解数据…...

使用hugging face开源库accelerate进行多GPU(单机多卡)训练卡死问题

目录 问题描述及配置网上资料查找1.tqdm问题2.dataloader问题3.model(input)写法问题4.环境变量问题 我的卡死问题解决方法 问题描述及配置 在使用hugging face开源库accelerate进行多GPU训练&#xff08;单机多卡&#xff09;的时候&#xff0c;经常出现如下报错 [E Process…...

IDEA 修改插件安装位置

不说假话&#xff0c;一定要看到最后&#xff0c;不然你以为我为什么要自己总结&#xff01;&#xff01;&#xff01; IDEA 修改插件安装位置 前言步骤 前言 IDEA 默认的配置文件均安装在C盘&#xff0c;使用时间长会生成很多文件&#xff0c;这些文件会占用挤兑C盘空间&…...

牛客网SQL160

国庆期间每类视频点赞量和转发量_牛客题霸_牛客网 select * from ( select tag,dt, sum(单日点赞量)over(partition by tag order by dt rows between 6 preceding and 0 following), max(单日转发量)over(partition by tag order by dt rows between 6 preceding and 0 follo…...

HDFS Java API 操作

文章目录 HDFS Java API操作零、启动hadoop一、HDFS常见类接口与方法1、hdfs 常见类与接口2、FileSystem 的常用方法 二、Java 创建Hadoop项目1、创建文件夹2、打开Java IDEA1) 新建项目2) 选择Maven 三、配置环境1、添加相关依赖2、创建日志属性文件 四、Java API操作1、在HDF…...

论文阅读之【Is GPT-4 a Good Data Analyst?(GPT-4是否是一位好的数据分析师)】

文章目录 论文阅读之【Is GPT-4 a Good Data Analyst?&#xff08;GPT-4是否是一位好的数据分析师&#xff09;】背景&#xff1a;数据分析师工作范围基于GPT-4的端到端数据分析框架将GPT-4作为数据分析师的框架的流程图 实验分析评估指标表1&#xff1a;GPT-4性能表现表2&…...

【数据结构】:二叉树与堆排序的实现

1.树概念及结构(了解) 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的有一个特殊的结点&#…...

纯css手写switch

CSS 手写switch 纯css手写switchcss变量 纯css手写switch 思路&#xff1a; switch需要的元素有&#xff1a;开关背景、开关按钮。点击按钮后&#xff0c;背景色变化&#xff0c;按钮颜色变化&#xff0c;呈现开关打开状态。 利用typecheckbox&#xff0c;来实现switch效果(修…...

PyTorch 深度学习之处理多维特征的输入Multiple Dimension Input(六)

1.Multiple Dimension Logistic Regression Model 1.1 Mini-Batch (N samples) 8D->1D 8D->2D 8D->6D 1.2 Neural Network 学习能力太好也不行&#xff08;学习到的是数据集中的噪声&#xff09;&#xff0c;最好的是要泛化能力&#xff0c;超参数尝试 Example, Arti…...

LeetCode【438】找到字符串中所有字母异位词

题目&#xff1a; 注意&#xff1a;下面代码勉强通过&#xff0c;每次都对窗口内字符排序。然后比较字符串。 代码&#xff1a; public List<Integer> findAnagrams(String s, String p) {int start 0, end p.length() - 1;List<Integer> result new ArrayL…...

关于LEFT JOIN的一次理解

先看一段例子&#xff1a; SELECTproduct_half_spu.id AS halfSpuId,product_half_spu.half_spu_code,product_half_spu.half_spu_name,COUNT( product_sku.id ) AS skuCount,product_half_spu.create_on,product_half_spu.create_by,product_half_spu.upload_pic_date,produc…...

各报文段格式集合

数据链路层-- MAC帧 前导码8B&#xff1a;数据链路层将封装好的MAC帧交付给物理层进行发送&#xff0c;物理层在发送MAC帧前&#xff0c;还要在前面添加8字节的前导码&#xff08;分为7字节的前同步码1字节的帧开始定界符&#xff09;MAC地址长度6B数据长度46&#xff5e;1500B…...

【算法-动态规划】最长公共子序列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

区块链游戏的开发流程

链游&#xff08;Blockchain Games&#xff09;的开发流程与传统游戏开发有许多相似之处&#xff0c;但它涉及到区块链技术的集成和智能合约的开发。以下是链游的一般开发流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…...

目标检测网络系列——YOLO V2

文章目录 YOLO9000better,更准batch Normalization高分辨率的训练使用anchor锚框尺寸的选择——聚类锚框集成改进——直接预测bounding box细粒度的特征图——passthrough layer多尺度训练数据集比对实验VOC 2007VOC 2012COCOFaster,更快网络模型——Darknet19训练方法Strong…...

15. Java反射和注解

Java —— 反射和注解 1. 反射2. 注解 1. 反射 动态语言&#xff1a;变量的类型和属性可以在运行时动态确定&#xff0c;而不需要在编译时指定 常见动态语言&#xff1a;Python&#xff0c;JavaScript&#xff0c;Ruby&#xff0c;PHP&#xff0c;Perl&#xff1b;常见静态语言…...

pdf处理工具 Enfocus PitStop Pro 2022 中文 for mac

Enfocus PitStop Pro 2022是一款专业的PDF预检和编辑软件&#xff0c;旨在帮助用户提高生产效率、确保印刷品质量并减少错误。以下是该软件的一些特色功能&#xff1a; PDF预检。PitStop Pro可以自动检测和修复常见的PDF文件问题&#xff0c;如缺失字体、图像分辨率低、颜色空…...

微信小程序入门开发教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…...

php函数

1. strstr() 返回a在b中的第一个位置 2.substr() 截取字符串 3.PHP字符串函数parse_str(将字符串解析成多个变量)-CSDN博客 4.explode() 字符串分割为数组 5.trim&#xff08;&#xff09; 1.去除字符串两边的 空白字符 2.去除指定字符 6.extract()函数从数组里…...

3.3 封装性

思维导图&#xff1a; 3.3.1 为什么要封装 ### 3.3.1 为什么要封装 **封装**&#xff0c;在Java的面向对象编程中&#xff0c;是一个核心的思想。它主要是为了保护对象的状态不被外部随意修改&#xff0c;确保数据的完整性和安全性。 #### **核心思想&#xff1a;** - 保护…...

Redis魔法:点燃分布式锁的奇妙实现

分布式锁是一种用于在分布式系统中控制对共享资源的访问的锁。它与传统的单机锁不同&#xff0c;因为它需要在多个节点之间协调以确保互斥访问。 本文将介绍什么是分布式锁&#xff0c;以及使用Redis实现分布式锁的几种方案。 一、前言 了解分布式锁之前&#xff0c;需要先了…...

iOS 项目避坑:多个分类中方法重复实现检测

#前言 在项目中,我们经常会使用分类 -> category。category在实际项目中一般有两个左右:1.给已有class增加方法,扩充起能力、2.将代码打散到多个文件中,避免因为一个类过于复杂而导致代码篇幅过长(应用于viewController中很好用) 但是 category 也有很多弊端~ **首…...

【003】EIS数据分析_#LIB

EIS数据分析 1. EIS测试及数据获取2. EIS数据分析2.1 EIS曲线划分 1. EIS测试及数据获取 点击查看往期介绍 2. EIS数据分析 2.1 EIS曲线划分 一般来说&#xff0c;实轴处的截获表示体电阻(Rb)&#xff0c;它反映了电解质&#xff0c;隔膜和电极的电导率。高频区的半圆对应于…...

Sprint framework Day07:注解结合 xml 配置

前言 Spring注解结合XML配置是指在Spring应用中&#xff0c;使用注解和XML配置的方式来进行Bean的定义、依赖注入和其他配置。这种方式可以充分利用Spring框架的注解和XML配置两种不同的配置方式的特点。 在Spring框架中&#xff0c;我们可以使用注解来定义Bean&#xff0c;如…...

LiveGBS流媒体平台GB/T28181功能-国标流媒体服务同时兼容内网收流外网收流多网段设备收流

LiveGBS流媒体平台GB/T28181功能-国标流媒体服务同时兼容内网收流外网收流多网段设备收流 1、背景2、设备接入播放2.1、查看通道2.2、直播播放 3、默认收流地址配置4、其它网络设备收流配置5、搭建GB28181视频直播平台 1、背景 服务器部署的时候&#xff0c;可能有多个网卡多个…...

js题解(四)

文章目录 批量改变对象的属性判断是否包含数字判断是否符合指定格式 批量改变对象的属性 给定一个构造函数 constructor&#xff0c;请完成 alterObjects 方法&#xff0c;将 constructor 的所有实例的 greeting 属性指向给定的 greeting 变量。 function alterObjects(const…...

如何进行大数运算和高精度计算?

大数运算和高精度计算是在计算机编程中常见的需求&#xff0c;尤其是当处理大整数、分数、复数、浮点数等需要更多位数的数据时。在C语言中&#xff0c;由于原生的数据类型有限&#xff0c;您需要使用自定义的数据结构和算法来执行大数运算和高精度计算。在本文中&#xff0c;我…...

身份证读卡器跟OCR有何区别?哪个好?

二代身份证读卡器&#xff08;以下简称读卡器&#xff09;和OCR&#xff08;光学字符识别&#xff09;是两种常见的身份证信息获取技术&#xff0c;它们在原理、功能和应用方面存在一些区别。下面将详细介绍二者的区别并探讨哪个更好。 1. 原理&#xff1a; - 读卡器&#xff…...