JavaWeb学习------Servlet

news2024/11/24 12:50:34

目录

JavaWeb学习------Servlet

Servlet 生命周期

Servlet 生命周期

 Servlet 方法介绍

•Servlet 体系结构

Servlet 体系结构

•Servlet urlPattern配置

Servlet urlPattern配置

•XML 配置方式编写 Servlet

 XML 配置方式编写 Servlet


JavaWeb学习------Servlet

快速入门

Servlet 执行流程

  • Servlet 生命周期

Servlet 生命周期

  • 对象的生命周期指一个对象从被创建到被销毁的整个过程

 

Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:

1. 加载和实例化: 默认情况下,当 Servlet 第一次被访问时,由容器创建 Servlet 对象
2. 初始化: Servlet 实例化之后,容器将调用 Servlet init () 方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只 调用一次
3. 请求处理:每次 请求 Servlet 时, Servlet 容器都会调用 Servlet service() 方法对请求进行处理。
4. 服务终止: 当需要释放内存或者容器关闭时,容器就会调用 Servlet 实例的 destroy() 方法完成资源的释放。在 destroy() 方法调用之后,容器会释放这个 Servlet 实例,该实例随后会被 Java 的垃圾收集器所回收

@WebServlet(urlPatterns = "/demo", loadOnStartup = 1)

负整数:第一次被访问时创建 Servlet 对象
0 或正整数:服务器启动时创建 Servlet 对象,数字越小优先级越高

 Servlet 方法介绍

  • 初始化方法,在Servlet被创建时执行,只执行一次

void init(ServletConfig config)  

  •  提供服务方法, 每次Servlet被访问,都会调用该方法

void service(ServletRequest req, ServletResponse res)  

  • 销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet 

 void destroy()

  • 获取ServletConfig对象

ServletConfig getServletConfig()

  • 获取Servlet信息

String getServletInfo()


package com.itheima.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * Servlet方法介绍
 */
@WebServlet(urlPatterns = "/demo3",loadOnStartup = 1)
public class ServletDemo3 implements Servlet {

    private ServletConfig servletConfig;
    /**
     *  初始化方法
     *  1.调用时机:默认情况下,Servlet被第一次访问时,调用
     *      * loadOnStartup: 默认为-1,修改为0或者正整数,则会在服务器启动的时候,调用
     *  2.调用次数: 1次
     * @param config
     * @throws ServletException
     */
    public void init(ServletConfig config) throws ServletException {
        this.servletConfig = config;
        System.out.println("init...");
    }
    public ServletConfig getServletConfig() {
        return servletConfig;
    }
    
    /**
     * 提供服务
     * 1.调用时机:每一次Servlet被访问时,调用
     * 2.调用次数: 多次
     * @param req
     * @param res
     * @throws ServletException
     * @throws IOException
     */
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("servlet hello world~");
    }

    /**
     * 销毁方法
     * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
     * 2.调用次数: 1次
     */
    public void destroy() {
        System.out.println("destroy...");
    }
    
    public String getServletInfo() {
        return "";
    }
}


Servlet 体系结构

Servlet 体系结构

我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承HttpServlet

                       

 HttpServlet 原理

  • HTTP 协议中,GET POST 请求方式的数据格式不一样,将来要想在Servlet中处理请求参数,得在service方法中判断请求方式,并且根据请求方式的不同,分别进行处理:


@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //TODO GET 请求方式处理逻辑
        System.out.println("get...");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //TODO Post 请求方式处理逻辑
        System.out.println("post...");
    }
}

* 要想发送一个GET请求,请求该Servlet,只需要通过浏览器发送`http://localhost:8080/web-demo/demo4`,就能看到doGet方法被执行了

* 要想发送一个POST请求,请求该Servlet,单单通过浏览器是无法实现的,这个时候就需要编写一个form表单来发送请求,在webapp下创建一个`a.html`页面,内容如下:

```html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/web-demo/demo4" method="post">
        <input name="username"/><input type="submit"/>
    </form>
</body>
</html>

启动测试,即可看到doPost方法被执行了。

Servlet的简化编写就介绍完了,接着需要思考两个问题:

1. HttpServlet中为什么要根据请求方式的不同,调用不同的方法?

2. 如何调用?

针对问题一,我们需要回顾之前的知识点==前端发送GET和POST请求的时候,参数的位置不一致,GET请求参数在请求行中,POST请求参数在请求体中==,为了能处理不同的请求方式,我们得在service方法中进行判断,然后写不同的业务处理,这样能实现,但是每个Servlet类中都将有相似的代码,针对这个问题,有什么可以优化的策略么?

```java

