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

SpringMVC组件

目录

1、简介

2、SpringMVC与Servlet的关系

3、struc2

4、RESTful 编程风格

5、工作流程

6、代码示例

6.1、导入坐标

provide

6.2、DispathcerServlet

🔺配置web.xml

初始化

优先级

6.3、Controller类及视图页面

6.4、配置注解

6.5、spring-mvc.xml

6.6、客户端发请求

7、🔺组件解析

7.1、执行流程

7.2、解析

8、🔺注解解析

8.1、@RequestMapping

8.2、xml

8.3、知识要点


 ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:JavaEE、Spring

1、简介

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于

SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。

SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优

秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时

它还支持 RESTful 编程风格的请求。

Spring MVC 是 Spring 框架中用于构建 Web 应用程序的模块。它是一个基于 MVC(Model-View-Controller)设计模式的轻量级框架,旨在简化 Web 应用程序的开发,并提供灵活性和可扩展性。

下面是 Spring MVC 的主要特点和组件:

  1. MVC 设计模式:Spring MVC 遵循经典的 MVC 设计模式,将应用程序分为模型(Model)、视图(View)和控制器(Controller)。这种分层架构使代码更加清晰和易于维护。
  2. 前端控制器:Spring MVC 使用前端控制器(DispatcherServlet)作为入口点,负责接收所有的客户端请求并将其分发给合适的处理器(Controller)进行处理。
  3. HandlerMapping:HandlerMapping 用于将 URL 映射到相应的处理器(Controller)。Spring MVC 提供了多种 HandlerMapping 实现,如 BeanNameUrlHandlerMapping、RequestMappingHandlerMapping 等。
  4. Controller:Controller 是处理客户端请求的组件,它负责处理请求并生成相应的响应数据。Controller 可以是普通的 Java 类,使用 @Controller 注解标记。
  5. HandlerAdapter:HandlerAdapter 用于调用处理器(Controller)来处理客户端请求,并将处理结果封装成 ModelAndView 或 ResponseEntity 返回给前端控制器。
  6. ViewResolver:ViewResolver 用于将逻辑视图名解析为具体的视图对象。Spring MVC 支持多种视图技术,如 JSP、Thymeleaf、Freemarker 等。
  7. View:View 是用于渲染数据并生成响应的组件。它可以是 JSP、HTML 模板或其他模板引擎。
  8. 数据绑定:Spring MVC 支持数据绑定,可以将客户端请求的参数绑定到方法参数、JavaBean 或命令对象中。
  9. 拦截器:拦截器(Interceptor)用于在请求处理的不同阶段插入自定义的处理逻辑。它可以用于执行权限检查、日志记录等操作。
  10. 异常处理:Spring MVC 提供了全局异常处理机制,可以通过 @ControllerAdvice 注解来统一处理应用程序中的异常。
  11. 国际化支持:Spring MVC 提供了国际化和本地化支持,可以轻松实现多语言应用程序。
  12. RESTful Web Services:Spring MVC 提供了对 RESTful Web 服务的支持,通过 @RestController 注解可以创建 REST 风格的控制器。

使用 Spring MVC,开发人员可以快速构建灵活、可维护和可扩展的 Web 应用程序。

它与其他 Spring 模块(如 Spring Boot)集成良好,为开发现代 Web 应用提供了强大的基础。

2、SpringMVC与Servlet的关系

Spring MVC 是基于 Servlet 技术的框架,它实际上是在 Servlet 的基础上进行了封装和扩展,以简化 Web 应用程序的开发。下面是 Spring MVC 和 Servlet 的关系和区别:

关系

  1. Spring MVC 是 Spring 框架的一部分,它是 Spring 提供的用于构建 Web 应用程序的模块。
  2. Servlet 是 Java EE 规范的一部分,它定义了用于处理客户端请求和生成响应的标准 API。

