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

Spring框架学习day7--SpringWeb学习(概念与搭建配置)

  • SpringWeb
    • 1.SpringWeb特点
    • 2.SpringWeb运行流程
    • 3.SpringWeb组件
    • 4.搭建
      • 项目结构图:
      • 4.1导入jar包
      • 4.2在Web.xml配置
        • **4.2.1配置统一拦截分发器 DispatcherServlet**
        • 4.2.2开启SpringWeb注解(spring.xml)
    • 5.处理类的搭建
    • 6.SpringWeb请求流程(自己理解)
    • 7.接受请求
      • @RequestMapping
    • 8.补充ApiPost7使用(不需要前端直接测试后端)
    • 9.获取请求数据
      • 1.使用request对象接收
      • 2.spring自动封装
      • 3.@RequestParam("")进行参数绑 定.
      • 4.使用实体类对象接受
      • 5.日期类转换
    • 10.中文乱码处理
    • 11.跨域访问处理
    • 12.返回json
    • 13.拦截器

SpringWeb

SpringWeb是spring框架的一部分,是对web层进行封装

在 web 层框架历经 Strust1,WebWork,Strust2 等诸多产品的历代更选之后, 目前业界普遍选择了 springWeb 作为 Java EE 项目 web 层开发的首选方案

1.SpringWeb特点

pringWEB 是 spring 家族原生产品,与 IOC 容器等基础设施无缝对接.

  •  基于原生的 Servlet,提供了一个前端控制器 DispatcherServlet ,开发者
    无须额外开发控制器对象.
  •  可以自动绑定用户输入,并正确地转换数据类型.
  •  代码清新简洁,大幅度提升开发效率.
  •  内部组件化程度高,可插拔式组件即插即用.
  •  性能卓著,尤其适合现代大型、超大型互联网项目要求.

2.SpringWeb运行流程

  • 用户发送出请求到前端控制器 DispatcherServlet

  • DispatcherServlet 收到请求调用 HandlerMapping(处理器映射器)。

  • HandlerMapping 找到具体的处理器(可查找 xml 配置或注解配置),生成处 理器对象及处理器拦截器(如果有),再一起返回给 DispatcherServlet

  • DispatcherServlet调用 HandlerAdapter(处理器适配器)。

  • HandlerAdapter 经过适配调用具体的处理器(Handler/Controller)。

  • Controller 执行完成向前端响应结果

原理图:

image-20250602211810022

3.SpringWeb组件

前端控制器:DispatcherServlet,由框架提供,在web.xml配置

**作用:**统一处理请求和响应。整个流程控制的中心,由它组件处理用户的请求

**处理映射器:HandlerMapping**由框架提供

作用:根据请求的url查找Handler

**处理器适配器HandlerAdapter**由框架提供。

作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler

处理器Handler也称为Control需要自己开发

注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可 以去正确执行Handler。

作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。

4.搭建

创建ssm web!!!项目根据前面搭建IOC AOP 事务管理的项目

项目结构图:

image-20250605180424293

4.1导入jar包

<!-- springWeb -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.2.RELEASE</version>
</dependency>

完整的pom.xml配置

<?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>com.example</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><name>ssm</name><packaging>war</packaging><properties><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.source>1.8</maven.compiler.source><junit.version>5.6.2</junit.version></properties><dependencies><!--spring-context--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.2.RELEASE</version></dependency><!--spring-jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.2.RELEASE</version></dependency><!--mybtais--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.2</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- 阿里巴巴数据源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!--spring集成mybatis需要的依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><!--springweb层--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.2.RELEASE</version></dependency><!--servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!--jackson--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency><!--spring中提供的解决跨域问题的过过滤器--><dependency><groupId>com.thetransactioncompany</groupId><artifactId>cors-filter</artifactId><version>2.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.0</version></plugin></plugins></build>
</project>

4.2在Web.xml配置

必须是web项目

配置Web.xml文件

4.2.1配置统一拦截分发器 DispatcherServlet
	<servlet><servlet-name>application</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></init-param><load-on-startup>0</load-on-startup></servlet><!-- 请求映射 --><servlet-mapping><servlet-name>application</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
4.2.2开启SpringWeb注解(spring.xml)
<!-- 配置springmvc注解扫描--><mvc:annotation-driven/>