package com.itheima.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/demo5")
public class ServletDemo5 implements Servlet {

    public void init(ServletConfig config) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //如何调用?
        //获取请求方式,根据不同的请求方式进行不同的业务处理
        HttpServletRequest request = (HttpServletRequest)req;
       //1. 获取请求方式
        String method = request.getMethod();
        //2. 判断
        if("GET".equals(method)){
            // get方式的处理逻辑
        }else if("POST".equals(method)){
            // post方式的处理逻辑
        }
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}

```

要解决上述问题,我们可以对Servlet接口进行继承封装,来简化代码开发。

```java

package com.itheima.web;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class MyHttpServlet implements Servlet {
    public void init(ServletConfig config) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest)req;
        //1. 获取请求方式
        String method = request.getMethod();
        //2. 判断
        if("GET".equals(method)){
            // get方式的处理逻辑
            doGet(req,res);
        }else if("POST".equals(method)){
            // post方式的处理逻辑
            doPost(req,res);
        }
    }

    protected void doPost(ServletRequest req, ServletResponse res) {
    }

    protected void doGet(ServletRequest req, ServletResponse res) {
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}

```

有了MyHttpServlet这个类,以后我们再编写Servlet类的时候,只需要继承MyHttpServlet,重写父类中的doGet和doPost方法,就可以用来处理GET和POST请求的业务逻辑。接下来,可以把ServletDemo5代码进行改造

```java

@WebServlet("/demo5")
public class ServletDemo5 extends MyHttpServlet {

    @Override
    protected void doGet(ServletRequest req, ServletResponse res) {
        System.out.println("get...");
    }

    @Override
    protected void doPost(ServletRequest req, ServletResponse res) {
        System.out.println("post...");
    }
}

```

将来页面发送的是GET请求,则会进入到doGet方法中进行执行,如果是POST请求,则进入到doPost方法。这样代码在编写的时候就相对来说更加简单快捷。

类似MyHttpServlet这样的类Servlet中已经为我们提供好了,就是HttpServlet,翻开源码,大家可以搜索`service()`方法,你会发现HttpServlet做的事更多,不仅可以处理GET和POST还可以处理其他五种请求方式。

```java

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String method = req.getMethod();

        if (method.equals(METHOD_GET)) {
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                if (ifModifiedSince < lastModified) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);

        } else if (method.equals(METHOD_POST)) {
            doPost(req, resp);
            
        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);
            
        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);
            
        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);
            
        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);
            
        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //

            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }


总结:
1. HttpServlet 使用步骤
继承 HttpServlet
重写 doGet doPost 方法
2. HttpServlet 原理

获取请求方式,并根据不同的请求方式,调用不同的doXxx方法

Servlet urlPattern配置

