SpringMVC学习笔记——1
SpringMVC学习笔记——1
- 一、SpringMVC简介
- 1.1、SpringMVC概述
- 1.2、SpringMVC快速入门
- 1.3、Controller中访问容器中的Bean
- 1.4、SpringMVC关键组件的浅析
- 二、SpringMVC的请求处理
- 2.1、请求映射路径配置
- 2.2、请求数据的接收
- 2.2.1、键值对方式接收数据
- 2.2.2、封装JavaBean数据
- 2.2.3、接收JSON格式数据
- 2.2.4、接收Restful风格数据
- 2.2.5、接收上传的文件
- 2.2.6、获取header头信息和cookie信息
- 2.2.7、直接获取Requset和Session域中的数据
- 2.3、Javaweb常用对象获取
- 2.4、请求静态资源
- 2.5、注解驱动\<mvc:annotation-driven>标签
- 三、SpringMVC的响应处理
- 3.1、传统同步业务数据响应
- 3.2、前后端分离异步业务数据响应
一、SpringMVC简介
1.1、SpringMVC概述
SpringMVC是一个基于Spring开发的MVC轻量级框架,Spring3.0后发布的组件,SpringMVC和Spring可以无缝整合,使用DispatcherServlet
作为前端控制器,且内部提供了处理器映射器、处理器适配器、视图解析器等组件,可以简化JavaBean封装,Json转化、文件上传等操作。
1.2、SpringMVC快速入门
- 导入spring-mvc坐标
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.7</version>
</dependency>
- 配置前端控制器DispatcherServlet
<?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/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置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>
</web-app>
- 编写Controller,配置映射路径,并交给SpringMVC容器管理
@Controller
public class QuickController {@RequestMapping("/show")private void show(){System.out.println("show running...");}
}
1.3、Controller中访问容器中的Bean
- 创建Bean
@Service
public class QuickServiceImpl implements QuickService {
}
- 用spring-xml文件扫描包含该Bean的包
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
"><!--组件扫描--><context:component-scan base-package="com.Smulll.Service"/>
</beans>
- 在Web-xml文件中配置ContextLoaderListener
<!--配置ContextLoaderlistener-->
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
- 在Controller中访问容器中的Bean
@Controller
public class QuickController {/*直接注入Service进行使用*/@Autowiredprivate QuickService quickService;
}
1.4、SpringMVC关键组件的浅析
上面已经完成的快速入门的操作,也在不知不觉中完成的Spring和SpringMVC的整合,我们只需要按照规则去定义Controller和业务方法就可以。但是在这个过程中,肯定是很多核心功能类参与到其中,这些核心功能类,一般称为组件。当请求到达服务器时,是哪个组件接收的请求,是哪个组件帮我们找到的Controller,是哪个组件帮我们调用的方法,又是哪个组件最终解析的视图?
组件 | 描述 | 常用组件 |
---|---|---|
处理器映射器:HandlerMapping | 匹配映射路径对应的Handler,返回可执行的处理器链对象HandlerExecutionChain对象 | RequestMappingHandlerMapping |
处理器适配器:HandlerAdapter | 匹配HandlerExecutionChain对应的适配器进行处理器调用,返回视图模型对象 | RequestMappingHandlerAdapter |
视图解析器:ViewResolver | 对视图模型对象进行解析 | InternalResourceViewResolver |
二、SpringMVC的请求处理
2.1、请求映射路径配置
配置映射路径,映射器处理器才能找到Controller的方法资源,目前主流映射路径配置方式就是@RequestMapping
相关注解 | 作用 | 使用位置 |
---|---|---|
@RequestMapping | 设置控制器方法的访问资源路径,可以接收任何请求 | 方法和类上 |
@GetMapping | 设置控制器方法的访问资源路径,可以接收GET请求 | 方法和类上 |
@PostMapping | 设置控制器方法的访问资源路径,可以接收POST请求 | 方法和类上 |
- 当给类加了@RequestMapping,想要访问某个方法就必须要在虚拟地址上加入类的RequestMapping名以及方法的RequestMapping名
@Controller
@RequestMapping("/quick")
public class QuickController {/*直接注入Service进行使用*/@Autowiredprivate QuickService quickService;//使用GET方法获取数据//@RequestMapping(value = {"/show","/showaaa"},method = RequestMethod.GET)@GetMapping("/show")//当给类加了@RequestMapping("/quick"),想访问show方法就必须要 虚拟地址+quick/showprivate String show(){System.out.println("show running..."+quickService);return "/index.jsp";}
}
2.2、请求数据的接收
2.2.1、键值对方式接收数据
接收普通请求数据,当客户端提交的数据是普通键值对形式时,直接使用同名形参接收即可
@Controller
public class ParamController { //http://localhost:8080/SpringMVCDome1/Param4?username=zhangsan&age=12&hobby=football@RequestMapping("/Param4")public String Param4(@RequestParam Map<String,String> map){map.forEach((k,v)->{System.out.println(k+v);});return "index.jsp";}//http://localhost:8080/SpringMVCDome1/Param4?hobby=pingpang&hobby=football&hobby=basketball@RequestMapping("/Param3")public String Param3(@RequestParam List<String> hobby){for (String s : hobby) {System.out.println(s);}return "index.jsp";}//http://localhost:8080/SpringMVCDome1/Param4?hobby=pingpang&hobby=football&hobby=basketball@RequestMapping("/Param2")public String Param2(String[] hobby){for (String s : hobby) {System.out.println(s);}return "index.jsp";}//http://localhost:8080/SpringMVCDome1/Param4?username=zhangsan&age=23@RequestMapping("/Param1")public String Param1(@RequestParam("username") String name, int age){System.out.println(name+age);return "index.jsp";}
}
- @RequestParam可以使获取的数据不创建对象而是直接注入形参,因此使用该注解可以使得参数不一样而注入
- @RequestParam有三个属性
- value:要注入参数的名字
- required:该数据是否必须注入
- true:是
- false:否(默认)
- defaultValue:当数据未提交时的默认值
2.2.2、封装JavaBean数据
接收实体JavaBean属性数据,单个JavaBean数据:提交的参数名称只要与Java的属性名一致,就可以进行自动封装
username=haohao&age=35&hobbies=eat&hobbies=sleep
public class User{private string username ;private Integer age;private String [] hobbies;private Date birthday;private Address address;// ...省略get和set方法
}
@GetMapping("/show")
pubiic string show(User user){system.out.println(user);return "/index.jsp" ;
}
2.2.3、接收JSON格式数据
- 使用POST请求方式,添加@RequestBody可以使json格式字符串整体打印出来,不会被解析
@PostMapping("/Param5")
public String Param5(@RequestBody String body) {System.out.println(body);return "index.jsp";
}
使用Json工具 ( jackson )将Json格式的字符串转化为JavaBean进行操作
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>
@PostMapping ("/show" )
public string show(@RequestBody string body) throws IOException {system.out.println(body);//获得objectMapperObjectMapper objectMapper = new ObjectMapper();//将json格式字符串转化成指定的UserUser user = objectMapper.readValue(body,User.class);System.out.println(user);return "/index.jsp";
}
- 配置HandlerAdapter可以自动执行转换的工作
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean></list></property>
</bean>
@PostMapping ("/show" )
public string show(@RequestBody User user) throws IOException {System.out.println(user);return "/index.jsp";
}
2.2.4、接收Restful风格数据
什么是Rest风格?
Rest (Representational State Transfer)表象化状态转变(表述性状态转变),在2000年被提出,基于HTTP、URI
、xml、JSON等标准和协议,支持轻量级、跨平台、跨语言的架构设计。是Web服务的一种新网络应用程序的设计风格和开发方式。
Restful风格的请求,常见的规则有如下三点:
用URI表示某个模块资源,资源名称为名词;
模板 | URI资源 |
---|---|
用户模块user | http://localhost/user |
商品模块product | http://localhost/product |
账户模块account | http://localhost/account |
日志模块log | http://localhost/log |
用请求方式表示模块具体业务动作,例如:GET表示查询、POST表示插入、PUT表示更新、DELETE表示删除
URI资源 | 请求方式 | 参数 | 解释 |
---|---|---|---|
http://localhost/user/100 | GET | 存在URL地址中:100 | 查询id=100的User数据 |
http://localhost/user | POST | 存在请求体中Json: {“username”:“haohao” ,“age”:18} | 插入user数据 |
http://localhost/user | PUT | 存在请求体中Json : {“id”:100,“username”:“haohao” , “age”:18} | 修改id=100的User数据 |
http://localhost/user/100 | DELETE | 存在URL地址中:100 | 删除id=100的User数据 |
http://localhost/product/5 | GET | 存在URL地址中:5 | 查询id=5的Product数据 |
http://localhost/product | POST | 存在请求体中Json: {“proName”:“小米手机” ,“price”:1299} | 插入Product数据 |
http://localhost/product | PUT | 存在请求体中Json : {“id”:5,“proName”:“小米手机” ,“price”:1299} | 修改id=5的Product数据 |
http://localhost/product/5 | DELETE | 存在URL地址中:5 | 删除id=5的Product数据 |
- 用HTTP响应状态码表示结果,国内常用的响应包括三部分:状态码、状态信息、响应数据
{"code":200,"message":"成功","data":{"username":"haohao","age":18}
}
{"code":300,"message":"执行错误","data":"",
}
接收Restful风格数据,Restful请求数据一般会在URL地址上携带,可以使用注解@PathVariable
(占位符参数
名称)
http://localhost/user/100
@PostMapping ("/user/{id}")
public string findUserById(@Pathvariable("id") Integer id){system.out.println(id);return "/index.jsp";
}
请求URL资源地址包含多个参数情况
http://localhost/user/haohao/18
@PostMapping ("/user/{username}/{age}")
public string findUserById(@Pathvariable("username") String username,@Pathvariable("age") Integer age){system.out.println(username+"=="+age);return "/index.jsp";
}
2.2.5、接收上传的文件
接收文件上传的数据,文件上传的表单需要一定的要求,如下:
- 表单的提交方式必须是POST
- 表单的enctype属性必须是multipart/form-data
- 文件上传项需要有name属性
<form action="" enctype="multipart/form-data" method="post"><input type="file" name="myFile">
</form>
http://localhost:8080/SpringMVCDome1/Param6
@PostMapping("/Param6")
public String Param6(@RequestBody MultipartFile myFile) {System.out.println(myFile);return "/index.jsp";
}
服务器端,由于映射器适配器需要文件上传解析器,而该解析器默认未被注册,所以手动注册
<!--配置文件上传解析器,注意:id的名字是固定写法-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="UTF-8"/><!--文件的编码格式默认是Iso8859-1--><property name="maxUploadSizePerFile" value="1048576"/><!--上传的每个文件限制的大小单位字节--><property name="maxUploadSize" value="3145728"/><!--上传文件的总大小--><property name="maxInMemorySize" value="1048576"/><!--上传文件的缓存大小-->
</bean>
而CommonsMultipartResolver底层使用的Apache的是Common-fileuplad等工具API进行的文件上传
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
</dependency>
@PostMapping("/Param6")
public String Param6(@RequestBody MultipartFile myFile) throws IOException {System.out.println(myFile);//将上传的文件进行保存//1、获取当前上传的文件的输入流InputStream inputStream = myFile.getInputStream();//2、获得上传文件位置的输出流OutputStream outputStream = new FileOutputStream("D:\\"+"aaa");//3、执行文件拷贝IOUtils.copy(inputStream,outputStream);outputStream.close();inputStream.close();return "/index.jsp";
}
2.2.6、获取header头信息和cookie信息
接收Http请求头数据,接收指定名称的请求头
GetMapping ("/headers")
public string headers(@RequestHeader("Accept-Encoding") String acceptEncoding){System.out.println ( "Accept-Encoding:"+acceptEncoding);return "/index.jsp";
接收所有的请求头信息
@GetMapping ( "/ headersMap" )
public string headersMap(@RequestHeader Map<String,string> map){map.forEach((k, v)->{system.out.println(k+":"+V);});return " /index.jsp" ;
获得客户端携带的Cookie数据
GetMapping("/cookies")
public String cookies(@CookieValue(value = "JSESSIONID",defaultValue = "") String jsessionid){system.out.println(jsessionid);return "/index.jsp" ;
}
2.2.7、直接获取Requset和Session域中的数据
获得转发Request域中数据,在进行资源之间转发时,有时需要将一些参数存储到request域中携带给下一个资源
GetMapping ("/request1")
public string request1(HttpServletRequest request) {//存储数据request.setAttribute("username","haohao");return "/request2";
}
GetMapping ("/request2")
public string request2(@RequestAttribute("username") String username) {system.out.println(username);return "/index.jsp";
}
2.3、Javaweb常用对象获取
直接打印参数request和response,可以发现这两个参数是SpringMVC自动传入的
@GetMapping("/Param10")
public String Param10(HttpServletRequest request, HttpServletResponse response) {System.out.println(request);System.out.println(response);return "/index.jsp";
}
2.4、请求静态资源
在Spring-MVC框架下,无法直接访问到web文件下的静态资源
静态资源请求的三种解决方案:
- 第一种方案,可以再次激活Tomcat的DefaultServlet,Servlet的url-pattern的匹配优先级是:精确匹配>目录匹配>扩展名匹配>缺省匹配,所以可以指定某个目录下或某个扩展名的资源使用DefaultServlet进行解析:
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/img/*</url-pattern>
</servlet-mapping>
- 第二种方式,在spring-mvc.xml中去配置静态资源映射,匹配映射路径的请求到指定的位置去匹配资源
<!--mapping是映射资源路径,location是对应资源所在的位置-->
<mvc:resources mapping="/img/*" location="/img/" />
<mvc:resources mapping="/css/*" location="/css/" />
<mvc:resources mapping="/css/*" location="/js/" />
<mvc:resources mapping="/html/*" location="/html/" />
- 第三种方式,在spring-mvc.xml中去配置
<mvc:default-servlet-handler >
,该方式是注册了一个
DefaultServletHttpRequestHandler处理器,静态资源的访问都由该处理器去处理,这也是开发中使用最多的
<mvc:default-servlet-handler/>
2.5、注解驱动<mvc:annotation-driven>标签
该标签内部会帮我们注册RequestMappingHandlerMapping、注册RequestMappingHandlerAdapter并注入Json消息转换器等,上述配置就可以简化成如下:
<!--mvc注解驱动-->
<mvc:annotation-driven/>
<!--配置DefaultServletHttpRequestHandler-->
<mvc:default-servlet-handler/>
PS: <mvcannotation-driven>
标签在不同的版本中,帮我们注册的组件不同,Spring 3.0.X版本注册是
DefaultAnnotationHandlerMapping
和AnnotationMethodHandlerAdapter
,由于框架的发展,从Spring 3.1.X开始注册组件变为RequestMappingHandlerMapping
和RequestMappingHandlerAdapter
.
三、SpringMVC的响应处理
3.1、传统同步业务数据响应
Spring的接收请求的部分我们讲完了,下面在看一下Spring怎么给客户端响应数据,响应数据主要分为两大部分:
- 传统同步方式:准备好模型数据,在跳转到执行页面进行展示,此方式使用越来越少了,基于历史原因,一些旧项目还在使用;
- 前后端分离异步方式:前端使用Ajax技术+Restful风格与服务端进行Json格式为主的数据交互,目前市场上几乎都是此种方式了。
传统同步业务数据响应
- 请求资源转发
- 请求资源重定向
- 响应模型数据
- 直接回写数据给客户端
- 转发的关键字
forword
- 重定向的关键字
redirect
通过视图模型的方式进行转发数据
@Controller
public class QuickController1 {@GetMapping("/res1")//当给类加了@RequestMapping("/quick"),想访问show方法就必须要 虚拟地址+quick/showprivate ModelAndView show(ModelAndView modelAndView){User user = new User();user.setUsername("zhangsan");user.setAge(18);user.setGender('男');modelAndView.addObject("user",user);modelAndView.setViewName("/index.jsp");return modelAndView;}
}
直接回写字符串
需要使用Tomcat8
@RequestMapping("/res2")
@ResponseBody//告诉SpringMVC返回的字符串不是视图名,是以响应体方式响应的数据
public String res2(){return "hello,world";
}
3.2、前后端分离异步业务数据响应
其实此处的回写数据,跟上面回写数据给客户端的语法方式一样,只不过有如下一些区别:
- 同步方式回写数据,是将数据响应给浏览器进行页面展示的,而异步方式回写数据一般是回写给Ajax引擎的,即谁访问服务器端,服务器端就将数据响应给谁
- 同步方式回写的数据,一般就是一些无特定格式的字符串,而异步方式回写的数据大多是Json格式字符串
回写普通数据使用@ResponseBody
标注方法,直接返回字符串即可,此处不在说明;
回写Json格式的字符串,即将直接拼接Json格式的字符串或使用工具将JavaBean转换成Json格式的字符串回写
@GetMapping("/response3")
@ResponseBody
public string response3(HttpServletResponse response){return "{\"username\":\"haohaol\",\"age\":18}";
}
@GetMapping("/response4")
@ResponseBody
public string response4() throws JsonProcessingException {//创建JavaBeanUser user = new User();user.setUsername("haohao");user.setAge(18);//使用Jackson转换成json格式的字符串String json = new objectMapper().writevalueAsString(user);return json;
}
使用@RestController 相当于@ResponseBody和@Controller结合
相关文章:

SpringMVC学习笔记——1
SpringMVC学习笔记——1 一、SpringMVC简介1.1、SpringMVC概述1.2、SpringMVC快速入门1.3、Controller中访问容器中的Bean1.4、SpringMVC关键组件的浅析 二、SpringMVC的请求处理2.1、请求映射路径配置2.2、请求数据的接收2.2.1、键值对方式接收数据2.2.2、封装JavaBean数据2.2…...

20230908_python练习_selenium模块爬取网页小说练习
霍比特人小说爬取,使用 selenium 模块调用谷歌浏览器,无界面模式爬取小说网站信息,将数据按照每次2000字符在mysql中保存。 # https://www.shukuai9.com/b/324694/ # 导入需要的库 from selenium import webdriver # 导入Keys模块ÿ…...

Python:安装Flask web框架hello world示例
安装easy_install pip install distribute 安装pip easy_install pip 安装 virtualenv pip install virtualenv 激活Flask pip install Flask 创建web页面demo.py from flask import Flask app Flask(__name__)app.route(/) def hello_world():return Hello World! 2023if _…...

深度解析NLP文本摘要技术:定义、应用与PyTorch实战
目录 1. 概述1.1 什么是文本摘要?1.2 为什么需要文本摘要? 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 多文档摘要3.3 信息性摘要 vs. 背景摘要3.4 实时摘要 4. 主要类型4.1 抽取…...

zabbix监控多实例redis
Zabbix监控多实例Redis 软件名称软件版本Zabbix Server6.0.17Zabbix Agent5.4.1Redis6.2.10 Zabbix客户端配置 编辑自动发现脚本 vim /usr/local/zabbix/scripts/redis_discovery.sh #!/bin/bash #Fucation:redis low-level discovery #Script_name redis_discovery.sh red…...

win11将visual studio 2022的调试控制台改为windows terminal
一、前言 默认的调试控制台太丑了,字体也没有好看的,还是更喜欢windows terminal 二、修改 2.1 修改之前 2.2 修改步骤 打开windows terminal点这个向下的标志 选择settings按照下图1, 2, 3步骤依次操作即可 2.3 修改之后 总结 漂亮很多了...
社区问答精选——长安链开发知多少?(8月)
本文是根据社群内开发者较为关注的问题进行整理,希望可以帮助开发者解决所遇到的问题。有更多问答在社区issue中描述更为细致,开发者提问前可以先按照关键词进行搜索。欢迎各位开发者按照问答template提交issue,也欢迎有意愿的开发者参与到社…...
神经网络-Unet网络
文章目录 前言1.seq2seq 编码后解码2. 网络结构3.特征融合4. 前言 Unet用来做小目标语义分割。 优点:网络结构非常简单。 大纲目录 2016年特别火,在细胞领域做分割特别好。 1.seq2seq 编码后解码 2. 网络结构 几个卷积层,越来越扁&#x…...
Java | 多线程综合练习
不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始,不如现在行动! 文章目录 🌴前言🌴一、卖电影票1.题目2.分析3.代码 🌴二、送礼物1. 题目2. 分析3.代码 🌴三.打印奇数1. 题目2.…...

Kotlin变量与控制条件的基本用法
一、变量与控制条件 1、var与val var:可修改变量 val:只读变量,只读变量并非绝对只读。 编译时常量只能在函数之外定义,因为函数内常量是在运行时赋值,编译时常量要在变量赋值前存在。并且值是无法修改的。 const…...

第18章_瑞萨MCU零基础入门系列教程之GPT
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...

openssl websockets
1. HTTPS通信的C实现 - 知乎 GitHub - Bwar/Nebula: Nebula is a powerful framwork for building highly concurrent, distributed, and resilient message-driven applications for C....
Vue 组件的单元测试
1、基本的示例 单元测试是软件开发非常基础的一部分。单元测试会封闭执行最小化单元的代码,使得添加新功能和追踪问题更容易。Vue 的单文件组件使得为组件撰写隔离的单元测试这件事更加直接。它会让你更有信心地开发新特性而不破坏现有的实现,并帮助其他…...

海底两万里的思维导图,轻松了解整体的内容
《海底两万里》是一部经典的科幻小说。小说以其丰富的想象力和对海底世界的描绘而闻名于世。今天我们就用思维导图的分支介绍这个作品到底讲了什么。(思维导图示例:迅捷画板) 《海底两万里》是“凡尔纳三部曲”中的第二部(其它两部…...

ZABBIX 6.4官方安装文档
一、官网地址 Zabbix:企业级开源监控解决方案 二、下载 1.选择您Zabbix服务器的平台 2. Install and configure Zabbix for your platform a. Install Zabbix repository # rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/8/x86_64/zabbix-release-6.4-1.el8…...

本地MQTT服务器搭建(EMQX)
一、下载EMQX 下载地址:EMQ (emqx.com) 打开官网后,选择右边的免费试用按钮 然后单击EMQX Enterprise标签,然后选择下面的EMQX开源版,选择开源版的系统平台为Windows,单击免费下载。 在新页面下单击立即下载 二、安装…...
Docker启动pandora并指定ACCESS TOKEN
把chatGPT_ACCESS_TOKEN改成你的ACCESS_TOKEN 《chatGPT ACCESS TOKEN获取地址(需要魔法)》 docker run -d -m 512m -p 88:88 --privilegedtrue -e PANDORA_SERVER0.0.0.0:88 -e PANDORA_ACCESS_TOKENchatGPT_ACCESS_TOKEN --name pandora pengzhile/pa…...

Python + Jmeter 实现自动化性能压测
Step01: Python脚本开发 文件路径:D://wl//testproject//Fone-grpc//project1//test_client.py Python 脚本作用: 通过 grpc 调用底层 c 的接口,做数据库的数据插入与查询操作,然后将返回的结果进行拼接与输出。 2.代码里面将…...

【Linux进行时】进程状态
进程状态: ❓假设我们在上课,在B站上上课,请问我们的B站是不是一直运行呢?💡不是的! ❓假设我们同时打开了B站和PDF阅读器时,是怎么运行的呢? 💡每一个进程在CPU跑一会&a…...

HarmonyOS开发环境搭建
一 鸿蒙简介: 1.1 HarmonyOS是华为自研的一款分布式操作系统,兼容Android,但又区别Android,不仅仅定位于手机系统。更侧重于万物物联和智能终端,目前已更新到4.0版本。 1.2 HarmonyOS软件编程语言是ArkTS,…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...