区别

  1. 抽象层次:Servlet 是 Java EE 规范的一部分,提供了底层的 Web 编程接口,开发者需要直接使用 Servlet 接口来处理请求和响应。而 Spring MVC 是在 Servlet API 的基础上进行了高级封装,提供了更方便的编程模型和更强大的功能,使得开发者可以更快速地构建 Web 应用。
  2. 设计思想:Servlet 的设计思想是基于前端控制器模式,其中 Servlet 容器(如 Tomcat)负责接收所有的请求并将其分发给相应的 Servlet 进行处理。而 Spring MVC 的设计思想是基于 MVC 模式,它将应用程序分为模型(Model)、视图(View)和控制器(Controller),从而使代码结构更加清晰和易于维护。
  3. 功能和特性:Spring MVC 提供了许多额外的功能和特性,如拦截器、数据绑定、国际化支持、异常处理、RESTful Web Services 等,这些功能在原生的 Servlet 中是没有的。
  4. 依赖关系:使用原生的 Servlet,开发者需要手动配置和管理 Servlet 和 URL 的映射关系,而使用 Spring MVC,开发者可以通过注解和配置来实现自动的 URL 映射和请求处理。

综上所述,Spring MVC 是对 Servlet 的封装和扩展,它提供了更高级的编程模型和更丰富的功能,使得 Web 应用程序的开发更加简便和高效。使用 Spring MVC 可以更好地实现松耦合、可维护和可扩展的 Web 应用。

3、struc2

Struts2 是一个基于 Java 的开源 Web 应用程序框架,用于构建 Web 应用程序。它是 Struts 框架的后续版本,但在设计和功能上有很大的改进。Struts2 使用了经典的 MVC 设计模式,将应用程序分为模型(Model)、视图(View)和控制器(Controller),以提高代码的可维护性和可扩展性。

主要特点:

  • 提供了强大的拦截器机制,可以在请求处理过程中插入自定义逻辑,如登录验证、权限控制等。
  • 支持数据绑定和验证,能够方便地处理表单数据的提交和校验。
  • 支持国际化和本地化,方便构建多语言应用。
  • 内置标签库和表达式语言,简化页面开发。
  • 可以集成各种视图技术,如 JSP、FreeMarker 等。
  • 使用配置文件和注解来配置应用程序的行为。

4、RESTful 编程风格

REST(Representational State Transfer)是一种软件架构风格,用于构建分布式系统和 Web 服务。RESTful 是一种基于 REST 架构风格的 Web 服务设计风格,它遵循一组约定和原则,使得 Web 服务更加简单、灵活和易于扩展。

主要特点:

  • 资源:RESTful 服务将所有的数据和功能视为资源,每个资源都有唯一的标识符(URI)。
  • 表现层:资源可以有多种表现形式,如 JSON、XML 等,客户端可以根据需要选择适合的表现形式。
  • 状态转移:RESTful 服务通过 HTTP 方法(GET、POST、PUT、DELETE 等)来表示资源的状态转移和操作。
  • 无状态:每个请求都包含足够的信息,使得服务器可以处理请求,而无需维护会话状态。
  • 可缓存:服务器可以将响应进行缓存,以提高性能和可伸缩性。

在 RESTful 编程风格中,资源的标识符(URI)是关键,它代表了资源的唯一性,并且客户端通过 HTTP 方法来执行 CRUD(创建、读取、更新和删除)操作。RESTful 服务通常使用 JSON 或 XML 格式来传输数据,使得客户端和服务器之间的通信更加简单和灵活。

Struts2 是一个用于构建 Web 应用程序的 Java 框架,而 RESTful 编程风格是一种用于构建 Web 服务的设计风格,它们都有各自的优点和用途。在 Web 开发中,可以使用 Struts2 框架来构建整个 Web 应用程序,同时采用 RESTful 编程风格来设计和实现 Web 服务接口,使得应用程序更加模块化和灵活。

5、工作流程

