Spring Boot 的Web开发

Spring Boot 的Web开发

 

 

 

一、 静态资源映射规则

 总结:

只要静态资源放在类路径下: called /static (or /public or /resources or /METAINF/resources

访问 : 当前项目根路径/ + 静态资源名

二、 enjoy模板引擎

        Enjoy模板引擎是一个轻量级的 Java 模板引擎,主要用于生成动态 HTML 内容。它的设计目标是简化 Java Web 应用中的页面渲染过程,同时保持高效和灵活。Enjoy模板引擎使用一种简单的语法,适用于 Java 开发者,用于创建和渲染模板。

(1)将页面保存在templates目录下

<!DOCTYPE html>
<html lang="cn" xmlns:th="http://www.thymeleaf.org">
<head><title>Title</title>
</head>
<body><h1>springMVC控制器方法参数作用:接受用户请求中的数据</h1><hr/><h3>基本类型和 String 类型作为参数</h3><a href="/one/show1?msg1=9527">发送请求1</a><a href="/one/show2?msg1=jdk&msg2=9527">发送请求2</a><h3>POJO 类型作为参数</h3><a href="/one/show3?eid=7&ename=钟无艳&esex=女">发送请求3</a><form action="/one/show4" method="post">员工编号:<input type="text" name="eid" ><br/>员工姓名:<input type="text" name="ename" ><br/>员工性别:<input type="text" name="esex" ><br/>部门编号:<input type="text" name="dept.did" ><br/>部门名称:<input type="text" name="dept.dname" ><br/><input type="submit" value="发送请求4"/></form><form action="/one/map" method="post">员工编号:<input type="text" name="eids"><br/>员工姓名:<input type="text" name="enames"><br/>员工性别:<input type="text" name="esexs"><br/><input type="submit" value="发送请求4(map)"/></form><h3>POJO 类中包含集合类型参数</h3><form action="/one/show5" method="post">部门编号:<input type="text" name="did" ><br/>部门名称:<input type="text" name="dname" ><br/>员工编号1:<input type="text" name="mylist[0].eid" ><br/>员工姓名1:<input type="text" name="mylist[0].ename" ><br/>员工性别1:<input type="text" name="mylist[0].esex" ><br/>员工编号2:<input type="text" name="mylist[1].eid" ><br/>员工姓名2:<input type="text" name="mylist[1].ename" ><br/>员工性别2:<input type="text" name="mylist[1].esex" ><br/>员工编号3:<input type="text" name="myMap['one'].eid" ><br/>员工姓名3:<input type="text" name="myMap['one'].ename" ><br/>员工性别3:<input type="text" name="myMap['one'].esex" ><br/>员工编号4:<input type="text" name="myMap['two'].eid" ><br/>员工姓名4:<input type="text" name="myMap['two'].ename" ><br/>员工性别4:<input type="text" name="myMap['two'].esex" ><br/><input type="submit" value="发送请求5"/></form><a href="/one/show6?nums=123&nums=456&nums=789">发送请求6</a><h3>使用 ServletAPI 对象作为方法参数</h3><a href="/one/show7">发送请求7</a></body>
</html>
<!DOCTYPE html>
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>spring成功页面</h1>
</body>
</html>

(2)添加坐标

  <dependency><groupId>com.jfinal</groupId><artifactId>enjoy</artifactId><version>5.0.3</version></dependency>

(3)开启配置

在代码中配置 Enjoy 模板引擎,例如设置模板目录和引擎名称。一般来说,可以在应用程序的启动类中进行配置:

package com.apesource.springboot_web_02.config;import com.jfinal.template.Engine;
import com.jfinal.template.ext.spring.JFinalViewResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @version 1.0* @Author 王老师* @since 2023/4/11*/
@Configuration
public class SpringBootConfig {@Bean(name = "jfinalViewResolver")public JFinalViewResolver getJFinalViewResolver() {// 创建用于整合 spring boot 的 ViewResolver 扩展对象JFinalViewResolver jfr = new JFinalViewResolver();// 对 spring boot 进行配置jfr.setSuffix(".html");jfr.setContentType("text/html;charset=UTF-8");jfr.setOrder(0);// 设置在模板中可通过 #(session.value) 访问 session 中的数据jfr.setSessionInView(true);// 获取 engine 对象,对 enjoy 模板引擎进行配置,配置方式与前面章节完全一样Engine engine  = JFinalViewResolver.engine;// 热加载配置能对后续配置产生影响,需要放在最前面engine.setDevMode(true);// 使用 ClassPathSourceFactory 从 class path 与 jar 包中加载模板文件engine.setToClassPathSourceFactory();// 在使用 ClassPathSourceFactory 时要使用 setBaseTemplatePath// 代替 jfr.setPrefix("/view/")engine.setBaseTemplatePath("/templates/");// 更多配置与前面章节完全一样// engine.addDirective(...)// engine.addSharedMethod(...);return jfr;}
}

(4)编写代码

三、 springMVC

(1)请求处理

在 Spring MVC 中,请求处理一般由控制器(Controller)来完成。你可以通过 @RequestMapping 注解定义请求的 URL 映射。

@Controller
@RequestMapping("/one")
public class OneController {/*** 进入one.html页面* */@RequestMapping("/show")public String show(){return "one";}
}

(2)参数绑定

Spring MVC 允许你将请求参数绑定到方法的参数中,例如 Java 对象、基本数据类型或集合。

@Controller
@RequestMapping("/one")
public class OneController {/*** 进入one.html页面* */@RequestMapping("/show")public String show(){return "one";}/***********************基本类型和 String 类型作为参数*********************************/@RequestMapping("/show1")public String show1(String msg1){System.out.println("=====接受到用户发送数据为:"+msg1+"=======");return "success";}@RequestMapping("/show2")public String show2(String msg1,int msg2){System.out.println("=====接受到用户发送数据为:"+msg1+"=======");System.out.println("=====接受到用户发送数据为:"+msg2+"=======");return "success";}}
2.POJO类型参数:
                 包括实体类,以及关联的实体类
3.数组和集合类型参数:
                  包括 List 结构和 Map 结构的集合(包括数组)
 4.使用 ServletAPI 对象作为方法参数
          HttpServletRequest
         HttpServletResponse
        HttpSession
          java.security.Principal
          Locale
          InputStream
          OutputStream
          Reader
          Writer
  二.使用要求
     1.发送请求中携带数据的key与方法参数的name必须一致
     2.数据类型合法
/***********************POJO 类型作为参数*********************************///单一对象@RequestMapping("/show3")public String show3(Emp emp){System.out.println("=====接受到用户发送数据为:"+emp+"=======");return "success";}//对象嵌套@RequestMapping("/show4")public String show4(Emp emp){System.out.println("=====接受到用户发送数据为:"+emp+"=======");return "success";}//@RequestParam@RequestMapping("/map")public String map(@RequestParam Map map){System.out.println(map);return "success";}/*********************POJO 类中包含集合类型参数*********************************/@RequestMapping("/show5")public String show5(Dep dep){System.out.println("=====接受到用户发送数据为:"+dep+"=======");return "success";}@RequestMapping("/show6")public String show8(int[] nums){System.out.println("=====接受到用户发送数据为:"+ Arrays.toString(nums) +"=======");return "success";}/*********************使用 ServletAPI 对象作为方法参数*********************************/@RequestMapping("/show7")public String show7(HttpServletRequest request, HttpServletResponse response){//        request.setCharacterEncoding("UTF-8");
//        response.setCharacterEncoding("UTF-8");System.out.println(request);System.out.println(response);request.getParameter("msg1");HttpSession session =     request.getSession();System.out.println(session);session.setAttribute("","");try {response.sendRedirect("重定向");} catch (IOException e) {e.printStackTrace();}ServletContext applaction =  session.getServletContext();return "success";}

(3)常用注解

在 Spring MVC 中,有一些常用注解可以帮助简化开发过程:

  • @Controller:标记一个类为控制器。
  • @RequestMapping:映射 HTTP 请求到特定方法。
  • @GetMapping@PostMapping:分别用于处理 GET 和 POST 请求的快捷方式。
  • @RequestParam:将请求参数绑定到方法参数。
  • @PathVariable:从 URI 模板中提取变量并绑定到方法参数。
  • @RequestBody:将请求体的内容绑定到对象。
  • @ResponseBody:将方法返回的对象直接写入 HTTP 响应体。
  • @ModelAttribute:将请求参数绑定到模型对象。

一.@RequestParam
      作用:
          把请求中指定名称的参数给控制器中的形参赋值。
          如果页面标签名称和方法参数名称不一致,可以使用此注解实现
      属性:
          name属性:设置参数名称
          defaultValue属性:设置默认值
          required属性:设置是否为必传

/*** @RequestParam("名称必须与页面标签或者url地址key名称一致")* */@RequestMapping("/show1")public String show1(@RequestParam(name="msg1") String msg){System.out.println("=====接受到用户发送数据为:"+msg+"=======");return "success";}@RequestMapping("/show2")public String show2(@RequestParam("msg1") String msg, @RequestParam("msg2") int num){System.out.println("=====接受到用户发送数据为:"+msg+"=======");System.out.println("=====接受到用户发送数据为:"+num+"=======");return "success";}@RequestMapping("/show3")public String show4(@RequestParam(name = "uname",defaultValue = "暂无用户") String name){System.out.println("账号:"+name);return "success";}

 二.@RequestBody
      作用:
          用于获取"请求体"内容。直接使用得到是 key=value&key=value...
          结构的数据,并可以转换为对象
      属性:
          required:是否必须有请求体。默认值是:true。

/*** 前后端分离* @RequestBody可以将json ===》 javaBean* 注意:*  1.前端不能使用GET方式提交数据,GET方式无请求体* {* 	"eid":101,* 	"ename":"詹姆斯邦德",* 	"esex":"绅士"* }** * */@RequestMapping("/show4")public String show4(@RequestBody Emp emp){System.out.println("=========="+emp+"==========");return "success";}

 三.@PathVaribale
      作用:
          用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},
          这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之
          后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志
      属性:
          value:用于指定 url 中占位符名称。
          required:是否必须提供占位符。

@PostMapping("/show5/{uname}/{pwd}")public String show5(@PathVariable("uname") String msg1, @PathVariable("pwd") String msg2){System.out.println(msg1);System.out.println(msg2);return "success";}@PostMapping("/show6/{uname}/{pwd}")public String show6(@PathVariable String uname, @PathVariable String pwd){System.out.println(uname);System.out.println(pwd);return "success";}

  Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
  主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,
  更易于实现缓存机制等。

  Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
       GET:用于获取资源
       POST:用于新建资源
       PUT:用于更新资源
       DELETE:用于删除资源
例如:
新增   POST    http://localhost:8080/user/用户名/用户密码/用户性别
查询   GET     http://localhost:8080/user/用户ID
删除   delete  http://localhost:8080/user/用户ID
修改   put     http://localhost:8080/user/用户ID/用户名/用户密码/用户性别

localhost:8080/login?uname=王老师&upwd=123
localhost:8080/login/王老师/123

(4)数据传递

在 Spring MVC 中,你可以通过模型对象来传递数据到视图。通常用 Model 或 ModelAndView 类。

 1.页面跳转重定向
  • redirect:表示浏览器执行重定向,会改变浏览器地址栏的URL。

  • forward:表示请求转发,URL不改变,还是原来的URL。

  • 返回的字符串值(如"index""success_String")通常会对应于Spring MVC的视图解析器配置,决定最终渲染的视图。

根据需要的行为选择使用重定向或转发,合适的设计将有助于提升用户体验和应用性能。

package com.xn.springboot_web_04.controller;import com.xn.springboot_web_04.pojo.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;/*** 返回值为:字符串* */
@Controller
@RequestMapping("/string")
public class StringController_01 {/*** 进入首页* */@RequestMapping("/show")public String show(){return "index";}/** 充当试图的逻辑名称,默认页面跳转为请求转发方式* */@RequestMapping("/show1")public String show1(){System.out.println("=========show1=========");return "success_String";}/** 作充当一次请求转发或重定向* */@RequestMapping("/show2")public String show2(){System.out.println("=========show2=========");return "redirect:show1";}@RequestMapping("/show3")public String show3(){System.out.println("=========show3=========");return "forward:show1";}@RequestMapping("/show4")public String show4(HttpServletRequest request){System.out.println("=========show4=========");//1.查询数据库(模拟)Emp emp = new Emp(1,"张毅老师","男");//2.获取sessionrequest.getSession().setAttribute("emp",emp);return "success_String";}}
 2、 json格式转换

@RestController 是一个在 Spring Framework 中常用的注解,主要用于简化 RESTful Web 服务的开发。它结合了 @Controller 和 @ResponseBody 的作用。以下是 @RestController 的一些关键点和特点:

1. 意义与用途

  • @RestController 注解用于定义一个控制器,处理 HTTP 请求并返回 JSON/XML 格式的响应体。这在构建 RESTful API 时非常有用。

  • 当一个类被标注为 @RestController,这个类中的每个方法默认为返回 JSON 或 XML 响应,而不是渲染视图。

@Controller
@RequestMapping("/json")
public class JsonController_02 {/**** @ResponseBody   对象====>json*  位置:1.类*      2.方法*** @RequestBody    json====>对象* 位置:方法参数** @RestController   =  @Controller  +  @ResponseBody** */@RequestMapping("/show1")@ResponseBodypublic List<Emp> show1(){//1模拟数据库Emp emp1 = new Emp(1,"张毅老师","男");Emp emp2 = new Emp(2,"张毅老师","男");Emp emp3 = new Emp(3,"张毅老师","男");List<Emp> list = new ArrayList<>();list.add(emp1);list.add(emp2);list.add(emp3);return list;}@RequestMapping("/show2")@ResponseBodypublic String show2(){return "helloWorld";}}

自动响应
  • 方法返回的对象会自动转换为 JSON(或 XML,取决于请求的 Accept 头)并写入 HTTP 响应体中,而不需要显式使用 @ResponseBody 注解。

(5)文件上传

方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)
 <!-- 文件上传 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency>
@Controller
public class UserController {//进入测试页面@RequestMapping("/show")public String show(){return "index";}//文件上传@RequestMapping("/fileupload")public String fileupload(String uname, MultipartFile upic, HttpServletRequest request){System.out.println("用户名:"+uname);System.out.println(upic);System.out.println(upic.getOriginalFilename());System.out.println(upic.getName());}
}
 方式2.文件服务器(七牛云)
 <!-- 导入七牛云需要坐标 --><dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.25</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.2</version><scope>compile</scope></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version><scope>compile</scope></dependency><dependency><groupId>com.qiniu</groupId><artifactId>happy-dns-java</artifactId><version>0.1.6</version><scope>test</scope></dependency><!-- 文件上传 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency>
@Controller
public class UserController {//进入测试页面@RequestMapping("/show")public String show(){return "index";}//文件上传@RequestMapping("/fileupload")public String fileupload(String uname, MultipartFile upic, HttpServletRequest request){System.out.println("用户名:"+uname);System.out.println(upic);System.out.println(upic.getOriginalFilename());System.out.println(upic.getName());//方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)//方式2.文件服务器(七牛云)//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.autoRegion());//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);//...生成上传凭证,然后准备上传String accessKey = "Lo5tVZ7DcrNNVMWCaq4wPosNdrAbRv5aKGldQ__l";String secretKey = "N2wIAm84WQXAz63RVI82AFa81j03afQnmg4ekZMz";String bucket = "xiaobainn";//默认不指定key的情况下,以文件内容的hash值作为文件名String key = "2024/2.jpg";String name = null;try {byte[] uploadBytes = upic.getBytes();Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);try {Response response = uploadManager.put(uploadBytes, key, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);//获取文件名System.out.println(putRet.hash);//获取文件hash值name = putRet.key;} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}} catch (Exception ex) {//ignore}request.getSession().setAttribute("picname",name);return "success";}
}

 

六、注册Servlet三大组件 Servlet/Filter/Listener

而由于 Spring Boot 默认是以 jar 包的方式运行嵌入式Servlet容器来启动应用,没有web.xml文件, Spring提供以下Bean来注册三大组件

ServletRegistrationBean                 注册自定义

Servlet FilterRegistrationBean        注册自定义Filter

ServletListenerRegistrationBean    注册自定义Listener

@WebFilter(urlPatterns = {"/*"})
public class MyFilter implements Filter{public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("============请求过滤");request.setCharacterEncoding("utf-8");//分水岭chain.doFilter(request, response);response.setCharacterEncoding("utf-8");System.out.println("============响应过滤");}}
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {System.out.println("进入servlet");resp.getWriter().println("<h1>hello world</h1>");};@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

@WebListener
public class MyListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {ServletContextListener.super.contextInitialized(sce);System.out.println("-------------MyListener inited !");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {ServletContextListener.super.contextDestroyed(sce);System.out.println("----------------MyListener Destroy !");}
}

如果使用传统

@WebFilter...实现注册也可以

条件:

        1.一定是自定义组件

        2.启动类添加@ServletComponentScan

七、切换为其他嵌入式Servlet容器

SpringBoot 默认针对Servlet容器提供以下支持:

Tomcat(默认使用)

Jetty :支持长连接项目(如:聊天页面)[ˈdʒeti]

Undertow : 不支持 JSP , 但是并发性能高,是高性能非阻塞的容器[ˈʌndətəʊ]

默认Tomcat容器

 切换 Jetty 容器

package com.apesource.springboot04web04;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan
public class SpringBoot04Web04Application {public static void main(String[] args) {SpringApplication.run(SpringBoot04Web04Application.class, args);}}

 使用外置Servlet容器Tomcat9.x

嵌入式Servlet容器:运行启动类就可启动,或将项目打成可执行的 jar 包

        优点:简单、快捷;

        缺点:默认不支持JSP、优化定制比较复杂使用定制器, 还需要知道 每个功能 的底层原理

外置Servlet容器:配置 Tomcat, 将项目部署到Tomcat中运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402584.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-常见的七大排序

上节中我们学习了七大排序中的五种(插入排序、希尔排序、堆排序、选择排序、交换排序) 数据结构-常见的七大排序-CSDN博客 这节我们将要学习快速排序(hoare、指针法、挖洞法(快排的延伸)、快速排序非递归(栈)) 1.快速排序 1.1 hoare法 1.1思路 1.选出一个key&#xff0c;一…

浅看MySQL数据库

有这么一句话&#xff1a;“一个不会数据库的程序员不是合格的程序员”。有点夸张&#xff0c;但是确是如此。透彻学习数据库是要学习好多知识&#xff0c;需要学的东西也是偏难的。我们今天来看数据库MySQL的一些简单基础东西&#xff0c;跟着小编一起来看一下吧。 什么是数据…

Windows 11环境下安装uwsgi的步骤和方法

正在用Django做个小网站&#xff0c;经常要用runserver启动服务观察效果&#xff0c;很不方便&#xff0c;就想装个uwsgi&#xff0c;让服务总是在后台运行&#xff0c;免得切换。上网一查发现&#xff0c;在windows下安装uwsgi不是一件简单的事情&#xff0c;很多人在尝试之后…

Python | Leetcode Python题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; class Solution:def countBits(self, n: int) -> List[int]:bits [0]for i in range(1, n 1):bits.append(bits[i & (i - 1)] 1)return bits

Spring Web MVC入门(下)

1. 响应 1.1 返回静态页面 创建前端页面&#xff0c;如下图所示&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Index页面</title> </head> <body>Hello,Spring MVC…

设计模式21-组合模式

设计模式21-组合模式&#xff08;Composite Pattern&#xff09; 写在前面 动机定义与结构定义结构主要类及其关系 C代码推导优缺点应用场景总结补充叶子节点不重载这三个方法叶子节点重载这三个方法结论 写在前面 数据结构模式 常常有一些组件在内部具有特定的数据结构。如何…

CVPR2023《DNF: Decouple and Feedback Network for Seeing in the Dark》暗光图像增强论文阅读笔记

相关链接 论文链接 https://openaccess.thecvf.com/content/CVPR2023/papers/Jin_DNF_Decouple_and_Feedback_Network_for_Seeing_in_the_Dark_CVPR_2023_paper.pdf 代码链接 https://github.com/Srameo/DNF 摘要 RAW数据的独特属性在低光照图像增强方面展现出巨大潜力。…

使用RKNN在Orange Pi 5 (RK3588s) 上部署推理PPO深度学习模型

文章目录 一、前言1️⃣、Orange Pi 是什么&#xff1f;2️⃣、PPO 是什么&#xff1f;3️⃣、RKNN 是什么&#xff1f;3️⃣、ONNX 是什么&#xff1f; 二、项目简介三、部署流程1️⃣、PPO 网络结构2️⃣、PPO 输出模型&#xff0c;模型转换&#xff0c;以及对比检查3️⃣、.…

ECMAScript6语法:默认参数和rest参数

1、默认参数 默认参数即在定义函数的参数列表中指定了默认值的参数。在 ES5 中&#xff0c;并没有提供在参数列表中指定参数默认值的语法&#xff0c;要想为函数的参数指定默认值&#xff0c;只能在函数体中实现&#xff0c;示例代码如下&#xff1a; function table(width, …

【性能优化】使用Perfetto定位应用启动性能的瓶颈

Android应用启动优化相关的文章已经有很多人都写过了&#xff0c;但是主要都是聚焦在&#xff0c;为了启动性能都做了哪些改动上&#xff0c;少见有文章会说应该如何分析、识别应用的启动性能。 本篇文章将会结合我个人对Perfetto的实际使用经历&#xff0c;讲解车载应用的启动…

前端post传入拿到数据,后端报null,并且能够添加或者编辑成功

检查conterller层注解接到实体类的注解是不是没加&#xff08; RequestBody &#xff09; 后端&#xff1a; 前端&#xff1a; 那么就看注解&#xff0c;因为contrller层有个接值注解&#xff08; RequestBody &#xff09;

MySQL基础练习题44-只出现一次的最大数字

目录 题目 情况一 准备数据 分析数据 情况二 准备数据 实现一 题目 单一数字 是在 MyNumbers 表中只出现一次的数字。 找出最大的 单一数字 。如果不存在 单一数字 &#xff0c;则返回 null 。 情况一 准备数据 ## 创建库 create database db; use db;## 创建表 Cre…

代码随想录算法训练营Day42||Leetcode300.最长递增子序列 、 674. 最长连续递增序列 、 718. 最长重复子数组

一、最长递增子序列 简单&#xff0c;只不过返回值不是dp数组最后一个元素了&#xff0c;自己做出来AC了 class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int>dp(nums.size()1,1);for(int i1;i<nums.size();i){for(int ji-1;j>0…

自动化运维---ansible

ansible是一种由Python开发的自动化运维工具&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。 特点: 部署简单 默认使用ssh进行管理&#xff0c;基于py…

万能钥匙:解锁 C++ 模板的无限可能

1.泛型编程 1.1:交换两个数(C语言) 1.2:交换两个数(C) 1.3:泛型编程 2:函数模板 2.1:函数模板的概念 2.2:函数模板的格式 ​编辑 2.3:函数模板的原理 2.4:模板的实例化 2.4.1:隐式实例化 2.4.2:显式实例化:在函数名后的<>中指定模板参数的实际类型. 2.4.2.1…

Docker 部署 XXL-JOB

Docker 部署 XXL-JOB 目录 引言环境准备创建 MySQL 用户并授予权限使用 Docker 部署 XXL-JOB配置 XXL-JOB验证部署总结 1. 引言 XXL-JOB 是一个开源的分布式任务调度平台&#xff0c;旨在简化定时任务的管理和调度操作。其强大的功能和灵活性&#xff0c;使其在互联网公司和…

WebSocket 快速入门

WebSocket是什么 WebSocket 是基于 TCP 的一种新的应用层网络协议。它实现了浏览器与服务器全双工通信&#xff0c;即允许服务器主动发送信息给客户端。因此&#xff0c;在 WebSocket 中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性…

谷歌开源Gemma-2 百亿参数大模型,性能超越Llama-3模型,免费使用

Gemma 模型 Gemma模型是谷歌发布的一个开源模型&#xff0c;任何人都可以免费下载预训练模型&#xff0c;进行使用。而谷歌最近也发布了Gemma 2 模型&#xff0c;模型参数超过了 200 亿大官&#xff0c;果真大模型最后都是拼参数的时候吗。 Gemma 2 模型发布 Gemma 2 模型可以…

使用 Python 解密加密的 PDF 文件

使用 Python 进行 PDF 文件加密-CSDN博客文章浏览阅读89次&#xff0c;点赞2次&#xff0c;收藏2次。定义一个名为的函数&#xff0c;该函数接受三个参数&#xff1a;输入的 PDF 文件路径input_pdf、输出的加密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/q…

Ubuntu中设置环境变量 PATH 的命令,不生效的问题“PATH=~/bin:$PATH”

1. 知识点 PATH~/bin:$PATH PATH&#xff1a;这是一个环境变量&#xff0c;用于指定操作系统在哪些目录中查找可执行文件。 ~&#xff1a;这是一个特殊的符号&#xff0c;代表当前用户的主目录。 /bin&#xff1a;这通常是存放标准实用程序&#xff08;如 ls, cp 等&#xff…