Servlet urlPattern配置

  • Servlet 要想被访问,必须配置其访问路径(urlPattern
  1. 一个Servlet,可以配置多个 urlPattern

Servlet类编写好后,要想被访问到,就需要配置其访问路径(==urlPattern==)

* 一个Servlet,可以配置多个urlPattern

package com.itheima.web;
  
  import javax.servlet.ServletRequest;
  import javax.servlet.ServletResponse;
  import javax.servlet.annotation.WebServlet;
  
  /**
  * urlPattern: 一个Servlet可以配置多个访问路径
  */
  @WebServlet(urlPatterns = {"/demo7","/demo8"})
  public class ServletDemo7 extends MyHttpServlet {
  
      @Override
      protected void doGet(ServletRequest req, ServletResponse res) {
          
          System.out.println("demo7 get...");
      }
      @Override
      protected void doPost(ServletRequest req, ServletResponse res) {
      }
  }

 在浏览器上输入`http://localhost:8080/web-demo/demo7`,`http://localhost:8080/web-demo/demo8`这两个地址都能访问到ServletDemo7的doGet方法。

     2.urlPattern 配置规则 

   精确匹配

  • 配置路径:
  •  访问路径:
 /**
     * UrlPattern:
     * * 精确匹配
     */
    @WebServlet(urlPatterns = "/user/select")
    public class ServletDemo8 extends MyHttpServlet {
    
        @Override
        protected void doGet(ServletRequest req, ServletResponse res) {
    
            System.out.println("demo8 get...");
        }
        @Override
        protected void doPost(ServletRequest req, ServletResponse res) {
        }
    }

     访问路径`http://localhost:8080/web-demo/user/select`

②  目录匹配

  •   配置路径:
  •  访问路径:

 package com.itheima.web;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebServlet;
    
    /**
     * UrlPattern:
     * * 目录匹配: /user/*
     */
    @WebServlet(urlPatterns = "/user/*")
    public class ServletDemo9 extends MyHttpServlet {
    
        @Override
        protected void doGet(ServletRequest req, ServletResponse res) {
    
            System.out.println("demo9 get...");
        }
        @Override
        protected void doPost(ServletRequest req, ServletResponse res) {
        }
    }

  访问路径`http://localhost:8080/web-demo/user/任意`

 ==思考:==

    1. 访问路径`http://localhost:8080/web-demo/user`是否能访问到demo9的doGet方法?

    2. 访问路径`http://localhost:8080/web-demo/user/a/b`是否能访问到demo9的doGet方法?

    3. 访问路径`http://localhost:8080/web-demo/user/select`是否能访问到demo9还是demo8的doGet方法?

    答案是: 能、能、demo8,进而我们可以得到的结论是`/user/*`中的`/*`代表的是零或多个层级访问目录同时精确匹配优先级要高于目录匹配。

③  扩展名匹配

  •   配置路径:
  •   访问路径:
package com.itheima.web;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebServlet;
    
    /**
     * UrlPattern:
     * * 扩展名匹配: *.do
     */
    @WebServlet(urlPatterns = "*.do")
    public class ServletDemo10 extends MyHttpServlet {
    
        @Override
        protected void doGet(ServletRequest req, ServletResponse res) {
    
            System.out.println("demo10 get...");
        }
        @Override
        protected void doPost(ServletRequest req, ServletResponse res) {
        }
    }

  访问路径`http://localhost:8080/web-demo/任意.do`

 ==注意==:

    1. 如果路径配置的不是扩展名,那么在路径的前面就必须要加`/`否则会报错

    2. 如果路径配置的是`*.do`,那么在*.do的前面不能加`/`,否则会报错

④  任意匹配

  • 配置路径:

  • 访问路径:

  • //* 区别:

    Ø 当我们的项目中的 Servlet 配置了 “/” ,会覆盖掉 tomcat 中的 DefaultServlet ,当其他的 url -pattern 都匹配不上时都会走这个 Servlet
    Ø 当我们的项目中配置了 “/ * ,意味着匹配任意访问路径
  • 优先级:

           精确路径 > 目录路径 > 扩展名路径 > /* > /

package com.itheima.web;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebServlet;
    
    /**
     * UrlPattern:
     * * 任意匹配: /
     */
    @WebServlet(urlPatterns = "/")
    public class ServletDemo11 extends MyHttpServlet {
    
        @Override
        protected void doGet(ServletRequest req, ServletResponse res) {
    
            System.out.println("demo11 get...");
        }
        @Override
        protected void doPost(ServletRequest req, ServletResponse res) {
        }
    }

     访问路径`http://localhost:8080/demo-web/任意`

package com.itheima.web;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebServlet;
    
    /**
     * UrlPattern:
     * * 任意匹配: /*
     */
    @WebServlet(urlPatterns = "/*")
    public class ServletDemo12 extends MyHttpServlet {
    
        @Override
        protected void doGet(ServletRequest req, ServletResponse res) {
    
            System.out.println("demo12 get...");
        }
        @Override
        protected void doPost(ServletRequest req, ServletResponse res) {
        }
    }
    

     访问路径`http://localhost:8080/demo-web/任意 

==注意:==`/`和`/*`的区别?

    1. 当我们的项目中的Servlet配置了 "/",会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet

   

    2. 当我们的项目中配置了"/*",意味着匹配任意访问路径

   

    3. DefaultServlet是用来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问

**小结**

1. urlPattern总共有四种配置方式,分别是精确匹配、目录匹配、扩展名匹配、任意匹配

2. 五种配置的优先级为 精确匹配 > 目录匹配> 扩展名匹配 > /* > / ,无需记,以最终运行结果为准。

XML 配置方式编写 Servlet

 XML 配置方式编写 Servlet

  • Servlet 3.0版本后开始支持使用注解配置,3.0版本前只支持 XML 配置文件的配置方式

  • 步骤:

    1.编写 Servlet
  • package com.itheima.web;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebServlet;
    
    public class ServletDemo13 extends MyHttpServlet {
    
        @Override
        protected void doGet(ServletRequest req, ServletResponse res) {
    
            System.out.println("demo13 get...");
        }
        @Override
        protected void doPost(ServletRequest req, ServletResponse res) {
        }
    }

  • 2.web.xml中配置该Servlet

<?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">
    
    
    
    <!-- 
        Servlet 全类名
    -->
    <servlet>
        <!-- servlet的名称,名字任意-->
        <servlet-name>demo13</servlet-name>
        <!--servlet的类全名-->
        <servlet-class>com.itheima.web.ServletDemo13</servlet-class>
    </servlet>

    <!-- 
        Servlet 访问路径
    -->
    <servlet-mapping>
        <!-- servlet的名称,要和上面的名称一致-->
        <servlet-name>demo13</servlet-name>
        <!-- servlet的访问路径-->
        <url-pattern>/demo13</url-pattern>
    </servlet-mapping>
</web-app>

 这种配置方式和注解比起来,确认麻烦很多,所以建议大家使用注解来开发。但是大家要认识上面这种配置方式,因为并不是所有的项目都是基于注解开发的。

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

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

相关文章

centos安装 磁盘分区选择

1 介绍 INSTALLATION SUMMARY 在硬盘进行分区后&#xff0c;我们一般都会进行格式化&#xff0c;因为每种操作系统对文件属性/权限/存储数据格式的设定都有所不同&#xff0c;故而为了使得其跟操作系统一致&#xff0c;则需要格式化。 哈喽&#xff0c;大家好&#xff0c;我是…

Java AQS学习

目录 1、AQS初步 2、AQS源码 2.1、ReentrantLock类解析 2.2、AQS源码 JUC-->AQS-->AbstractQueuedSynchronizer&#xff1a;字面意思&#xff1a;抽象的队列同步器 AQS是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石&#xff0c;通过内置的FIFO…

InnoDB 引擎 底层逻辑

目录 0 课程视频 1 逻辑存储结构 1.1 结构图 1.2 表空间 -> 记录 索引 存储记录 等数据 1.2.1 储存在 cd/var/lib/mysql -> ll -> 目录 mysql.ibd 1.3 段 -> 索引 存储记录 具体存储 1.3.1 数据段 b树 叶子节点 1.3.2 索引段 b树的 非叶子节点 1.3.3 回滚段…

Java 基础入门篇(一)——— Java 概述

文章目录 一、Java 概述二、Java 的产品 JDK2.1 JDK 安装2.2 Java与 Javac 介绍2.3 Java 程序的开发步骤 三、Java 程序的执行原理四、JDK 的组成五、Java 的跨平台工作原理 一、Java 概述 Java 是 sun 公司在 1995 年推出的一门计算机高级编程语言&#xff0c;其语言风格接近人…

javaEE+mysql学生竞赛管理系统

本系统是基于JAVA平台开发的一套学生竞赛信息管理的系统。系统采用JSP为编程语言。数据库采用Mysql建立数据之间的转换。论文主要介绍了本课题的开发背景&#xff0c;所要完成的功能和开发的过程。重点的说明了系统设计的重点、设计思想、难点技术和解决方案。 本课题的目的是使…

none模式配置网络操作

基于Docker引擎启动Nginx WEB容器&#xff0c;默认以None方式启动Docker容器&#xff0c;此处使用pipework工具手工给容器指定桥接网卡&#xff0c;并且手工配置IP地址&#xff0c;操作指令如下&#xff1a; #查看镜像列表&#xff1b; docker images#运行新的容器 docker ru…

【Python】【进阶篇】17、如何配置settings.py文件

目录 17、如何配置settings.py文件1) 修改语言与时区配置2) 设置时区不敏感3) 配置项目所需数据库4&#xff09;学会阅读报错信息 17、如何配置settings.py文件 《settings.py配置文件详解》一文中&#xff0c;将 settings.py 配置文件的每一项给大家做了介绍。在开发的过程中…

MYSQL进阶02

MYSQL进阶02 数据类型char与varchartext与blob浮点数与定点数日期类型的选择 数据类型 char与varchar char和varchar类型类似&#xff0c;都用来存储字符串&#xff0c;但是他们保存和检索的方式不同。char属于固定长度的字符类型&#xff0c;而varchar属于可变长度的字符类型…

JavaWeb学习--RequestResponse

目录 JavaWeb学习--Request&Response 1&#xff0c;Request和Response的概述 request:获取请求数据 response:设置响应数据 **小结** 2&#xff0c;Request对象 **小结** 2.2 Request获取请求数据 **小结** 2.4 请求参数中文乱码问题 URL编码 2.5 Request请求转…

c提高学习——选择排序算法

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h>//选择排序 void mySort(int arr[], int len) {for (int i 0; i < len; i){//认定i是最小值的下标int min i;for (int j i1; j < len; j){if (arr[min…

ABTEST平台建设思路与方案

导读 ABTest的作用&#xff1a; 用ABTEST的结果数据&#xff0c;论证是因为某个业务方案的调整&#xff0c;对产品能力的影响。ABTEST是一个过程&#xff0c;只是为了证明改动的效果&#xff0c;其最终的阶段一定是对某个方案进行推全结束实验&#xff0c;避免稳定的业务流程…

STM32的位带操作

STM32的位带操作 为什么需要位带操作&#xff1f; 因为编程需要操作某个bit位来达到我们想要的功能&#xff0c;比如点灯需要操作GPIOA->ODR 的某个bit假设是第2bit&#xff0c;写1就可以让GPIO输出一个高电平。 GPIOA->ODR | 1<<2;这样写其实有三个隐含的操作…

SpringSecurity-从入门到精通

SpringSecurity从入门到精通 一、简介1.1 官网介绍1.2 认证与授权 二、使用步骤2.1 快速入门2.2 认证流程2.3 相关概念 三、解决问题3.1 思路分析3.2 准备工作3.3 具体实现3.4 加密存储3.5 登录接口3.6 认证过滤器 一、简介 1.1 官网介绍 SpringSecurity 是一个强大且高度自定…

Stable Diffusion-生式AI的新范式

! 扩散模型&#xff08;Stable Diffusion)现在是生成图像的首选模型。由于扩散模型允许我们以提示( prompts)为条件生成图像&#xff0c;我们可以生成我们所选择的图像。在这些文本条件的扩散模型中&#xff0c;稳定扩散模型由于其开源性而最为著名。 在这篇文章中&#xff0…

通用智能的瓶颈及可能的解决途径

通用智能是指能够在各种不同的任务和环境中灵活地适应和执行任务的智能。通用智能与特定任务的智能相反&#xff0c;后者只能在特定领域或任务中表现出色。通用智能的理论基础是人工智能领域的通用人工智能&#xff08;AGI&#xff09;研究&#xff0c;旨在设计出能够像人类一样…

【Java笔试强训 5】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;统计回文…

Zynq-7000、FMQL45T900的GPIO控制(三)---linux管脚编号计算

本文主要对在Linux下使用zynq-7000或者FMQL45T900控制MIO/EMIO 首先内核配置项 如下&#xff0c;这个不用太多关注&#xff0c;一般都是默认打开的 CONFIG_GPIO_SYSFSy CONFIG_SYSVIPCy CONFIG_GPIO_ZYNQy两者的控制都是流程都是一样的&#xff0c;在细节上又区别 首先都在…

Go | 一分钟掌握Go | 9 - 通道

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 在Java中&#xff0c;多线程之间的通信方式有哪些&#xff1f;记得吗&…

浪潮之巅 OpenAI有可能是历史上第一个10万亿美元的公司

淘金时代很像 如果你那个时候去加州淘金&#xff0c;一大堆人会死掉&#xff0c;但是卖勺子的人、卖铲子的人永远可以赚钱。所谓的shove and pick business。 大模型是平台型机会。按照我们几天的判断&#xff0c;以模型为先的平台&#xff0c;将比以信息为先的平台体量更大。…

带你深入学习k8s--(四) 控制器(k8s核心)

目录 一、概念 1、什么是控制器 2、控制器执行流程 3、控制器类型 二、控制器的使用 1、ReplicaSet 2、Deployment 1、版本迭代 2、回滚 3、修改滚动更新策略 4、暂停与恢复 3、daemonset 4、job 5、cronjob 前言&#xff1a; 上一章我们说到&#xff0c;pod有…