完整spring.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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--开启注解扫描   对指定包下面的类进行扫描, 检查添加有spring注解标签的类--><context:component-scan base-package="com.ffyc.ssm"> </context:component-scan><!--导入属性文件--><context:property-placeholder location="classpath:config.properties"/><!--让spring管理阿里巴巴数据库连接对象--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${driverClassName}"></property><property name="url" value="${url}"></property><property name="username" value="${uname}"></property><property name="password" value="${pwd}"></property><property name="initialSize" value="${initialSize}"></property><property name="maxActive" value="${maxActive}"></property></bean><!--spring管理生成SqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><!--注入数据库连接对象--><property name="configLocation" value="classpath:mybatis.xml"></property><!--指定配置文件--><property name="mapperLocations" value="classpath:mappers/*Mapper.xml"><!--指定映射文件地址--></property></bean><!--spring管理生成接口的代理对象--><bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.ffyc.ssm.dao"></property><!--对指定包下的接口进行扫描,并生成接口的代理对象--><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean><!-- 配置 spring 事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 开启注解事务管理 --><tx:annotation-driven transaction-manager="transactionManager"/><!--开启web层的注解--><mvc:annotation-driven></mvc:annotation-driven><!--配置拦截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><!--定义哪些地址可以进入到拦截器中--><mvc:exclude-mapping path="/loginCtl/login"/><!--定义哪些地址不进入拦截器--><bean id="admintoken" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean><!--配置拦截器的实现类--></mvc:interceptor></mvc:interceptors></beans>

注意:一定要检查spring.xml的配置

<!--导入属性文件--><context:property-placeholder location="classpath:config.properties"/>

5.处理类的搭建

image-20250602214944487

package com.ffyc.ssm.web;import com.ffyc.ssm.model.Admin;
import com.ffyc.ssm.model.Result;
import com.ffyc.ssm.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import sun.management.Agent;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestController
//@RequestMapping 用来为类和方法定义访问地址,  类上面的地址不能重复
@RequestMapping(path = "/loginCtl")
public class LoginController {@AutowiredLoginService loginService;@RequestMapping("/login")public String login() {System.out.println("hello Spring Web");return "login success";}}

@RestController 用于标记在一个类上,使用它标记的类就是一个 SpringWEB
控制器类.

Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及子包中的使用了@RestController 标识的类,然后将类加入到 Spring IOC 容器中,注入依赖。 @RequestMapping 注解是一个用来处理请求地址映射的注解,可用于类或方法上

@RequestMapping("/location") 注解是一个用来处理请求地址映射的注解,可用于类或方 法上。注:类上面的地址不允许重名,同一类内部方法的地址不允许重名

把项目部署在tomcat上运行,部署步骤

1.image-20250602215421077

2.image-20250602215501427

3.image-20250602215558468

注意:转换web项目时

要添加Artifacs:如图

image-20250602221354586

4.image-20250602220108968

5.启动服务器

image-20250602220148952

启动成功!!!

6.SpringWeb请求流程(自己理解)

  • 用户发送出请求到前端控制器DispatcherServlet。
  • DispatcherServlet 收到请求调用HandlerMapping(处理器映射器)。
  • HandlerMapping找到具体的处理器(可查找xml配置或注解配置),生成处
    理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
  • DispatcherServlet 调用 HandlerAdapter(处理器适配器)。
  • HandlerAdapter经过适配调用具体的处理器(Handler/Controller)。
  • Controller 执行完成向前端响应结果

image-20250605154603498

7.接受请求

@RequestMapping

/*@RequestMapping 是一个用来为处理器地址映射的注解,可用于类或方法上.
作用在类上,在整个项目中不能重复,作用在方法上,整个类中不能重复.
常用属性 path,value,method.
path 和value 用来定义地址
method 用来定义请求方式*/
@RequestMapping(value = "/hello",method = RequestMethod.GET)
@RequestMapping(path= "/hello",method = RequestMethod.POST)

案例:比如只允许post

@RequestMapping(path = "/login",method = RequestMethod.POST)public String login() {System.out.println("hello Spring Web");return "login success";}

8.补充ApiPost7使用(不需要前端直接测试后端)

1.安装ApiPost7

2.开始配置,点击API

image-20250605163510832

2.配置接口

image-20250605163826541

3.开始post、get测试

image-20250605164038638

4.点击发送得到响应

image-20250605164127479

5.后端响应

image-20250605164349095

