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

【SpringBoot】| SpringBoot 和 web组件

目录

一:SpringBoot 和 web组件

1. SpringBoot中使用拦截器(重点)

2. SpringBoot中使用Servlet

3. SpringBoot中使用过滤器(重点)

4. 字符集过滤器的应用


一:SpringBoot 和 web组件

1. SpringBoot中使用拦截器Interceptor(重点)

拦截器是SpringMVC中一种对象,能够拦截器对Controller的请求!

拦截器框架中有系统的拦截器, 还可以自定义拦截器, 实现对请求预先处理!

实现自定义拦截器:

第一步:创建一个类实现SpringMVC框架的HandlerInterceptor接口,重写方法。

HandlerInterceptor接口源码中有三个默认方法,常用的是preHandle方法中进行拦截:

package org.springframework.web.servlet;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}

编写LoginInterceptor类实现HandlerInterceptor接口,并重写preHandler方法

package com.zl.web;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;// 自定义拦截器
public class LoginInterceptor implements HandlerInterceptor {/*** @param request* @param response* @param handler 被拦截的控制器对象* @return boolean,true:表示请求能被Controller处理,false:表示被截断* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception { // handler是被拦截的控制器对象System.out.println("请求拦截器执行了");return true;}
}

第二步:SpringBoot中注册声明拦截器

SpringMVC框架中注册声明拦截器

<mvc:interceptors><mvc:interceptor><mvc:path="url" /><bean class="拦截器类全限定名称"/></mvc:interceptor>
</mvc:interceptors>

SpringBoot框架中注册声明拦截器

(1)使用类+注解的方式,编写一个类实现WebMvcConfigurer接口(这个接口很重要,很多与SpringMVC有关的功能都在这,并添加@Configuration注解,关于SpringMVC有关的功能都在WebMvcConfigurer接口中实现了!

(2)重写addInterceptors方法,在方法中添加拦截器对象,注入到容器当中;然后在调用addPathPatterns添加拦截的请求,再调用excludePathPatterns排除拦截的请求。

package com.zl.config;import com.zl.web.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration // 这个类当做配置文件使用
public class MyAppConfigurer implements WebMvcConfigurer {// 添加拦截器对象,注入到容器中@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 创建拦截器对象HandlerInterceptor interceptor = new LoginInterceptor();// 调用addInterceptor方法表示注入到容器中// 调用addPathPatterns方法表示可以拦截的请求// 调用excludePathPatterns方法表示通过的请求registry.addInterceptor(interceptor).addPathPatterns("/user/**").excludePathPatterns("/user/login");}
}

第三步:编写controller进行访问

package com.zl.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class BootController {@RequestMapping("/user/account") // 会被拦截@ResponseBodypublic String userAccount(){return "访问user/account地址";}@RequestMapping("/user/login")@ResponseBodypublic String userLogin(){return "访问user/login地址"; // 会被通过
}

2. SpringBoot中使用Servlet

在SpringBoot框架中使用Servlet对象!

使用步骤:

②创建Servlet类继承HttpServlet类

注册Servlet ,让框架能找到Servlet。

第一步:创建Servlet类继承HttpServlet

重写doGet和doPost方法,并且在doGet中调用doPost方法,这样不论发过来post请求还是get请求都没有问题!

package com.zl.web;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;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 调用doPost方法doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 使用HttpServletResponse输出数据,应答结果response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("执行的是Servlet");out.flush();out.close();}
}

第二步:注册Servlet ,让框架能找到Servlet

(1)ServletRegistrationBean用来做在 servlet 3.0+容器中注册 servlet 的功能,但更具有 SpringBean友好性。

(2)首先写一个类,类名随意加上@Configuration注解,表示这个类是配置信息的类;再类中编写一个servletRegistrationBean()方法返回值是ServletRegistrationBean对象

(3)添加上@Bean注解。@Bean用于将对象存入spring的ioc容器中,同@controller、@Service、@Component、@Configuration、@Repository等几个注解是一样的,都是负责将对象存入容器当中。只不过方式不同,四个注解它们是用在类上面的,然后将当前类通过无参构造函数创建对象然后放入容器;而@Bean是用在方法上,将当前方法的返回值对象放到容器当中!可以理解为前者是由spring自动创建对象,而@Bean创建对象是交给我们自己来控制。

package com.zl.config;import com.zl.web.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.Servlet;
import javax.servlet.http.HttpServlet;@Configuration
public class WebAppConfig {// 定义方法,注册Servlet对象@Bean // 把ServletRegistrationBean对象放到容器当中public ServletRegistrationBean servletRegistrationBean(){// 创建ServletRegistrationBean对象,有两个参数:// 一个参数是servlet,一个参数是url地址HttpServlet servlet = new MyServlet();ServletRegistrationBean bean = new ServletRegistrationBean(servlet,"/myservlet");return bean;}
}

当然也可以使用无参数构造方法,调用引用.set方法进行赋值,对于路径也可以赋多个

ServletRegistrationBean bean = new ServletRegistrationBean();
bean.setServlet(servlet);
bean.addUrlMappings("/login","/test"); // 多个路径都可以访问

3. SpringBoot中使用过滤器Filter(重点)

Filter是Servlet规范中的过滤器,可以处理请求、对请求的参数、属性进行调整; 常常在过滤器中处理字符编码

使用步骤:

①创建自定义过滤器类;

②注册Filter过滤器对象;

注:对于过滤器和拦截器的简单理解

(1)过滤器是用来过滤request或者response参数的(比如:增加一些乱码),侧重于对数据的过滤;

(2)而拦截器是用来验证请求的,能够截断请求!

第一步:创建自定义过滤器类

创建MyFilter类实现Filter接口重写doFilter方法,进行处理;处理好以后调用filterChain参数的doFilter方法,把请求传递出去,继续进行下一步操作。

package com.zl.web;import javax.servlet.*;
import java.io.IOException;
// 自定义过滤器类
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {// 处理字符集编码response.setContentType("text/html;charset=UTF-8");System.out.println("Filter过滤器执行了");// 把请求转发出去filterChain.doFilter(request,response);}
}

第二步:注册过滤器对象

写一个配置类,类名随意加上@Configuration注解,表示这个类是配置信息的类;再类中编写一个filterRegistrationBean()方法返回值是FilterRegistrationBean对象,并在方法上加上@Bean注解,把返回的对象交给Spring容器管理。

package com.zl.config;import com.zl.web.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.FilterRegistration;@Configuration
public class WebApplicationConfig {@Beanpublic FilterRegistrationBean filterRegistrationBean (){// 调用无参数构造方法FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new MyFilter()); // 指定过滤器对象bean.addUrlPatterns("/user/*"); // 指定过滤的地址return bean;}
}

编写controller进行访问

package com.zl.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class CustomerFilterController {@RequestMapping("/user/account")@ResponseBodypublic String userAccount(){return "user/account执行了";}
}

4. 字符集过滤器的应用

CharacterEncodingFilter:解决post请求中乱码的问题;在SpringMVC框架, 在web.xml注册过滤器,配置它的属性,解决乱码问题!

创建一个Servlet

package com.zl.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;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("在Servlet中使用中文");out.flush();out.close();}
}

注册Servlet

package com.zl.web;import com.zl.servlet.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;@Controller
public class WebAppConfig {// 注册Servlet@Beanpublic ServletRegistrationBean servletRegistrationBean(){MyServlet myServlet = new MyServlet();ServletRegistrationBean bean = new ServletRegistrationBean(myServlet, "/myservlet");return bean;}
}

进行访问:发现中文乱码

F12,刷新请求并打开,发现默认的编码方式是:ISO-8859-1

第一种解决方式:自定义过滤器,比较麻烦,不推荐

①在注册Servlet中添加过滤器

package com.zl.web;import com.zl.servlet.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.web.filter.CharacterEncodingFilter;@Controller
public class WebAppConfig {// 注册Servlet@Beanpublic ServletRegistrationBean servletRegistrationBean(){MyServlet myServlet = new MyServlet();ServletRegistrationBean bean = new ServletRegistrationBean(myServlet, "/myservlet");return bean;}// 注册Filter@Beanpublic FilterRegistrationBean filterRegistrationBean(){FilterRegistrationBean bean = new FilterRegistrationBean();// 使用框架中的字符过滤器CharacterEncodingFilter filter = new CharacterEncodingFilter();// 指定使用的编码方式filter.setEncoding("UTF-8");// 指定request,response使用encoding的值filter.setForceEncoding(true);// 给filter设置参数bean.setFilter(filter);bean.addUrlPatterns("/*"); // 过滤所有的地址return bean;}
}

②修改application.properties文件, 让自定义的过滤器起作用

默认使用的是系统配置好的

 

让自己的配置生效 

(1)SpringBoot中默认已经配置启用了CharacterEncodingFilter,编码默认ISO-8859-1;
(2)设置enabled=false 作用是关闭系统中配置好的过滤器, 使用自定义的CharacterEncodingFilter;

server.servlet.encoding.enabled=false

第二种方式:直接使用框架中的过滤器,比较简单,推荐使用

注:实际上SpringBoot已经把字符编码的过滤器自动纳入容器管理了,通过源码分析可以发现这个配置与配置文件application.properties中的server.servlet.encoding配置进行了绑定。

package org.springframework.boot.autoconfigure.web.servlet;import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.boot.web.servlet.server.Encoding;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import org.springframework.web.filter.CharacterEncodingFilter;@AutoConfiguration
@EnableConfigurationProperties({ServerProperties.class})
@ConditionalOnWebApplication(type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(prefix = "server.servlet.encoding",value = {"enabled"},matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {private final Encoding properties;public HttpEncodingAutoConfiguration(ServerProperties properties) {this.properties = properties.getServlet().getEncoding();}// 自动装入了容器中去@Bean@ConditionalOnMissingBeanpublic CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();filter.setEncoding(this.properties.getCharset().name());filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST));filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE));return filter;}@Beanpublic LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {return new LocaleCharsetMappingsCustomizer(this.properties);}static class LocaleCharsetMappingsCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>, Ordered {private final Encoding properties;LocaleCharsetMappingsCustomizer(Encoding properties) {this.properties = properties;}public void customize(ConfigurableServletWebServerFactory factory) {if (this.properties.getMapping() != null) {factory.setLocaleCharsetMappings(this.properties.getMapping());}}public int getOrder() {return 0;}}
}

直接修改application.properties文件进行更改

第一种方式:使用的是自己定义的过滤器,然后让系统的关闭,让自己的生效,比较麻烦;

第二种方式:就是用系统已经配置好的,我们直接修改内部参数的编码方式即可;

#让系统的CharacterEncdoingFilter生效,默认就是开启的,不写也行
server.servlet.encoding.enabled=true
#直接指定使用的编码方式
server.servlet.encoding.charset=utf-8
#直接强制request,response都使用charset属性的值
server.servlet.encoding.force=true

相关文章:

【SpringBoot】| SpringBoot 和 web组件

目录 一&#xff1a;SpringBoot 和 web组件 1. SpringBoot中使用拦截器&#xff08;重点&#xff09; 2. SpringBoot中使用Servlet 3. SpringBoot中使用过滤器&#xff08;重点&#xff09; 4. 字符集过滤器的应用 一&#xff1a;SpringBoot 和 web组件 1. SpringBoot中使…...

dflow工作流使用1——架构和基本概念

对于容器技术、工作流等概念完全不懂的情况下理解dflow的工作方式会很吃力&#xff0c;这里记录一下个人理解。 dflow涉及的基本概念 工作流的概念很好理解&#xff0c;即某个项目可以分为多个步骤&#xff0c;每个步骤可以实现独立运行&#xff0c;只保留输入输出接口&#x…...

python小游戏课程设计报告,python游戏课程设计报告

大家好&#xff0c;给大家分享一下python2048游戏课程设计报告&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01;...

使用Windbg分析从系统应用程序日志中找到的系统自动生成的dump文件去排查问题

目录 1、尝试将Windbg附加到目标进程上进行动态调试&#xff0c;但Windbg并没有捕获到 2、在系统应用程序日志中找到了系统在程序发生异常时自动生成的dump文件 2.1、查看应用程序日志的入口 2.2、在应用程序日志中找到系统自动生成的dump文件 3、使用Windbg静态分析dump文…...

后端技术趋势指南|如何选择自己的技术方向

编程多条路&#xff0c;条条通罗马 后台大佬 后台路线都是面对后台服务器业务&#xff0c;比如web后台服务器&#xff0c;视频后台服务器&#xff0c;搜索后台服务器&#xff0c;游戏后台服务器&#xff0c;直播后台服务器&#xff0c;社交IM后台服务器等等&#xff0c;大部分…...

Delphi XE的原生JSONObject如何判断键值是否存在?

【问题现象】 Delphi XE的原生JSONObject&#xff0c;取出键值的时候如下&#xff1a; //json是传入的参数&#xff0c;里面包括"food_name"等之类的键值&#xff0c;没有food_type键值 procedure XXXXFunciton(json:TJSONObject) var strFoodName,strFoodType:S…...

Go Runtime功能初探

以下内容&#xff0c;是对 运行时 runtime的神奇用法[1] 的学习与记录 目录: 1.获取GOROOT环境变量 2.获取GO的版本号 3.获取本机CPU个数 4.设置最大可同时执行的最大CPU数 5.设置cup profile 记录的速录 6.查看cup profile 下一次堆栈跟踪数据 7.立即执行一次垃圾回收 8.给变量…...

01|Oracle学习(监听程序、管理工具、PL/SQL Developer、本地网络服务介绍)

基础概念 监听程序&#xff1a;运行在Oracle服务器端用于侦听客户端请求的程序。 相当于保安&#xff0c;你来找人&#xff0c;他会拦你&#xff0c;问你找谁。他去帮你叫人过来。 配置监听程序应用场景 Oracle数据库软件安装之后没有监听程序&#xff08;服务&#xff09;…...

滴滴数据服务体系建设实践

什么是数据服务化 大数据开发的主要流程分为数据集成、数据开发、数据生产和数据回流四个阶段。数据集成打通了业务系统数据进入大数据环境的通道&#xff0c;通常包含周期性导入离线表、实时采集并清洗导入离线表和实时写入对应数据源三种方式&#xff0c;当前滴滴内部同步中心…...

VBA技术资料MF36:VBA_在Excel中排序

【分享成果&#xff0c;随喜正能量】一个人的气质&#xff0c;并不在容颜和身材&#xff0c;而是所经历过的往事&#xff0c;是内在留下的印迹&#xff0c;令人深沉而安谧。所以&#xff0c;优雅是一种阅历的凝聚&#xff1b;淡然是一段人生的沉淀。时间会让一颗灵魂&#xff0…...

Shell脚本学习3

文章目录 Shell脚本学习3函数函数定义及使用函数参数获取函数返回值 重定向输入输出重定向 其他Here Document/dev/null 文件Shell文件包含获取当前正在执行脚本的绝对路径按特定字符串截取字符串 Shell脚本学习3 函数 函数定义及使用 函数可以让我们将一个复杂功能划分成若…...

代理模式--静态代理和动态代理

1.代理模式 定义&#xff1a;代理模式就是代替对象具备真实对象的功能&#xff0c;并代替真实对象完成相应的操作并且在不改变真实对象源代码的情况下扩展其功能&#xff0c;在某些情况下&#xff0c;⼀个对象不适合或者不能直接引⽤另⼀个对象&#xff0c;⽽代理对象可以在客户…...

C++容器——list的模拟实现

目录 一.list的基本结构 二. 接下来就是对list类构造函数的设计了&#xff1a; 三.链表数据的增加&#xff1a; 四.接下来就是迭代器的创建了&#xff1a; 四.简单函数的实现&#xff1a; 五.构造与析构 六.拷贝构造和赋值重载 传统写法: 现代写法&#xff1a; 七.迭…...

VUE3 祖孙组件传值调用方法

1.在 Vue 3 中&#xff0c;你可以使用 provide/inject 来实现祖孙组件之间的传值和调用方法。 首先&#xff0c;在祖组件中使用 provide 来提供数据或方法&#xff0c;例如&#xff1a; // 祖组件 import { provide } from vue;export default {setup() {const data Hello;c…...

我的网安之路

机缘 我目前从事网安工作,一转眼我从发布的第一篇文章到现在已经过去了4年了,感慨时间过得很快 曾经我是一名Java开发工程师所以我的第一篇文章是跟开发相关的那个时候还是实习生被安排 一个很难的工作是完成地图实时定位以及根据GPS信息模拟海上追捕,这对刚入职的我来说很难 …...

langchain-ChatGLM源码阅读:webui.py

样式定制 使用gradio设置页面的视觉组件和交互逻辑 import gradio as gr import shutilfrom chains.local_doc_qa import LocalDocQA from configs.model_config import * import nltk import models.shared as shared from models.loader.args import parser from models.load…...

<C++>二、 类和对象

1.面向对象和面向过程 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c; 通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 2. C类 C…...

【HttpRunnerManager】搭建接口自动化测试平台实战

目录 一、需要准备的知识点 二、我搭建的环境 三、搭建过程 四、访问链接 五、两个问题点 【整整200集】超超超详细的Python接口自动化测试进阶教程&#xff0c;真实模拟企业项目实战&#xff01;&#xff01; 一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和…...

【adb】adb常用命令

Android Debug Bridge (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具&#xff0c;可让您与设备进行通信。adb 命令可用于执行各种设备操作&#xff0c;例如安装和调试应用。adb 提供对 Unix shell&#xff08;可用来在设备上运行各种命令&#xff09;的访问权限。它…...

SAP 委外副产品业务

SAP 委外副产品业务 1.订单bom设置数量为负 2.采购收货时&#xff0c;副产品O库存增加&#xff0c;545 O 借&#xff1a;原材料 贷&#xff1a;委外加工-发出材料 3.从O库存调拨回本地库存&#xff0c;542...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...