Spring MVC 的工作流程可以简单概括为以下几个步骤:

  1. 请求的到达: 首先,当客户端发送一个 HTTP 请求时,请求会被 Web 服务器接收并传递给 DispatcherServlet(前端控制器)。
  2. 前端控制器: DispatcherServlet 是 Spring MVC 的核心组件之一,它充当前端控制器的角色。它负责接收所有的请求并将请求交给后续的处理组件进行处理。
  3. 处理器映射器(Handler Mapping): DispatcherServlet 通过处理器映射器,根据请求的 URL 找到对应的处理器(Controller)
  4. 处理器适配器(Handler Adapter): 处理器适配器负责将请求传递给对应的处理器(Controller)进行处理,并返回一个 ModelAndView 对象。
  5. 控制器处理: 处理器(Controller)是用户定义的组件,负责处理请求并生成响应。它会根据请求的内容进行业务逻辑处理,然后将处理结果封装在 ModelAndView 对象中返回。
  6. 视图解析器(View Resolver): 视图解析器负责根据 ModelAndView 对象中的视图名称解析出具体的视图(JSP 页面、HTML 页面等)。
  7. 视图渲染: 通过视图解析器解析得到视图后,DispatcherServlet 将 Model 数据传递给视图,视图使用这些数据生成最终的响应内容。
  8. 响应返回: DispatcherServlet 将响应内容发送给客户端,完成请求处理过程。

整个 Spring MVC 的工作流程是由 DispatcherServlet 负责协调和调度的。它根据请求的 URL 找到对应的处理器(Controller)进行处理,并将处理结果传递给适合的视图进行渲染,最终将响应返回给客户端。

在此过程中,Spring MVC 提供了很多可插拔的组件,如处理器映射器、处理器适配器、视图解析器等,这些组件可以根据实际需求进行配置和定制,使得 Spring MVC 可以灵活适应各种不同的业务场景。

6、代码示例

需求是:客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。

实现步骤:

① 导入SpringMVC相关坐标

② 配置SpringMVC核心控制器DispathcerServlet

③ 创建Controller类和视图页面

④ 使用注解配置Controller类中业务方法的映射地址

⑤ 配置SpringMVC核心文件 spring-mvc.xml

⑥ 客户端发起请求测试

6.1、导入坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Spring</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><!--访问端口号 --><!--                    <path>/ServletComprehensivePractice</path>--><uriEncoding>UTF-8</uriEncoding></configuration></plugin></plugins></build><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><!--Spring框架基本坐标--><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><!--Spring集成Junit--><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><!--Spring集成Web--><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><!--Spring集成MVC模式--><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.2.1</version><scope>provided</scope></dependency><dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version></dependency></dependencies>
</project>

provide

在 Maven 中设置 <scope>provided</scope> 的作用是告诉 Maven 编译器和构建工具,在编译和打包时不要将该依赖包(javax.servlet.jsp-api)包含到最终的构建结果中,而是假设这个依赖在目标环境中已经存在。

具体来说,provided 作用域适用于那些在运行时由容器或其他外部环境提供的依赖项,例如 Servlet 和 JSP API。在 Java Web 应用中,这些 API 是由 Web 容器(如 Tomcat、Jetty 等)提供的,因此在构建项目时无需将这些 API 打包进 WAR 文件中。当你部署项目时,Web 容器会负责提供这些 API。

使用 provided 作用域的好处是减少构建结果的大小,因为不会将这些已经存在于目标环境的依赖项包含进去。这样可以避免冲突和版本问题,同时也减少了不必要的重复。

总结:使用 provided 作用域适用于那些在目标运行环境中已经存在的依赖项,例如 Java Web 应用中的 Servlet 和 JSP API,告诉 Maven 在构建时不要将这些依赖包含进去。

6.2、DispathcerServlet

SpringMVC的核心控制器是DispatcherServlet,它是整个SpringMVC框架的前端控制器(Front Controller)。当客户端发送请求时,请求首先会被DispatcherServlet接收,然后DispatcherServlet会根据请求的信息进行处理和分发。