当然后端也可以更简单的接受前端post

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name与age(前提必须name对应前端的name)public String login(String name, String age) {System.out.println("hello Spring Web");System.out.println(name +"and"+age);return "login success";}

image-20250605164739912

也可以将前端数据封装在类中,当然前端传来的名称要与后端内容一致

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name与age(前提必须name对应前端的name)public String login(Admin admin) {System.out.println("hello Spring Web");System.out.println(admin.getAccount());System.out.println(admin.getPassword());return "login success";}

image-20250605165024384

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那我们对获取请求数据来做具体介绍

9.获取请求数据

SpringWeb支持多种类型的请求参数进行封装

1.使用request对象接收

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name与age(前提必须name对应前端的name)public String login(HttpServletRequest request) {System.out.println(request.getParameter("name"));return "login success";}

在处理中如果需要使用到HttpServletRequest 对象只需要定义即可

2.spring自动封装

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name与age(前提必须name对应前端的name)public String login(String account,String password) {System.out.println("account: "+account+" password: "+password);return "login success";}

Spring 会自定进行数据封装,这里要注意的是,处理器接收参数的形参名称必须 和表单的name属性保持一致,否则会接收失败!

3.@RequestParam(“”)进行参数绑 定.

当请求参数名与形参名不一致时,可以使用

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name与age(前提必须name对应前端的name)public String login(@RequestParam("account") String Useraccount,@RequestParam("password") String Userpassword) {System.out.println("account: "+Useraccount+" password: "+Userpassword);return "login success";}

表单的name和控制器的形参并不一致,但是@RequestParam注解的value 值必须和表单的name保持一致。

  • @RequestHeader(“”)用来接收请求中的数据.
  • @RequestHeader(“user-agent”)可以用来接收请求头中的数据

4.使用实体类对象接受

@RequestBody可以接收前端提交的json格式数据,将json格式封装到对象 中.

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name与age(前提必须name对应前端的name)public String login(Admin admin) {Admin admin1 = loginService.login(admin);System.out.println(admin1);return "login success";}

5.日期类转换

属性类型为Date类型需要指定转换格式

@DateTimeFormat(pattern="yyyy-MM-dd") 
privateDatebirthday
@DateTimeFormat(pattern = "yyyy-MM-dd")//给前端提交到后端的数据日期指定转换格式@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")//后端把对象转为json时,指定日期的格式private Date birthday;

如果前端是json格式的数据则需要在对象前添加如下标签@RequestBody

@RequestMapping(path = "/login",method = RequestMethod.POST)
public String login(@RequestBody Admin admin) {Admin admin1 = loginService.login(admin);System.out.println(admin1);return "login success";
}

tips:记得在pom.xml添加json组件

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
</dependency>

10.中文乱码处理

添加jar组件配置web.xml

<!--编码过滤器--><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></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

11.跨域访问处理

添加依赖pom.xml

 <!--spring中提供的解决跨域问题的过过滤器--><dependency><groupId>com.thetransactioncompany</groupId><artifactId>cors-filter</artifactId><version>2.5</version></dependency>

web.xml配置

