Spring Boot的Web开发

news2024/11/28 4:52:06

目录

Spring Boot的Web开发

1.静态资源映射规则

第一种静态资源映射规则

2.enjoy模板引擎

3.springMVC

3.1请求处理

@RequestMapping

@DeleteMapping 删除

@PutMapping 修改

@GetMapping 查询

@PostMapping 新增

3.2参数绑定

一.支持数据类型:

3.3常用注解

一.@RequestParam

二.@RequestBody

三.@PathVaribale

四.@RequestHeader

五.@CookieValue

3.4数据传递

3.5文件上传

4.注册Servlet三大组件 Servlet/Filter/Listener

5.切换为其他嵌入式Servlet容器

6.restFul


Spring Boot的Web开发

1.静态资源映射规则
第一种静态资源映射规则

总结:

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

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

静态资源访问前缀 spring: mvc: static-path-pattern: /apesource/**

2.enjoy模板引擎

1.将页面保存在templates目录下

2.添加坐标

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

3.开启配置(创建配置类)

@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.编写代码

@Controller
@RequestMapping("user")
public class RequestController {
    @RequestMapping("/wwt")
    public String successFound(){
        return "success";
    }
}

3.springMVC

3.1请求处理
@RequestMapping

意义:处理用户的请求,相似于doget与dopost

位置: 类上:一级目录 方法:二级目录 例如:user/save user/delete student/save student/delete 属性: value = "",path = "" 表示请求路径

method=常量,此请求的类型(get,post),若不设置则此请求适配所有的请求方式

params = "" 限制请求参数,例如:params={"msg1","msg2"}表示请求路径中必须携带参数名为msg1与msg2的参数

注意:1.超链接默认发送的是get请求 2.所有请求所携带的参数格式均为:key = value

@DeleteMapping 删除
@PutMapping 修改
@GetMapping 查询
@PostMapping 新增

作用与@RequestMapping一样,只是请求方式不同,语法相同。

@RequestMapping可以点击查看源码 @Target({ElementType.METHOD, ElementType.TYPE}) METHOD==代表修饰方法,TYPE==代表修饰类

3.2参数绑定

绑定的机制:SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的

一.支持数据类型:

1.基本类型参数:

包括基本类型和 String 类型

1.发送请求中携带数据的key与方法参数的name必须一致 2.数据类型合法

 @RequestMapping("/show1")
    public String one(String msg1){
        System.out.println("msg1="+msg1);
        return "success";
    }

2.POJO类型参数: 包括实体类,以及关联的实体类

    @RequestMapping("/show3")
    public String sendEmp(Emp emp){  //发送请求中携带数据的key与实体类的属性名必须一致
        System.out.println(emp);
        return "success";
    }

嵌套实体类:

@RequestMapping("/show3")
    public String sendEmp(Emp emp){  //发送请求中携带数据的key与实体类的属性名必须一致
        System.out.println(emp);
        return "success";
    }
    <!--被嵌套的实体类对象的name使用: 对象名.属性名 的方式 该属性名与发送请求中携带数据key必须一致-->
    <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="发送请求">
    </form>

3.数组和集合类型参数: 包括 List 结构和 Map 结构的集合(包括数组)

    @RequestMapping("/show5")
    public String sendMap(@RequestParam Map map){//参数类型Map前需要添加@RequestParam注解
        System.out.println(map);
        return "success";
    }
<form action="/one/show6" method="post">
        部门编号:<input type="text" name="did"><br/>
        部门名称:<input type="text" name="dname"><br/>
        员工编号1:<input type="text" name="emps[0].eid"><br/>
        员工姓名1:<input type="text" name="emps[0].ename"><br/>
        员工性别1:<input type="text" name="emps[0].esex"><br/>
        员工编号3:<input type="text" name="empMap['one'].eid"><br/>
        员工姓名3:<input type="text" name="empMap['one'].ename"><br/>
        员工性别3:<input type="text" name="empMap['one'].esex"><br/>
        <input type="submit" value="提交">
        <a href="/one/show7?nums=1233&nums=234&nums=23432">发送请求7</a>
        <h3>使用 ServletAPI 对象作为方法参数</h3>
        <a href="/one/show7">发送请求8</a>
    </form>
 

4.使用 ServletAPI 对象作为方法参数 HttpServletRequest HttpServletResponse HttpSession java.security.Principal Locale InputStream OutputStream Reader Writer

@RequestMapping("/show8")
    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";
    }

二.使用要求 1.发送请求中携带数据的key与方法参数的name必须一致 2.数据类型合法

3.3常用注解

springMVC常用注解

一.@RequestParam

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

  @RequestMapping("show1")
    public String show1(@RequestParam(value = "msg") String msg1){
        System.out.println("msg1="+msg1);
        return "success";
    }
​
    @RequestMapping("/show2")
    public String show2(@RequestParam("msg") String msg1,@RequestParam("msg2") String msg2){
        System.out.println("msg1="+msg1+"msg2="+msg2);
        return "success";
    }
二.@RequestBody

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

  @RequestMapping("/show3")
    public String show3(@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:是否必须提供占位符。

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

Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:  GET:用于获取资源  POST:用于新建资源  PUT:用于更新资源  DELETE:用于删除资源 例如:  /users/1 GET : 得到 id = 1 的 user  /users/1 DELETE: 删除 id = 1 的 user  /users/1/新名/新性 PUT: 更新 id = 1 的 user  /users/新名/新性 POST: 新增 user

 @RequestMapping("/show4/{ename}/{eid}")
    public String show4(@PathVariable String ename,@PathVariable String eid){
        System.out.println(ename+"ename"+eid+"eid");
        return "success";
    }
​
    @RequestMapping("/show5/{name}/{id}")
    public String show5(@PathVariable(value = "name") String ename,@PathVariable(value = "id") int eid){
        System.out.println(ename+"ename"+eid+"eid");
        return "success";
    }
四.@RequestHeader

作用: 用于获取请求消息头。

属性: value:提供消息头名称 required:是否必须有此消息头

    @RequestMapping("/show1")
    public String show1(@RequestHeader(value = "name")String name){
        System.out.println(name);
        return "success";
    }
五.@CookieValue

作用: 用于把指定 cookie 名称的值传入控制器方法参数。

属性: value:指定 cookie 的名称。 required:是否必须有此 cookie。

    @RequestMapping("/show2")
    public String show2(@CookieValue(value = "JSESSIONID",required = false)String id){
        System.out.println(id);
        return "success";
    }
3.4数据传递

controller的返回值类型有两种,Json和String

String类型返回值作用:

  1. 充当视图的逻辑名称,默认页面跳转为请求转发方式

    @RequestMapping("/show01")
    public String show01(){
        System.out.println("成功响应show01");
        return "success";
    }

     2. 充当一次请求转发或重定向(发送请求)

	@RequestMapping("/show02")
    public String show02(){
        System.out.println("成功响应show02");
        return "redirect:show01";
    }
    @RequestMapping("/show03")
    public String show03(){
        System.out.println("成功响应show03");
        return "forward:show01";
    }

     3. 给session中存数据并返回前端

    @RequestMapping("/show04")
    public String show04(HttpServletRequest request){
        System.out.println("成功响应show04");
        Emp emp = new Emp(11,"wwt","男");
        request.getSession().setAttribute("emp",emp);
        return "success";
    }

Json类型返回值作用:

将对象转换为json格式返回给前端:

    @RequestMapping("/show02")
    @ResponseBody
    public List<Emp> shoe02(){
        Emp emp1 = new Emp(12,"wwt","男");
        Emp emp2 = new Emp(13,"wwt","男");
        Emp emp3 = new Emp(14,"wwt","男");
        List<Emp> list = new ArrayList<>();
        list.add(emp1);
        list.add(emp2);
        list.add(emp3);
        return list;
    }
3.5文件上传

该案例以七牛云为例:

  1. 在springboot项目中导入七牛云需要坐标

        <!--导入七牛云需要坐标-->
        <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>

         2.配置七牛云相关信息:

@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;
    }
}

      3.写一个简单的文件上传页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
  <form action="/file/show1" method="post" enctype="multipart/form-data">
    用户名:<input name="uname"/><br>
    图片:<input name="upic" type="file"/><br>
    <input type="submit" value="上传">
  </form>
</body>
</html>

     4.编写控制文件上传controller

@Controller
@RequestMapping("/file")
public class fileController {
    @RequestMapping("/show")
    public String show(){
        return "index";
    }
    @RequestMapping("/show1")
    public String file(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 = "FvHzx7X-XV_EJwLWin-8-AkozGAu8tR0_ELaSCcB";
        String secretKey = "DQSLg30LmmrlWuFGiRUKMxrw6l2169A0i-miKJZ7";
        String bucket = "db202407";
        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = null;
        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";
    }
}

     5.最后将它显示在页面上(通过enjoy模版引擎传递数据)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    成功上传
    <div>#(session.picname)</div>
    <img src="http://sgwh6dzed.hd-bkt.clouddn.com/#(session.picname)">
</body>
</html>

4.注册Servlet三大组件 Servlet/Filter/Listener

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

  1. 配置类配置三大组件:

@Configuration
public class MyMvcConfig {
    //注册Serlvet
    //替换:@WebServlet(urlPatterns = "/mySerlvet")
    @Bean
    public ServletRegistrationBean doServlet(){
        ServletRegistrationBean<MyServlet> bean = new ServletRegistrationBean<>();
        bean.setServlet(new MyServlet());
        bean.setUrlMappings(Arrays.asList("/myServlet"));
        bean.setLoadOnStartup(1);
        return bean;
    }

    //注册Filter
    @Bean
    public FilterRegistrationBean doFilter(){
        FilterRegistrationBean filter = new FilterRegistrationBean();
        filter.setFilter(new MyFilter());
        filter.addUrlPatterns("/*");
        return filter;
    }

    //注册Listener
    @Bean
    public ServletListenerRegistrationBean doListener(){
        //关闭监听器切记不要点击红色按钮,太暴力,点击控制台左侧exist
        ServletListenerRegistrationBean listener = new ServletListenerRegistrationBean();
        listener.setListener(new MyListener());
        return listener;
    }
}

      (1) ServletRegistrationBean 注册自定义Servlet

//@WebServlet("/servlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入servlet");
        resp.getWriter().println("<h1>Hello World!</h1>");
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

     (2) FilterRegistrationBean 注册自定义Filter

//@WebFilter(urlPatterns = {"/*"})
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("========请求过滤");
        servletRequest.setCharacterEncoding("UTF-8");

        //分水岭
        filterChain.doFilter(servletRequest,servletResponse);

        servletRequest.setCharacterEncoding("UTF-8");
        System.out.println("========响应过滤");
    }
}

     (3) ServletListenerRegistrationBean 注册自定义Listener

//@WebListener
public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("执行listener初始化方法");
        ServletContextListener.super.contextInitialized(sce);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("执行listener销毁方法");
        ServletContextListener.super.contextDestroyed(sce);
    }
}

     2. 如果使用传统 @WebFilter...实现注册也可以

        条件:1.一定是自定义组件

                   2.启动类添加@ServletComponentScan

5.切换为其他嵌入式Servlet容器

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

  • Tomcat(默认使用)

  • Jetty :支持长连接项目(如:聊天页面)

  • Undertow : 不支持 JSP , 但是并发性能高,是高性能非阻塞的容器

切换 Jetty 容器

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 排除tomcat容器 -->
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--引入其他的Servlet容器-->
        <dependency>
            <artifactId>spring-boot-starter-jetty</artifactId>
            <groupId>org.springframework.boot</groupId>
        </dependency>

嵌入式Servlet容器:运行启动类就可启动,或将项目打成可执行的 jar 包 优点:简单、快捷; 缺点:默认不支持JSP、优化定制比较复杂使用定制器, 还需要知道 每个功能 的底层原理 外置Servlet容器:配置 Tomcat, 将项目部署到Tomcat中运行

6.restFul

REST 指的是一组架构约束条件和原则,rest原则有部分组成: URL定位资源,HTTP动词操作(GET, POST, PUT,DELETE) 描述操作。

 设计RESTful风格的API:

  1. 在RESTful风格的架构中, 每个网址代表一种资源,所以网址中不能有动词,只能有名词。而且所 用的名词往往与数据库的表名对应。
  2. HTTP动词设计: GET (获取资源) POST (新建资源) PUT (更新资源,客户端提供改变后的完整资源) DELETE (删除资源)

请求方式 含义

GET /zoos                                                    列出所有动物园

POST /zoos                                                 新建一个动物园

GET /zoos/ID                                               获取某个指定动物园的信息

PUT /zoos/ID                                               更新某个指定动物园的信息(提供该动物园的全部信息)

DELETE /zoos/ID                                        删除某个动物园

GET /zoos/lD/animals                                  列出某个指定动物园的所有动物

DELETE /zoos/lD/animals/ID                       删除某个指定动物园的指定动物

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Vulnhub] Raven2 PHPMailer-RCE+MSQP:Mysql权限提升

信息收集 IP AddressOpening Ports192.168.101.160TCP:22,80,111,46606 $ nmap -p- 192.168.101.160 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.7p1 Debian 5deb8u4 (protocol 2.0) | ssh-hostkey: | 1024 26:81:c1:f…

拉提查合创5步玩转git工具协作代码开发

1 工具使用场景 开发团队使用git版本管理工具&#xff0c;进行协作代码开发过程中&#xff0c;最常用的场景为&#xff1a; &#xff08;1&#xff09;拉取代码 将git远端仓库最新代码拉取到本地。 &#xff08;2&#xff09;提交代码 将本地新增修改的代码提交至git远端仓库中…

Spring Cloud微服务项目统一封装数据响应体

在微服务架构下&#xff0c;处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发&#xff0c;统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体&#xff0c;并分享…

【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现

1 绪论 1.1 研究背景与意义 在气候变化日益受到全球关注的背景下&#xff0c;天气气温的变化已经对人们的生活各方面都产生了影响&#xff0c;人们在外出时大多都会在手机上看看天气如何&#xff0c;根据天气的变化来决定衣物的穿着和出行的安排。[1]如今手机能提供的信息已经…

C++基础知识:函数重载相关注意事项:1.引用作为重载条件,2.2.函数重载遇见函数默认参数。

1.引用作为重载条件 #include<iostream>using namespace std;//1.引用作为重载的条件 //int 和 const int 类型不同&#xff0c;所以可以作用重载条件 void fn(int &a) //int &a10;不合法 //10放在了常量区&#xff0c;而引用要么在栈区&#xff0c;要么在堆区{…

mysql的MHA以及故障模拟

目录 MHA概念 MHA的组件 MHA的特点 实验&#xff1a;搭建完成MHA的架构 实验&#xff1a;主备切换 实验结果 实验&#xff1a;故障切换 实验&#xff1a;故障恢复 MHA概念 MHA&#xff1a;高可用模式下的故障切换&#xff0c;基于主从复制。它解决的是单点故障和主从复…

Ruby、Python、Java 开发者必备:Codigger之软件项目体检

在编程的广阔天地里&#xff0c;Ruby、Python 和 Java 开发者们各自凭借着独特的语言特性&#xff0c;构建着精彩纷呈的应用世界。然而&#xff0c;无论使用哪种语言&#xff0c;确保项目的高质量始终是至关重要的目标。而 Codigger 项目体检则成为了实现这一目标的得力助手&am…

【JS】事件循环

事件循环&#xff08;Event Loop&#xff09; 什么是事件循环 事件循环就是一个执行任务队列的机制 为什么会出现事件循环 为了避免单线程出现阻塞,采用了异步的形式执行任务。为了解决异步任务的问题,采用了事件循环机制。 事件循环的流程 JavaScript是一门单线程的语言…

Chapter 17 Python文件操作(下)

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、文件的写入二、文件的追加 前言 Python作为一种高效且易于学习的编程语言&#xff0c;提供了一系列强大的文件操作功能&#xff0c;使得用户能够轻松地实现文件的读…

深度解析Linux-C——函数和内存管理

目录 函数指针&#xff1a; 指针函数&#xff1a; 参数为指针的函数&#xff1a; 参数为数组的函数&#xff1a; C语言内存管理 stdlib.h头文件常用函数介绍 1、局部变量 2、全局变量 3、 堆空间变量 4、静态变量 5、常量 函数指针&#xff1a; 指向函数的指针&#…

针对datax-web 中Swagger UI接口未授权访问

application.yml 添加以下配置 实现访问doc.html 以及/v2/api-docs 接口时需要进行简单的校验 swagger:basic:enable: trueusername: adminpassword: 12345 配置重启后再进行相关访问则需要输入用户名和密码

Radon(拉当) 变换:超详细讲解(附MATLAB,Python 代码)

Radon 变换 Radon 变换是数学上用于函数或图像的一种积分变换&#xff0c;广泛应用于图像处理领域&#xff0c;尤其是在计算机断层成像 (CT) 中。本文档将详细介绍 Radon 变换的数学含义及其在图像处理中的应用。 数学定义 Radon 变换的数学定义是将二维函数 f ( x , y ) f…

Spark实时(二):StructuredStreaming编程模型

文章目录 StructuredStreaming编程模型 一、基础语义 二、事件时间和延迟数据 三、​​​​​​​容错语义 StructuredStreaming编程模型 一、基础语义 Structured Streaming处理实时数据思想是将实时数据看成一张没有边界的表,数据源源不断的追加到这张表中,这可以让我…

零基础STM32单片机编程入门(二十二) ESP8266 WIFI模块实战含源码

文章目录 一.概要二.ESP8266 WIFI模块主要性能参数三.ESP8266 WIFI模块芯片内部框图四.ESP8266 WIFI模块原理图五.ESP8266 WIFI模块与单片机通讯方法1.硬件连接2.ESP8266模块AT指令介绍 六.STM32单片机与ESP8266WIFI模块通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 …

Super 4PCS配准算法

Nicolas Mellado&#xff0c;CNRS&#xff08;Centre national de la recherche scientifique&#xff0c;法国国家科学研究中心&#xff09;的研究员&#xff0c;在IRIT&#xff08;Institut de Recherche en Informatique de Toulouse&#xff0c;图卢兹计算机科学研究所&…

LeetCode Hot100 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

自动化测试 pytest 中 scope 限制 fixture使用范围!

导读 fixture 是 pytest 中一个非常重要的模块&#xff0c;可以让代码更加简洁。 fixture 的 autouse 为 True 可以自动化加载 fixture。 如果不想每条用例执行前都运行初始化方法(可能多个fixture)怎么办&#xff1f;可不可以只运行一次初始化方法&#xff1f; 答&#xf…

学习笔记:《用Python进行数据分析》之通用函数

通用函数&#xff08;即ufunc&#xff09;是一种对ndarray中的数据执行元素级运算的函数。你可以将其看做简单函数&#xff08;接受一个或多个标量值&#xff0c;并产生一个或多个标量值&#xff09;的矢量化包装器。 许多ufunc都是简单的元素级变体&#xff0c;如sqrt和exp&a…

HTML前端面试题之<iframe>标签

面试题&#xff1a;iframe 标签的作用是什么?有哪些优缺点 ? 讲真&#xff0c;刷这道面试题之前我根本没有接触过iframe&#xff0c;网课没讲过&#xff0c;项目实战没用过&#xff0c;但却在面试题里出现了&#xff01;好吧&#xff0c;我只能说&#xff1a;前端路漫漫&…

通过 C# 写入数据到Excel表格

Excel 是一款广泛应用于数据处理、分析和报告制作的电子表格软件。在商业、学术和日常生活中&#xff0c;Excel 的使用极为普遍。本文将详细介绍如何使用免费.NET库将数据写入到 Excel 中&#xff0c;包括文本、数值、数组、和DataTable数据的输入。 文章目录 C# 在Excel单元格…