DispatcherServlet的主要职责包括:

  1. 请求分发:根据请求的URL路径,DispatcherServlet会将请求分发给不同的控制器进行处理。这些控制器由开发者定义,并负责处理不同的请求逻辑。
  2. 处理器映射:DispatcherServlet维护了一个处理器映射表,用于将请求映射到对应的处理器(控制器)上。
  3. 视图解析:在处理完请求后,DispatcherServlet会根据处理结果选择对应的视图进行渲染,并返回给客户端。
  4. 统一异常处理:DispatcherServlet还负责统一处理控制器抛出的异常,可以通过配置异常处理器来处理不同类型的异常。
  5. 本地化:DispatcherServlet可以根据客户端请求的语言环境(Locale)选择对应的本地化消息,实现国际化。
  6. 拦截器:DispatcherServlet支持拦截器(Interceptor),拦截器可以在请求处理前后进行预处理和后处理。

总体上,DispatcherServlet起到了框架的总调度中心,负责将请求与相应的控制器进行匹配,然后将处理结果返回给客户端。通过配置DispatcherServlet的不同属性和参数,我们可以实现自定义的请求处理逻辑和视图渲染方式。

🔺配置web.xml

在web.xml配置SpringMVC的核心控制器:

<url-pattern>:指定URL的匹配模式,这里是"/",表示将所有请求都交给名为"DispatcherServlet"的Servlet进行处理。

初始化

SpringMVC的初始化发生在Web应用启动时,当容器(例如Tomcat)加载Web应用时,会寻找web.xml文件,并根据其中的配置初始化SpringMVC框架。

具体地说,SpringMVC的初始化是通过配置在web.xml中的DispatcherServlet来完成的。在web.xml中配置DispatcherServlet时,使用了<load-on-startup>标签,并设置为一个非负整数,例如<load-on-startup>1</load-on-startup>。这个参数的值表示容器启动时加载DispatcherServlet的顺序,数值越小优先级越高。

当容器启动时,会按照<load-on-startup>的数值顺序逐个加载配置了<load-on-startup>的Servlet。因此,DispatcherServlet配置了<load-on-startup>,它将在容器启动时被加载。随后,DispatcherServlet会根据配置的contextConfigLocation参数指定的位置加载SpringMVC的配置文件,通常是一个XML文件,用于初始化SpringMVC框架。

一旦SpringMVC初始化完成,它就能够拦截并处理Web应用中的请求,并根据配置的处理器映射和控制器进行相应的业务处理和视图返回。

<url-pattern>

<url-pattern>用于配置Servlet的映射路径,指定哪些请求能够被该Servlet处理。在SpringMVC中,DispatcherServlet是用于处理所有请求的核心控制器,因此<url-pattern>的配置方式决定了哪些请求会交给DispatcherServlet进行处理。