<!--跨域过滤器--><filter><filter-name>CORS</filter-name><filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class></filter><filter-mapping><filter-name>CORS</filter-name><url-pattern>/*</url-pattern></filter-mapping>

12.返回json

第一步添加依赖

<!--jackson-->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
</dependency>

Springweb 中 向 前 端 返 回数据为 json 时,只需要在方法上添加 @ResponseBody注解即可,

由于在类上面已经使用@RestController 注解,所以不需要再次添 加,@RestController 中已经包含

package com.ffyc.ssm.web;import com.ffyc.ssm.model.Admin;
import com.ffyc.ssm.model.Result;
import com.ffyc.ssm.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import sun.management.Agent;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestController
//@RequestMapping 用来为类和方法定义访问地址,  类上面的地址不能重复
@RequestMapping(path = "/loginCtl")
public class LoginController {@AutowiredLoginService loginService;@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name与age(前提必须name对应前端的name)public Admin login(@RequestBody Admin admin) {Admin admin1 = loginService.login(admin);System.out.println(admin1);return admin;}}

运行tomcat 使用ApiPost测试

image-20250605180302032

为了返回前端的代码,那我们写一个上面result.class

package com.ffyc.ssm.model;public class Result {private  int code;private String message;private Object data;public Result() {}public Result(int code, String message, Object data) {this.code = code;this.message = message;this.data = data;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}

13.拦截器

Spring WEB中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter), 它主要用于拦截用户请求并作相应的处理。 Spring 中的拦截器与过滤器有着本质的区别,过滤器是servlet规范中定义并实 现的,在进入到servlet之前截获请求.而拦截器是spring中定义的一种拦截机制, 是对进入到处理器的请求进行拦截.

image-20250605181000711

SpringWEB 定义了拦截器接口HandlerInterceptor

调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。

boolean preHandle

​ 预处理方法,实现处理器方法的预处理,就是在处理器方法执行之前这个方法会 被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三 个参数为被拦截的处理器。如果preHandle方法返回true表示继续流程(如调 用下一个拦截器或处理器方法),返回false表示流程中断,不会继续调用其他 的拦截器或处理器方法,此时我们需要通过response来产生响应;

1.添加**AdminTokenInterceptor**类拦截器

package com.ffyc.ssm.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;//定义拦截器
public class AdminTokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("进入到了拦截器");//获得tokenString token  =   request.getHeader("token");if(token.equals("123456")){return true; //拦截器中返回true, 请求就会离开拦截器,继续向后执行,到达处理器}else{response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.write("token验证失败");return false;//拦截器中返回false. 不会继续向后执行.  可以在拦截器中向用户做出响应}}
}

2.注册拦截器(spring.xml)

<!--配置拦截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><!--定义哪些地址可以进入到拦截器中--><mvc:exclude-mapping path="/loginCtl/login"/><!--定义哪些地址不进入拦截器--><bean id="admintoken" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean><!--配置拦截器的实现类--></mvc:interceptor></mvc:interceptors>

相关文章:

Spring框架学习day7--SpringWeb学习(概念与搭建配置)

SpringWeb1.SpringWeb特点2.SpringWeb运行流程3.SpringWeb组件4.搭建项目结构图&#xff1a;4.1导入jar包4.2在Web.xml配置**4.2.1配置统一拦截分发器 DispatcherServlet**4.2.2开启SpringWeb注解&#xff08;spring.xml&#xff09; 5.处理类的搭建6.SpringWeb请求流程(自己理…...

打造高效多模态RAG系统:原理与评测方法详解

引言 随着信息检索与生成式AI的深度融合&#xff0c;检索增强生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09; 已成为AI领域的重要技术方向。传统RAG系统主要依赖文本数据&#xff0c;但真实世界中的信息往往包含图像、表格等多模态内容。多模态RAG&#xf…...

SSM 框架核心知识详解(Spring + SpringMVC + MyBatis)

&#x1f331; 第一部分&#xff1a;Spring 核心原理与使用 1. 什么是 Spring Spring 是一个开源的 Java 企业级开发框架&#xff0c;旨在简化 Java 企业应用程序开发。它核心思想是控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;&#xff0…...

1.2 fetch详解

浏览器 Fetch API 详解 Fetch API 是现代浏览器提供的用于发起网络请求的接口&#xff0c;它基于 Promise 实现&#xff0c;替代了传统的 XMLHttpRequest&#xff0c;提供了更强大、更灵活的功能。 1. 基本用法 使用 fetch() 函数发起请求&#xff0c;返回一个 Promise&…...

【C#】Quartz.NET怎么动态调用方法,并且根据指定时间周期执行,动态配置类何方法以及Cron表达式,有请DeepSeek

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…...

02 Deep learning神经网络的编程基础 逻辑回归--吴恩达

逻辑回归 逻辑回归是一种用于解决二分类任务&#xff08;如预测是否是猫咪等&#xff09;的统计学习方法。尽管名称中包含“回归”&#xff0c;但其本质是通过线性回归的变体输出概率值&#xff0c;并使用Sigmoid函数将线性结果映射到[0,1]区间。 以猫咪预测为例 假设单个样…...

Android Native 内存泄漏检测全解析:从原理到工具的深度实践

引言 Android应用的内存泄漏不仅发生在Java/Kotlin层&#xff0c;Native&#xff08;C/C&#xff09;层的泄漏同样普遍且隐蔽。由于Native内存不受Java虚拟机&#xff08;JVM&#xff09;管理&#xff0c;泄漏的内存无法通过GC自动回收&#xff0c;长期积累会导致应用内存占用…...

React---扩展补充

一些额外的扩展 4.3 高阶组件 高阶组件是参数为组件&#xff0c;返回值为新组件的函数&#xff1b; 高阶组件 本身不是一个组件&#xff0c;而是一个函数&#xff1b;其次&#xff0c;这个函数的参数是一个组件&#xff0c;返回值也是一个组件&#xff1b; import React fr…...

HTML 中 class 属性介绍、用法

1、&#x1f516; 什么是 class class 是 HTML 元素的一个核心属性&#xff0c;用来为元素指定一个或多个类名。它在网页开发中承担三大作用&#xff1a; &#x1f3a8; 连接样式&#xff08;CSS&#xff09;&#xff1a;让元素应用预定义的视觉效果⚙️ 绑定行为&#xff08…...

MySQL的并发事务问题及事务隔离级别

一、并发事务问题 1). 赃读&#xff1a;一个事务读到另外一个事务还没有提交的数据。 比如 B 读取到了 A 未提交的数据。 2). 不可重复读&#xff1a;一个事务先后读取同一条记录&#xff0c;但两次读取的数据不同&#xff0c;称之为不可重复读。 事务 A 两次读取同一条记录&…...

ProfiNet 分布式 IO 在某污水处理厂的应用

随着城市化进程的加速&#xff0c;污水处理厂的规模和复杂性不断增加&#xff0c;对自动化控制系统的要求也越来越高。PROfinet 分布式 IO 作为一种先进的工业通信技术&#xff0c;以其高速、可靠、灵活的特性&#xff0c;为污水处理厂的自动化升级提供了有力支持。本文将结合某…...

vue2使用笔记、vue2和vue3的区别

文章目录 vue2和vue3的区别1. 实现数据响应式的原理不同2. 生命周期不同3. vue 2.0 采用了 option 选项式 API&#xff0c;vue 3.0 采用了 composition 组合式 API4. 新特性编译宏5. 父子组件间双向数据绑定 v-model 不同6. v-for 和 v-if 优先级不同7. 使用的 diff 算法不同8.…...

Vue2数组数字字段求和技巧 数字求和方法

<template><div><p>总和: {{ totalSum }}</p></div> </template><script> export default {data() {return {items: [{ id: 1, value: 10 },{ id: 2, value: 20 },{ id: 3, value: 30 }]};},computed: {totalSum() {return this.ite…...

vue2 , el-select 多选树结构,可重名

人家antd都支持&#xff0c;elementplus 也支持&#xff0c;vue2的没有&#xff0c;很烦。 网上其实可以搜到各种的&#xff0c;不过大部分不支持重名&#xff0c;在删除的时候可能会删错&#xff0c;比如树结构1F的1楼啊&#xff0c;2F的1楼啊这种同时勾选的情况。。 可以全…...

Excel处理控件Aspose.Cells教程:使用 C# 从 Excel 进行邮件合并

邮件合并功能让您能够轻松批量创建个性化文档&#xff0c;例如信函、电子邮件、发票或证书。您可以从模板入手&#xff0c;并使用电子表格中的数据进行填充。Excel 文件中的每一行都会生成一个新文档&#xff0c;并在正确的位置包含正确的详细信息。这是一种自动化重复性任务&a…...

Jenkins | Jenkins构建成功服务进程关闭问题

Jenkins构建成功服务进程关闭问题 1. 原因2. 解决 1. 原因 Jenkins 默认会在构建结束时终止所有由构建任务启动的子进程&#xff0c;即使使用了nohup或后台运行符号&。 2. 解决 在启动脚本中加上 BULID_IDdontkillme #--------------解决jenkins 自动关闭进程问题-----…...

模块化架构下的前端调试体系建设:WebDebugX 与多工具协同的工程实践

随着前端工程化的发展&#xff0c;越来越多的项目采用模块化架构&#xff1a;单页面应用&#xff08;SPA&#xff09;、微前端、组件化框架等。这类架构带来了良好的可维护性和复用性&#xff0c;但也带来了新的调试挑战。 本文结合我们在多个模块化项目中的真实经验&#xff…...

EXCEL通过DAX Studio获取端口号连接PowerBI

EXCEL通过DAX Studio获取端口号连接PowerBI 昨天我分享了EXCEL链接模板是通过获取端口号和数据库来连接PowerBI模型的&#xff0c;链接&#xff1a;浅析EXCEL自动连接PowerBI的模板&#xff0c;而DAX Studio可以获取处于打开状态的PowerBI的端口号。 以一个案例分享如何EXCEL…...

PostgreSQL 技术峰会,为您打造深度交流优质平台

峰会背景 PostgreSQL 作为全球领先的开源关系型数据库管理系统&#xff0c;凭借其强大的功能、高度的扩展性和稳定性&#xff0c;在云计算、大数据、人工智能等领域得到了广泛应用。随着数字化转型的加速&#xff0c;企业对数据库技术的需求日益复杂和多样化&#xff0c;Postg…...

使用 OpenCV (C++) 进行人脸边缘提取

使用 OpenCV (C) 进行人脸边缘提取 本文将介绍如何使用 C 和 OpenCV 库来检测图像中的人脸&#xff0c;并提取这些区域的边缘。我们将首先使用 Haar级联分类器进行人脸检测&#xff0c;然后在检测到的人脸区域&#xff08;ROI - Region of Interest&#xff09;内应用 Canny 边…...

C# 委托UI控件更新例子,何时需要使用委托

1. 例子1 private void UdpRxCallBackFunc(UdpDataStruct info) {// 1. 前置检查防止无效调用if (textBoxOutput2.IsDisposed || !textBoxOutput2.IsHandleCreated)return;// 2. 使用正确的委托类型Invoke(new Action(() >{// 3. 双重检查确保安全if (textBoxOutput2.IsDis…...

大模型数据流处理实战:Vue+NDJSON的Markdown安全渲染架构

在Vue中使用HTTP流接收大模型NDJSON数据并安全渲染 在构建现代Web应用时&#xff0c;处理大模型返回的流式数据并安全地渲染到页面是一个常见需求。本文将介绍如何在Vue应用中通过普通HTTP流接收NDJSON格式的大模型响应&#xff0c;使用marked、highlight.js和DOMPurify等库进…...

python项目如何创建docker环境

这里写自定义目录标题 python项目创建docker环境docker配置国内镜像源构建一个Docker 镜像验证镜像合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPant…...

Eureka 高可用集群搭建实战:服务注册与发现的底层原理与避坑指南

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

PyTorch--池化层(4)

池化层&#xff08;Pooling Layer&#xff09; 用于降低特征图的空间维度&#xff0c;减少计算量和参数数量&#xff0c;同时保留最重要的特征信息。 池化作用&#xff1a;比如1080p视频——720p 池化层的步长默认是卷积核的大小 ceil 允许有出界部分&#xff1b;floor 不允许…...

GPU加速与非加速的深度学习张量计算对比Demo,使用PyTorch展示关键差异

import torch import time # 创建大型随机张量 (10000x10000) tensor_size 10000 x_cpu torch.randn(tensor_size, tensor_size) x_gpu x_cpu.cuda() # 转移到GPU # CPU矩阵乘法 start time.time() result_cpu torch.mm(x_cpu, x_cpu.t()) cpu_time time.time() - sta…...

Vue中的自定义事件

一、前言 在 Vue 的组件化开发中&#xff0c;组件之间的数据通信是构建复杂应用的关键。而其中最常见、最推荐的方式之一就是通过 自定义事件&#xff08;Custom Events&#xff09; 来实现父子组件之间的交互。 本文将带你深入了解&#xff1a; Vue 中事件的基本概念如何在…...

2025年大模型平台落地实践研究报告|附75页PDF文件下载

本报告旨在为各行业企业在建设落地大模型平台的过程中&#xff0c;提供有效的参考和指引&#xff0c;助力大模型更高效更有价值地规模化落地。本报告系统性梳理了大模型平台的发展背景、历程和现状&#xff0c;结合大模型平台的特点提出了具体的落地策略与路径&#xff0c;同时…...

PPTAGENT:让PPT生成更智能

想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型&#xff0c;以发挥其最大潜力。 CSDN教学平台录播地址…...

Kotlin 中 companion object 扩展函数和普通函数区别

在 Kotlin 中&#xff0c;companion object 的扩展函数与普通函数&#xff08;包括普通成员函数和普通扩展函数&#xff09;有显著区别。以下是它们的核心差异和适用场景&#xff1a; 1. 定义位置与归属 特性companion object 扩展函数普通函数定义位置在类外部为伴生对象添加…...