在web.xml中,<url-pattern>可以按照以下几种方式进行配置:

  1. 精确路径匹配:<url-pattern>/path</url-pattern> 表示只有请求路径为/path的请求会被该Servlet处理,其他路径的请求将被其他Servlet或处理。
  2. 通配符匹配:<url-pattern>*.do</url-pattern> 表示以.do结尾的请求路径都会被该Servlet处理,例如/example.do/test.do等。
  3. 目录匹配:<url-pattern>/dir/*</url-pattern> 表示以/dir/开头的所有请求路径都会被该Servlet处理,例如/dir/test/dir/subdir/file等。
  4. 默认匹配:<url-pattern>/</url-pattern> 表示所有请求路径都会被该Servlet处理,相当于将该Servlet设置为Web应用的默认Servlet,用于处理所有请求。

需要注意的是,<url-pattern>的配置会影响Servlet的处理优先级,如果有多个Servlet配置了相同的<url-pattern>,容器会按照它们在web.xml中的顺序进行匹配,找到最先匹配的Servlet来处理请求。因此,如果存在多个Servlet配置了相同的<url-pattern>,应确保它们的配置顺序是符合要求的。在SpringMVC中,通常将<url-pattern>配置为/,使DispatcherServlet成为默认的Servlet来处理所有请求。

优先级

在启动web应用时,容器会先加载监听器(如ContextLoaderListener),然后再加载SpringMVC(DispatcherServlet)。这是因为在web.xml中配置了监听器的<listener>标签,其中定义了监听器的<listener-class>,容器会根据这个类名实例化并初始化监听器,从而在应用启动时执行监听器的contextInitialized()方法。

在SpringMVC中,DispatcherServlet是用于处理所有请求的核心控制器,需要在web.xml中配置<servlet>servlet-mapping来将其与请求路径关联起来。通常,<servlet><load-on-startup>配置为一个非负整数(如1),表示容器在启动时会优先加载并初始化这个Servlet。这样,在应用启动时,监听器会先被加载并执行,然后再加载并初始化DispatcherServlet,确保整个Spring容器以及MVC配置都准备好处理请求。

总结起来,web应用启动时的加载顺序通常是:

  1. 加载监听器,执行监听器的contextInitialized()方法,初始化Spring容器。
  2. 加载DispatcherServlet,准备处理请求。

⭐<load-on-startup>

<load-on-startup>是web.xml中<servlet>元素的一个子元素,用于指定Servlet在应用启动时的加载顺序。它的取值可以是一个正整数或者负整数,或者也可以不设置。

  1. 设置为正整数:表示该Servlet在容器启动时会被立即加载和初始化。数值越小的Servlet会先被加载和初始化,数值相同的Servlet按照它们在web.xml中的顺序依次加载和初始化。
  2. 设置为负整数或不设置:表示该Servlet在第一次接收到请求时才会被加载和初始化。这种情况下,Servlet会延迟加载,只有在实际需要时才会被初始化。

通常情况下,对于在应用启动时需要进行初始化的Servlet,将<load-on-startup>设置为正整数,以确保在应用启动时立即加载和初始化。

6.3、Controller类及视图页面

这里渲染的视图是JSP,想要渲染HTML是springBoot部分的内容。

6.4、配置注解

6.5、spring-mvc.xml

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--Controller的组件扫描--><context:component-scan base-package="com.xzl"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!--配置内部资源视图解析器--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--  /jsp/success.jsp  --><property name="prefix" value="/JSP/"/><property name="suffix" value=".jsp"/></bean>
</beans>

6.6、客户端发请求

7、🔺组件解析

7.1、执行流程

SpringMVC的执行流程

① 用户发送请求至前端控制器DispatcherServlet。

② DispatcherServlet收到请求调用HandlerMapping处理器映射器。

③ 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果

有则生成)一并返回给DispatcherServlet。

④ DispatcherServlet调用HandlerAdapter处理器适配器。

⑤ HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

⑥ Controller执行完成返回ModelAndView。

⑦ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

⑧ DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

⑨ ViewReslover解析后返回具体View。

⑩ DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。DispatcherServlet响应用户

7.2、解析

SpringMVC组件解析

1. 前端控制器:DispatcherServlet

用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由

它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。

2. 处理器映射器:HandlerMapping

HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的

映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3. 处理器适配器:HandlerAdapter

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理

器进行执行。

4. 处理器:Handler

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由

Handler 对具体的用户请求进行处理。

5. 视图解析器:View Resolver

View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即

具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

6. 视图:View

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最

常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面

8、🔺注解解析

8.1、@RequestMapping

作用:用于建立请求 URL 和处理请求方法之间的对应关系

位置:

 类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录

 方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径

属性:

value:用于指定请求的URL。它和path属性的作用是一样的

method:用于指定请求的方式

params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样

例如:

params = {"accountName"},表示请求参数必须有accountName

params = {"moeny!100"},表示请求参数中money不能是100

8.2、xml

8.3、知识要点

SpringMVC的相关组件

  1. 前端控制器:DispatcherServlet
  2. 处理器映射器:HandlerMapping
  3. 处理器适配器:HandlerAdapter
  4. 处理器:Handler
  5. 视图解析器:View Resolver
  6. 视图:View

SpringMVC的注解和配置

  1. 请求映射注解:@RequestMapping
  2. 视图解析器配置:
    1. REDIRECT_URL_PREFIX = "redirect:"
    2. FORWARD_URL_PREFIX = "forward:"
    3. prefix = "";
    4. suffix = "";

相关文章:

SpringMVC组件

目录 1、简介 2、SpringMVC与Servlet的关系 3、struc2 4、RESTful 编程风格 5、工作流程 6、代码示例 6.1、导入坐标 provide 6.2、DispathcerServlet &#x1f53a;配置web.xml 初始化 优先级 ⭐ 6.3、Controller类及视图页面 6.4、配置注解 6.5、spring-mvc.xm…...

解决el-dialog弹出时,页面抖动,右侧会缩小的问题(即滚动条被遮罩层覆盖的问题)

问题描述&#xff1a; 在弹出el-dialog时&#xff0c;会发现弹出框弹出时&#xff0c;页面会抖动&#xff0c;滚动条被遮罩层覆盖直接没有滚动条了&#xff0c;导致页面缩小了几个像素点&#xff08;滚动条的宽度&#xff09;&#xff1b;体验感不好&#xff0c;会影响到页面的…...

【Rust 基础篇】Rust 属性宏:定制你的代码

导言 Rust是一门现代的、安全的系统级编程语言&#xff0c;它提供了丰富的元编程特性&#xff0c;其中属性宏&#xff08;Attribute Macros&#xff09;是其中之一。属性宏允许开发者在代码上方添加自定义的属性&#xff0c;并对代码进行定制化处理。在本篇博客中&#xff0c;…...

2023-08-04力扣今日三题

链接&#xff1a; 剑指 Offer 35. 复杂链表的复制 题意&#xff1a; 如题 解&#xff1a; 看题研究了好一阵&#xff0c;指针map 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; class Node { public:int val;Node* next;Node* random;Node(in…...

从HTTP代理到Socks5代理:网络安全与爬虫的进化之路

一、HTTP代理&#xff1a;简介与特点 HTTP代理是一种最早的代理技术&#xff0c;通过HTTP协议转发网络请求。它能够隐藏用户的真实IP地址&#xff0c;实现匿名访问&#xff0c;为爬虫应用提供了最基本的代理功能。 HTTP代理只支持TCP协议&#xff0c;对于实时数据传输和UDP协议…...

数学建模-元胞自动机

clc clear n 300; % 定义表示森林的矩阵大小 Plight 5e-6; Pgrowth 1e-2; % 定义闪电和生长的概率 UL [n,1:n-1]; DR [2:n,1]; % 定义上左&#xff0c;下右邻居 vegzeros(n,n); % 初始化表示森林的矩阵 imh ima…...

化学合成有机化学 | 逆合成分析软件/数据库汇总

化合物逆合成路线设计软件是一类用于辅助化学家设计化合物合成路线的工具。这些软件通常基于化学知识和反应数据库&#xff0c;能够根据目标化合物的结构和性质&#xff0c;提供合成路线的建议和优化方案。以下是一些常见的化合物逆合成路线设计软件&#xff1a; IntSynth&…...

无涯教程-jQuery - Selectable选择函数

选择能力功能可与JqueryUI中的交互一起使用。此功能可在任何DOM元素上启用选择能力功能。用光标绘制一个框以选择项目。按住Ctrl键可进行多个不相邻的选择。 Select able - 语法 $( "#selectable" ).selectable(); Select able - 示例 以下是一个简单的示例&…...

MySQL修改root密码

1、使用set password命令 mysql -uroot mysql> use mysql mysql> set password for rootlocalhost PASSWORD(newpass); mysql> flush privileges; mysql> select user,host,password from user; mysql> exit 2、使用update user表 mysql -uroot mysql> …...

vue获取近七天、月份、年份的起始日和结束日

vue获取近七天的起始日和结束日 例如&#xff1a;startDate: 2023-07-29 endDate: 2023-08-04 data() {return {startDate: null,endDate: null} }, mounted() {this.calculateDateRange(); }, methods: {calculateDateRange() {var currentDate new Date();var startDate …...

android AIDL 学习使用

在android studio 2023.2中使用 1、在buidl.gradle增加以下配置&#xff0c;然后同步。不增加这些配置&#xff0c;创建aidl时显示为灰色&#xff0c;不能创建 buildFeatures {compose true// Disable unused AGP featuresbuildConfig falseaidl truerenderScript falseresVal…...

学习笔记|C251|STC32G单片机视频开发教程(冲哥)|第三集:开发环境搭建和程序下载

文章目录 1.STC-ISP软件的下载2.STC32手册下载3.PDF阅读器下载4.学会PDF阅读器查阅手册5.跟着手册搭建C251开发环境Tips:如何同时安装Keil的C51、C251和MDK 6.程序包的下载7.第一个工程的编译和下载 原作者/主讲人&#xff1a;冲哥 原始视频地址 1.STC-ISP软件的下载 STC-ISP …...

【数据可视化】(二)数据探索组件

目录 0.简介 一、数据模式与数据组织 1、数据的定义 2、数据库的定义 3、什么是数据模式? 4、数据模式举例 5、什么是数据纲要? 6、数据组织的层次 二、矢量数据 1、什么是矢量数据?...

Go to Play Maimai DX 2023牛客暑期多校训练营5 G

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;给出一长度为n的仅由1,2,3,4组成的数组和一整数k&#xff0c;求一个最短的区间使得1,2,3,4至少各有一个&#xff0c;且4的数量>k 1<k<n<1e5 思路&#xff1a;用双指针l&#xff0c;r维护合法区间&…...

HTML基础铺垫

&#x1f60a;HTML基础铺垫 &#x1f47b;前言&#x1f4dc;HTML文档结构&#x1f3ad;头部head&#x1f94f;标题title标记&#x1f94f;元信息meta标记 &#x1f3ad;主体body&#x1f94f;body标记&#x1f94f;body标记属性 &#x1f3ad;HTML基本语法&#x1f94f;标记类型…...

【Vue3项目实战】vue3项目基于el-menu封装左侧菜单栏组件

文章目录 概述一、先看效果1.1 静态效果1.2 动态效果 二、核心思路三、全量代码3.1 文件目录结构3.2 /sidebar/index.vue 中3.3 /sidebar/sidebarItem.vue 中3.4 路由表结构 四、代码讲解五、SVG组件六、系列文章友链1、[配置husky、stylelint、commitlint&#xff0c;实现git提…...

MySQL正则表达式检索数据

目录 一、使用正则表达式进行基本字符匹配 1.使用regexp关键字 2.使用正则表达式 . 二、进行OR匹配 1.为搜索两个串之一&#xff0c;使用 | 2.匹配几个字符之一[] 3.匹配范围 4.匹配特殊字符 过滤数据允许使用匹配、比较、通配符操作来寻找数据&#xff0c;但是随…...

vite+ts+vue3 prettier.config.js 不生效问题解决

vitetsvue3 prettier.config.js 不生效问题解决 我在做项目的时候 我发现 我的vscode prettier插件 坏了 我自动格式化代码也开了 就是不给我格式化, 我已经写了prettier.config.js这个配置 也 npm i prettier 下载了就是不生效 后来我发现是因为 这个package.json 里的 “ty…...

Java源码规则引擎:jvs-rules 8月新增功能介绍

JVS-rules是JAVA语言下开发的规则引擎&#xff0c;是jvs企业级数字化解决方案中的重要配置化工具&#xff0c;核心解决业务判断的配置化&#xff0c;常见的使用场景&#xff1a;金融信贷风控判断、商品优惠折扣计算、对员工考核评分等各种变化的规则判断情景。 8月是收获的季节…...

2023年第三届工业自动化、机器人与控制工程国际会议 | IET独立出版 | EI检索

会议简介 Brief Introduction 2023年第三届工业自动化、机器人与控制工程国际会议&#xff08;IARCE 2023&#xff09; 会议时间&#xff1a;2023年10月27 -30日 召开地点&#xff1a;中国成都 大会官网&#xff1a;www.iarce.org 2023年第三届工业自动化、机器人与控制工程国际…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...