1 Tomcat服务器Servlet入门

news2024/11/20 6:31:16

今日目标

  1. web知识概述
  2. tomcat【重点】
  3. 创建servlet
    xml
    anno(注解)
  4. servlet执行原理
  5. servlet生命周期
  6. servlet体系结构

1.web相关知识概述【了解】

1.WEB简介

学习目标

  • 了解什么是web

内容讲解

Web(World Wide Web)即全球广域网,也称为万维网。它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。

简而言之就是我们平时上网浏览的网页,玩的网页游戏,上网下载资源。对于程序员而言就是前端知识、web服务器知识和数据库知识的结合就是web.

web发展阶段介绍:

【1】web1.0

1994年在中国第一个web网站是中国黄页,由马云。属于静态网页。只能看,不能交互。发布租赁信息

【2】web2.0

动态网站。网站数据是时时更新的。数据来自于数据库的。登录网站显示用户名,天气预报,微博头条。

可以实现前后台数据的交互。

注意:

网站:前端知识、web服务器知识和数据库知识
网页:前端页面html页面

2.软件架构模式(掌握)

学习目标

  • 说出软件架构模式分类

内容讲解

有两种:

1.BS:browser server 浏览器服务器。

​ 优点:

​ 1)只需要服务器,用户下载浏览器,维护方便

​ 2)减少用户的磁盘空间

​ 缺点:

​ 1)给服务器造成压力

​ 2)用户观看体验不友好

例如: 天猫、京东、知乎网站

在这里插入图片描述

2.CS:client server 客户端 服务器

​ 优点:

​ 1)具有客户端和服务器端,减轻服务器的压力

​ 2)用户观看体验友好

​ 缺点:

​ 1)维护成本大

​ 2)版本升级麻烦,占用户磁盘空间

例如: QQ,绝地求生,LOL

在这里插入图片描述

内容小结

1.软件架构模式有两种

BS:browser server 浏览器服务器

CS:client server 客户端 服务器

3.B/S和C/S通信模式特点(很重要)

学习目标

  • 掌握B/S和C/S通信模式特点

内容讲解

在这里插入图片描述

内容小结

B/S和C/S通信模式特点

1.先有请求

2.后有响应

3.请求和响应是成对出现的

4.WEB资源(理解)

学习目标

  • 理解web资源的分类和特点

内容讲解

【1】资源:计算机中数据文件

【2】分类:

分为两种:

1.静态资源:html css js。只能书写静态网站。静态网站的数据永远不会发生改变。

2.动态资源:使用一些语言可以实现数据的变化,例如java语言。JAVAEE

5.URL请求路径(理解)

学习目标

  • 说出URL请求路径作用和组成
  • 能够说出通过url请求路径如何找到目标服务器

内容讲解

【1】作用:通过资源路径可以访问到具体的服务器。

【2】介绍:

URL (Uniform Resource Locator) ,统一资源定位符是对互联网上资源位置的一种表示,互联网上的每个文件都有一个唯一的URL。

【3】格式:

协议://服务器的ip地址:服务器的端口号/项目名/资源路径

说明:
	1)协议:是一种规范。类似于我们之前讲解的TCP UDP(传输层),这里讲解的是应用层(http https协议)
	2)服务器的ip地址:就是访问的服务器的地址。同一个网段中服务器ip地址是唯一的。
	3)服务器的端口号:访问服务器端的进程号,属于唯一标识。
	4)/项目名/资源路径

【4】浏览器通过url访问服务器的过程

https://www.baidu.com/s?ie=UTF-8&wd=java

在这里插入图片描述

内容小结

1.URL请求路径作用

​ 通过资源路径可以访问到具体的服务器

2.URL请求路径的组成

协议://服务器的ip地址:服务器的端口号/项目名/资源路径

2.服务器(掌握)

1.服务器介绍 了解

学习目标

  • 了解什么是服务器
  • 说出服务器分类和常见的服务器

内容讲解

【1】服务器

服务器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

【2】服务器分类

分为两类:

1.硬件服务器:服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。

2.软件服务器: 服务器软件本质上是一个应用程序(由代码编写而成),运行在服务器设备上。能够接收请求并根据请求给客户端响应数据,发布资源(静态和动态)。数据库服务器、邮件服务器(易邮)、网页服务器(tomcat nginx发布网页)等

【3】常见的Web服务器

在这里插入图片描述

* Tomcat: Apache软件基金开源免费的web服务器,支持JavaEE规范(Servlet/Jsp).

* Jetty:Apache组织开源免费的小型web服务器,支持JavaEE规范.
* JBoss: RedHat红帽公司的开源免费的web服务器,支持JavaEE规范.
* Glass Fish:Sun公司开源免费的web服务器,支持JavaEE规范.

---------------------------------------------------------------------

* WebLogic: Oracle公司收费的web服务器,支持JavaEE规范.
* WebSphere:IBM公司收费的web服务器,支持JavaEE规范.

内容小结

1.什么是服务器

服务器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

2.服务器分类:硬件 软件

2.下载安装tomcat服务器 掌握

学习目标

  • 能够下载和安装tomcat服务器
  • 理解tomcat安装目录

内容讲解

【1】下载tomcat

tomcat服务器属于网页服务器,用来发布动态和静态网页的,由Apache公司开发的开源免费的。

官网:

https://tomcat.apache.org

在这里插入图片描述
在这里插入图片描述

【2】安装

将下载的tomcat放到没有中文和特殊符号的目录,然后进行解压即可。

在这里插入图片描述

【3】目录结构介绍

在这里插入图片描述

内容小结

1.安装:将下载的tomcat服务解压到没有中文和特殊符号的路径

2.目录结构:

bin:脚本目录 *****
	启动脚本(启动服务器):startup.bat
	停止脚本(停止服务器):shutdown.bat

conf:配置文件目录 (config /configuration) *****
	核心配置文件:server.xml
	用户权限配置文件:tomcat-users.xml
	所有web项目默认配置文件:web.xml

lib:依赖库,tomcat和web项目中需要使用的jar包  *****

logs:日志文件.
	localhost_access_log.txt tomcat记录用户访问信息,..表示时间。
	例如:localhost_access_log.2017-04-28.txt
	
temp:临时文件目录,文件夹内内容可以任意删除。

webapps:默认情况下发布WEB项目所存放的目录。  *****

work:tomcat处理JSP的工作目录。 

3.启动并使用浏览器访问tomcat服务器掌握

学习目标

  • 能够启动访问tomcat
  • 能够独立解决启动tomcat失败常见的问题

内容讲解

【1】tomcat启动和访问
  • 启动

    直接点击bin目录下面的startup.bat文件

    在这里插入图片描述

  • 访问

    在浏览器地址栏上输入访问地址:

    http://localhost:8080
    

    在这里插入图片描述

说明:出现tomcat猫,说明访问成功。

  • 停止tomcat

    1)双击bin目录下的shutdown.bat

在这里插入图片描述

​ 2)直接关闭dos窗口

​ 3)在dos窗口上按快捷键:ctrl+c

【2】 tomcat启动失败常见原因

1.端口号冲突

1)查看端口号

在这里插入图片描述

2)打开任务管理器找到PID是5220的进程直接关闭该进程

在这里插入图片描述

2.没有配置环境变量JAVA_HOME

3.就是之前有的同学电脑上安装过tomcat,并且在环境变量path中配置了环境变量,导致启动不成功。需要将之前配置的删除即可

内容小结

1.启动tomcat

双击startup.bat

2.关闭tomcat

双击shutdown.bat

3.解决启动tomcat失败常见问题

​ 1)端口号冲突,使用netstat -nao在命令行查看端口号冲突的软件进行关闭

​ 2)配置环境变量path

4.使用tomcat服务器发布web项目 掌握

1.在tomcat的安装目录webapps下发布web项目

学习目标
  • 掌握在在tomcat的安装目录webapps下发布web项目
内容讲解

1)在webapps文件夹下创建heima文件夹

2)并创建index.html页面

在这里插入图片描述

3)使用记事本打开html页面输入如下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    哈哈哈
</body>
</html>

4)启动tomcat

5) 访问:必须加项目名heima

在这里插入图片描述

内容小结

1.在浏览器url地址栏访问页面注意:

浏览器访问页面的时候必须加上文件夹名即heima

2.使用开发工具idea创建web项目 课下多创建几次 掌握

学习目标
  • 掌握如何在idea中创建web项目
内容讲解
  • idea创建maven的web项目_骨架(了解)

    注意:需要连网

    【1】

在这里插入图片描述

​【2】
在这里插入图片描述

​【3】

在这里插入图片描述

【4】

在这里插入图片描述

【5】删除pom.xml中多余的内容,留下如下内容

在这里插入图片描述

【6】补齐缺失的目录结构

在这里插入图片描述

在这里插入图片描述

【7】创建好之后

在这里插入图片描述

  • idea创建maven的web项目_不使用骨架(建议使用)

【1】

在这里插入图片描述

【2】删除pom.xml中多余的内容,留下如下内容
在这里插入图片描述

3.使用开发工具idea发布web项目

  • 使用maven骨架创建的项目

​ 【1】

在这里插入图片描述

​ 【2】

在这里插入图片描述

【3】

在这里插入图片描述

【4】

在这里插入图片描述

【5】

在这里插入图片描述

  • 不使用骨架

说明:在创建工程的时候已经指定了tomcat服务器,不用再指定

  • 启动tomcat并在浏览器访问

在这里插入图片描述

4.使用开发工具idea发布web项目的注意事项

学习目标
  • 掌握使用开发工具idea发布web项目的注意事项
内容讲解

注意啦:WEB-INF下面的内容我们无法通过浏览器访问。

【1】web项目的目录结构说明

在这里插入图片描述

注意:静态页面(html,css js)不能放到WEB-INF下面,浏览器无法访问

【2】将虚拟路径的项目删除,只保留/

在这里插入图片描述
在这里插入图片描述

【3】再次点击启动按钮弹出框

在这里插入图片描述

【4】去掉自动打开浏览器功能(了解)
在这里插入图片描述
在这里插入图片描述

【5】浏览器输入url地址访问tomcat服务器的疑惑

在这里插入图片描述

【6】idea中启动tomcat服务器会自动访问web目录下面的三个页面:index.html index.htm index.jsp

如果没有这三个资源就会报404

注意:自动访问上述三个资源的原因是:

在tomcat的配置文件web.xml中存在如下友好访问页面的配置:

<welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

【7】pom.xml 添加 Tomcat插件(了解)

<plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>80</port>
                    <path>/</path>
                </configuration>
</plugin>

3.Servlet概述(掌握)

学习目标

  • 掌握什么是Servlet以及作用

内容讲解

【1】Servlet介绍

在这里插入图片描述

1.Servlet是一个接口,即规范

2.定义的实现类必须实现接口中的所有的抽象方法

3.Servlet全称Server Applet 服务器端的程序。是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态web资源。其实servlet的实质就是java代码,通过java的API动态的向客户端输出内容,并且从客户端接收数据。

4.一个类要想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口

【2】Servlet作用

1)接收客户端的请求
2)处理业务逻辑
3)响应给浏览器客户端

在这里插入图片描述

内容小结

1.什么是Servlet?

Servlet全称Server Applet 服务器端的程序。是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态web资源。其实servlet的实质就是java代码,通过java的API动态的向客户端输出内容,并且从客户端接收数据

2.Servlet的作用?

1)接收客户端的请求
2)处理业务逻辑
3)响应给浏览器客户端

4.Servlet快速入门(重点)

学习目标

  • 在浏览器地址栏上直接访问java类

内容讲解

【1】步骤

1.创建web项目

2.导入servlet依赖

	<!--导入依赖-->
    <dependencies>
        <!--导入servlet依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>
    </dependencies>

3.在创建的web项目中自定义类实现Servlet接口

4.在自定义类中实现Servlet接口中的所有的抽象方法

5.在实现Servlet接口的service方法体中书写代码处理业务逻辑

void service(ServletRequest req, ServletResponse res)  

6.在web项目的核心配置文件web.xml中配置访问servlet的路径。

​ 说明:这样配置是告知tomcat有具体的Servlet类需要被访问。

7.启动tomcat

8.在浏览器中访问servlet类

【2】实现

1.创建maven的web项目

2.导入servlet的依赖

 		<!--servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <!--编译 测试需要,运行时不需要-->
            <scope>provided</scope>
        </dependency>

2.在创建的web项目中自定义类实现Servlet接口

3.在自定义类中实现Servlet接口中的所有的抽象方法

4.在实现Servlet接口的service方法体中书写代码处理业务逻辑

package com.lystar.sh.a_demo_01;

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

/*
    2.在创建的web项目中自定义类实现Servlet接口
 */
public class HelloWorldServlet implements Servlet{
    //3.在自定义类中实现Servlet接口中的所有的抽象方法

    //4.在实现Servlet接口的service方法体中书写代码处理业务逻辑
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service....");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }



    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }

}

5.在web项目的核心配置文件web.xml中配置访问servlet的路径。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
           version="3.1">
    <!--
       5.在web项目的核心配置文件web.xml中配置访问servlet的路径。
​	    说明:这样配置是告知tomcat有具体的Servlet类需要被访问。
    -->
    <!--
        1.<servlet> 表示将当前Servlet类注册到tomcat中,告知tomcat有一个类要被访问
    -->
    <servlet>
        <!--
            表示当前要被访问类的标识,在当前web.xml中要唯一,helloWorldServlet属于标识符
        -->
        <servlet-name>helloWorldServlet</servlet-name>
        <!--
            配置要访问 的servlet类,必须是类的全路径:包名.类名。
            说明:tomcat底层通过获取这里的类全路径使用反射技术调用当前类的无参构造方法创建对象
        -->
        <servlet-class>com.lystar.sh.a_demo_01.HelloWorldServlet</servlet-class>
    </servlet>
    <!--
        配置要访问的servlet类的映射路径
    -->
    <servlet-mapping>
        <!--这里要和上面的servlet-name文本值一致,这里找到上面的servlet-name-->
        <servlet-name>helloWorldServlet</servlet-name>
        <!--浏览器上地址栏上输入的映射路径及访问路径,这里必须加/-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

6.启动tomcat

在这里插入图片描述

7.在浏览器中访问servlet类

在这里插入图片描述

内容小结

1.使用浏览器访问java的类需要使用该类实现Servlet接口

5.Servlet的执行原理(掌握)

学习目标

  • 明确访问servlet的执行流程
  • 掌握servlet的原理

内容讲解

【1】执行流程:

在这里插入图片描述

【2】原理

说明:

1.当我们点击run运行的时候,tomcat之所以会启动,是因为程序入口(main方法)在tomcat中

2.tomcat开始运行,会加载web项目里面的配置文件web.xml(xml解析,读取数据)

​ 主要是根据url-pattern 找到对应的servlet-class

3.然后tomcat进入等待状态(永不停止,除非手动关闭)

4.当用户在浏览器中输入地址:http://localhost:8080/hello就会定位到tomcat的访问的项目下面的某个servlet中

5.tomcat会根据 /hello 的servlet的虚拟路径 找到HelloServlet的全限定名

6.tomcat底层通过反射创建HelloServlet的对象,并调用HelloServlet的service方法:

Class clazz = Class.forName("全限定名");
Servlet servlet = clazz.newInstance();//实际上HelloServlet对象,向上转型
servlet.service();

内容小结

1.servlet的原理

tomcat根据servlet的虚拟路径找到对应的Servlet类,然后使用反射技术创建Servlet类的对象,最后使用对象调用service方法处理业务逻辑。

6.Servlet生命周期(掌握)

内容讲解

【1】生命周期:

​ 指的是一个对象从生(创建)到死(销毁)的一个过程

【2】生命周期的api:

// 1. servlet对象创建完毕,使用对象调用此方法,初始化方法,只有在第一次访问的时候执行一次
public void init(ServletConfig servletConfig);
// 2. 用户访问servlet时,调用此方法 (每次访问都会调用一次)
public void service(ServletRequest servletRequest, ServletResponse servletResponse);
// 3. servlet对象销毁时,调用此方法
public void destroy();

【3】Servlet生命周期的api执行时机图解

在这里插入图片描述

1.当一个Servlet第一次被请求的时候,Servlet容器就会实例化该Servlet,一旦实例化好这个实例,该实例便会一直留在内存中,以便后续请求!
2.当一个Servlet实例刚被创建好之后,Servlet容器就调用init方法,该方法在整个生命周期只执行一次
3.当Servlet每次被请求的时候,Servlet容器都会去调用service方法
4.当web应用被取消部署的时候,Servlet容器就会调用Servlet的destroy方法
5.当Servlet的配置汇总加上了<load-on-startup>1</load-on-startup>的时候,那么Servlet就会在容器等到第一次被请求的时候才实例化

【4】代码实现

package com.lystar.sh.a_servlet_01;

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

public class Life01Servlet implements Servlet {
    /*
        反射调用无参构造方法创建对象
     */

    public Life01Servlet() {
        System.out.println("无参构造。。。。");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init。。。。");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service。。。。");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy。。。。");
    }
}

【5】结果:

在这里插入图片描述

内容小结

1.何时创建servlet?

第一次访问servlet的时候创建

2.谁创建的?

tomcat服务器创建的

3.创建对象时做了什么?

调用无参构造方法创建对象,然后立刻调用init初始化方法

4.每次访问servlet执行哪个方法

service方法

5.何时销毁servlet?

关闭tomcat服务器,调用destroy方法

7.服务器启动,立刻加载Servlet对象 (理解)

学习目标

  • 能够在web.xml中进行配置让服务器启动,立刻创建Servlet对象

内容讲解

【1】问题: 发现 init 默认第一次被访问的时候才调用,适合用来初始化项目数据

​ 如果项目数据很多, 加载就需要一定的时间,这样就会给用户的体验不好,因为要等比较久的时间

【2】 解决: 服务器一启动,就执行init方法

【3】实现:在web.xml核心配置文件中对应的servlet标签中按照如下配置:

注意:

1.使用标签进行配置,表示标记容器是否应该在启动的时候加载这个servlet,(实例化并调用其init()方法)

2.它的文本值必须是一个整数,表示servlet应该被载入的顺序

3.如果文本值是负数:默认值是-1 【用户第一次访问时,创建】

4.当值大于等于0时,表示容器在应用启动时就加载并初始化这个servlet;

5.正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

6.当值相同时,容器就会自己选择顺序来加载

 <servlet>
        <servlet-name>life01Servlet</servlet-name>
        <servlet-class>com.lystar.sh.a_servlet_01.Life01Servlet</servlet-class>
        <!--
            load-on-startup 标签可以让tomcat服务器启动就创建对应的servlet。标签文本值必须是整数:
            数字越小,创建servlet的优先级越高
        -->
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>life01Servlet</servlet-name>
        <url-pattern>/life01</url-pattern>
    </servlet-mapping>

内容小结

  1. load-on-startup 标签可以让tomcat服务器启动就创建对应的servlet。标签文本值必须是整数:
    数字越小,创建servlet的优先级越高,建议是大于等于0的整数

     <load-on-startup>2</load-on-startup>
    

​ 2.配置load-on-startup标签后servlet生命周期如下:

在这里插入图片描述

8.Servlet实现方式(重点)

一共有三种:

快捷键:
	1. ctrl + alt + u : 查看一个类的继承结构图
	2. ctrl + h : 这个类的简化版继承结构 

在这里插入图片描述

1.实现Servlet方式二_自定义类继承GenericServlet

学习目标

  • 编写Servlet实现类,只要重写service方法

内容讲解

【1】描述问题:

    Servlet中使用频率最高,最重要的方法是service方法(大部分场景)
	但是我们每次编写Servlet实现类,都是直接实现Servlet接口,重写5个抽象方法(太冗余了)

【2】解决问题:

我们可以自定义类继承GenericServlet抽象类,只在子类中重写service即可。不用重写所有的抽象方法。

【3】步骤:

1.自定义类继承GenericServlet类

2.在子类中重写service方法,处理业务逻辑

3.在web.xml中进行映射路径的配置

4.在浏览器客户端访问servlet类

【4】代码实现:

package com.lystar.sh.a_servlet_01;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

/*
1.自定义类继承GenericServlet类
 */
public class Demo01Servlet extends GenericServlet {


    //    2.在子类中重写service方法,处理业务逻辑
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service....");
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
           version="3.1">

    <!--3.在web.xml中进行映射路径的配置-->
    <servlet>
        <servlet-name>demo01Servlet</servlet-name>
        <servlet-class>com.lystar.sh.a_servlet_01.Demo01Servlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo01Servlet</servlet-name>
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>


</web-app>

内容小结

1.方式二的好处是只需要重写service方法,在方法体内部处理业务逻辑即可。

2.实现Servlet方式三_自定义类继承HttpServlet(掌握)

学习目标

  • 根据页面不同的请求方式执行具体的请求方法

内容讲解

【1】问题:

	  我们在前端的form表单中,method属性, 学习过有两种常用的请求方式(get/post)
	  我们现在的service方法是这样的: 用户发送请求,无论是什么请求方式,都会统一的执行service方法, 我们无法很好的区别是哪一种请       求方式

【2】解决问题:我们可以自定义类继承HttpServlet就可以根据不同的请求做不同的处理:get post

在这里插入图片描述

【3】步骤:

1.自定义类继承HttpServlet
2.在子类中根据不同的请求方式重写请求方式的方法:
	get请求---重写doGet方法
	post请求---重写doPost方法
3.在方法体中书写处理业务逻辑的代码
4.在web.xml中进行配置
5.浏览器客户端访问servlet

【4】实现

package com.lystar.sh.a_servlet_01;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    1.自定义类继承HttpServlet
 */
public class Demo02Servlet extends HttpServlet {
    /*
        	2.在子类中根据不同的请求方式重写请求方式的方法:
​			get请求---重写doGet方法
​			post请求---重写doPost方法
     */
    //	3.在方法体中书写处理业务逻辑的代码
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post....");
    }
}
	<!--4.在web.xml中进行配置-->
    <servlet>
        <servlet-name>demo02Servlet</servlet-name>
        <servlet-class>com.lystar.sh.a_servlet_01.Demo02Servlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo02Servlet</servlet-name>
        <url-pattern>/demo02</url-pattern>
    </servlet-mapping>

内容小结

1.实现servlet方式三的好处:

​ 1)可以根据不同的请求执行对应的方法

​ 2)可以处理满足http协议的请求和响应

2.对ServletRequest和HttpServletRequest接口的说明:

​ 这个对象封装了浏览器发送的所有请求数据,兼容大部分协议。HttpServletRequest是子接口,可以匹配http协议下的所有请求。

3.实现servlet方式三_继承HttpServlet的执行流程

学习目标

  • 能够说出继承HttpServlet方式的执行流程

内容讲解

疑问:就是正常浏览器访问tomcat服务器需要访问servlet接口中的service方法,但是方式三在子类中没有重写servlet中的service方法,只重写了doGet和doPost方法,那么底层是如何执行的呢?

在这里插入图片描述

内容小结

当我们访问自定义类的servlet的时候先访问HttpServlet类实现Servlet接口中的service方法,在service方法体中调用了重载的service方法,在该方法体内部获取请求方式,根据不同的请求方式来执行对应的方法。

get请求----doGet()方法
post请求---doPost()方法

注意:查看某个类的成员结构快捷键:alt+7

4.实现servlet的三种方式的总结

1.自定义类实现Servlet接口,重写所有的抽象方法,不能处理满足http协议的请求和响应
2.自定义类继承GenericServlet抽象类,该抽象类是Servlet接口的子类,这种方式只重写service方法即可,但是不能处理满足http协议的请求和响应,同时不能根据具体的请求方式执行具体的方法   
3.自定义类继承HttpServlet抽象类,该抽象类是GenericServlet的子类,根据不同的请求方式执行对应方法:掌握
    	get----doGet
    	post---doPost
  可以处理满足http协议的请求和响应

在这里插入图片描述

9.编写servlet常见问题

学习目标

  • 能够解决在编写servlet时常见的几个问题

内容讲解

1.遇到500错误

表示服务器内部异常。

在这里插入图片描述

2.遇到404错误

浏览器客户端访问服务器的资源不存在。

在这里插入图片描述

3.遇到405错误

服务器servlet没有重写doGet或者doPost方法。

在这里插入图片描述

内容小结

1.500错误

​ 服务器异常

2.404错误

​ 找不到资源

3.405错误

​ 如果我们不重写doGet/doPost方法, 那么父类的doGet/doPost方法会执行(继承),给浏览器响应一个错误: 状态码405 (http1.1)。

10.Servlet映射路径 理解

学习目标

  • 能够配置一个Servlet映射单个和多个url

内容讲解

【1】一个Servlet映射单个url

在这里插入图片描述

【2】一个Servlet映射多个url

在这里插入图片描述

注解版本:

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnim

11. Servlet映射路径配置规范(理解)

学习目标

  • 能够使用Servlet映射路径配置规范

内容讲解

servlet映射路径一共有四种:

1.完全路径匹配:就是访问什么在web.xml中配置什么路径。/hello /user 掌握

 package com.lystar.sh.a_servlet_01;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import java.io.IOException;
 
 public class PathOneServlet extends GenericServlet {
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("PathOneServlet....");
     }
 }
 
  <servlet>
         <servlet-name>pathOneServlet</servlet-name>
         <servlet-class>com.lystar.sh.a_servlet_01.PathOneServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>pathOneServlet</servlet-name>
         <!--完全路径匹配-->
         <url-pattern>/user/one</url-pattern>
     </servlet-mapping>

2.目录匹配:/user/* 只要访问以/user开始的的路径都可以访问

 package com.lystar.sh.a_servlet_01;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import java.io.IOException;
 
 public class PathTwoServlet extends GenericServlet {
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("PathTwoServlet....");
     }
 }
 
 <servlet>
         <servlet-name>pathTwoServlet</servlet-name>
         <servlet-class>com.lystar.sh.a_servlet_01.PathTwoServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>pathTwoServlet</servlet-name>
         <!--目录匹配-->
         <url-pattern>/user/*</url-pattern>
     </servlet-mapping>

3.后缀名匹配:*.do *.action 注意这里不能书写/ 访问以.do或者.action结尾的资源路径,后缀名都属于标识 符

 package com.lystar.sh.a_servlet_01;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import java.io.IOException;
 
 public class PathThrServlet extends GenericServlet {
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("PathThrServlet....");
     }
 }
 
  <servlet>
         <servlet-name>pathThrServlet</servlet-name>
         <servlet-class>com.lystar.sh.a_servlet_01.PathThrServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>pathThrServlet</servlet-name>
         <!--后缀名匹配,前面不能加/-->
         <url-pattern>*.do</url-pattern>
     </servlet-mapping>

4.缺省路径:/ 如果上述三种路径都不满足就访问缺省路径。

 package com.lystar.sh.a_servlet_01;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import java.io.IOException;
 
 public class PathFourServlet extends GenericServlet {
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("PathFourServlet....");
     }
 }
 
  <servlet>
         <servlet-name>pathFourServlet</servlet-name>
         <servlet-class>com.lystar.sh.a_servlet_01.PathFourServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>pathFourServlet</servlet-name>
         <!--缺省路径匹配-->
         <url-pattern>/</url-pattern>
     </servlet-mapping>

内容小结

上述访问路径的优先级: 完全路径匹配 > 目录匹配 > 后缀名匹配 > 缺省路径

12.绝对路径(掌握)

学习目标

  • 能够在代码中使用绝对路径

内容讲解

【1】绝对路径有两种写法:

 1.带网络三要素:
    http://ip地址:端口号/资源路径
 2.不带网络三要素:
    /资源路径   这里的/不能省略 ,要求访问的资源必须在同一个服务器上

【2】代码实现

html:

<a href="http://127.0.0.1:8080/pathAbso">带网络三要素的绝对路径</a><br>
<a href="/pathAbso">不带网络三要素的绝对路径</a><br>

Servlet:

package com.lystar.sh.b_servlet_02;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class PathAbso01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post....");
    }
}

web.xml

 	<servlet>
        <servlet-name>pathAbso01Servlet</servlet-name>
        <servlet-class>com.lystar.sh.a_servlet_01.PathAbso01Servlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>pathAbso01Servlet</servlet-name>
        <url-pattern>/pathAbso</url-pattern>
    </servlet-mapping>

内容小结

绝对路径的写法:

 1.带网络三要素:
    http://ip地址:端口号/资源路径
 2.不带网络三要素:
    /资源路径   这里的/不能省略 ,要求访问的资源必须在同一个服务器上

13.相对路径(理解)

学习目标

  • 能够理解什么是相对路径

内容讲解

【1】 相对路径:不是相对当前项目,而是针对当前浏览器地址栏上的url而言的。

【2】案例一:

 #假设我们在浏览器地址栏访问的页面路径: http://localhost:8080/demo01.html
 #而在demo01.html页面想使用相对路径访问servlet: http://localhost:8080/pathAbso
 	 说明:
        如果在http://localhost:8080/demo01.html 页面中访问 http://localhost:8080/pathAbso 该servlet,我们通过url		  观察发现只有最后一级目录不一样,所以在demo01.html页面中相对的路径的写法是:./pathAbso  这里的./表示当前路径 可以省         略不写即直接写 pathAbso
 	

demo01.html

	<a href="./pathAbso">相对路径</a><br>
    <a href="pathAbso">相对路径</a><br>

在这里插入图片描述

【3】案例二:

  # 如果在http://localhost:8080/aaa/demo02.html 页面中访问 http://localhost:8080/pathAbso 该servlet
    我们通过url观察发现在demo02.html也面中书写访问的servlet即pathAbso和当前页面的父目录aaa是同等目录,所以我这里先找该页面     的父目录,然后在找该servlet即pathAbso
    ../pathAbso    ../表示上一级目录或者父目录,找到父目录之后再找servlet即pathAbso

demo02.html

<a href="../pathAbso">相对路径</a><br>

在这里插入图片描述

内容小结

1.相对路径是不是相对当前项目,而是相对于当前浏览器地址栏上的url而言的

2.在相对路径写法中:

​ ./表示当前路径 可以省略不写

​ …/表示上一级目录或者父目录

14.Servlet3.0注解开发 (掌握)

学习目标

  • 掌握在idea中使用注解开发servlet

内容讲解

【1】问题

说明:之前我们都是使用web.xml进行servlet映射路径的配置。这样配置的弊端:web.xml中具有非常多个配置信息,显得非常臃肿并且容易出错。

【2】解决问题

使用web.xml配置映射路径的方式属于servlet2.5的技术。从servlet3.0开始引入注解配置访问servlet取代了web.xml配置。

【3】配置步骤:

1.在包上右键---new---servlet(create new Servlet)
2.输入类名
3.在方法体内输入逻辑代码
4.在浏览器地址栏中输入访问的路径

【4】实现

1.在包上右键—new—servlet(create new Servlet)

在这里插入图片描述

2.输入类名

3.在方法体内输入逻辑代码

package com.lystar.sh.c_servlet_anno_03;

import javax.servlet.ServletException;
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("/annoDemo01Servlet")
public class AnnoDemo01Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("注解开发");
    }
}

4.在浏览器地址栏中输入访问的路径

在这里插入图片描述

15.修改idea创建注解的servlet模板

学习目标

  • 能够在idea中修改创建Servlet的模板代码

内容讲解

1.File----Settings

在这里插入图片描述

2.找到servlet的模板,按照如下修改

在这里插入图片描述

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet("/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
            doGet(request,response);
}

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {

}
}

内容小结

1.在Servlet的模板代码中修改在doPost方法体中调用doGet方法

2.在Servlet的模板代码中修改WebServlet注解的属性值为:“/${Entity_Name}”

16.关于servlet3.0注解开发的疑问_配置路径省略了属性urlPatterns

学习目标

  • 能够理解servlet3.0注解开发配置路径的含义

内容讲解

正常我们在WebServlet注解中配置的路径赋值给属性urlPatterns,但是urlPatterns不能省略的,在一个注解中,如果含有多个属性,并且每个属性都有默认值,此时给value赋值可以省略value属性。

在这里插入图片描述

注意啦:在WebServlet注解中value等同于urlPatterns属性。

在这里插入图片描述

内容小结

1.在WebServlet注解中value等同于urlPatterns属性,实际开发中我们实际上省略的是value属性

17.HTTP协议(掌握)

1.HTTP协议介绍

学习目标

  • 掌握http协议概念和分类以及特点

内容讲解

【1】概念

全称:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。

简而言之:浏览器和服务器数据交换固定的格式。

【2】版本

HTTP协议版本如下:

​ 1). http1.0 (1996) : 每次请求都有一个新的连接(开销大,比较慢)
​ 2). http1.1 (1999) : 长连接,多个请求共用一个连接(开销小一些,比较快)
​ 传输的数据都是文本(比较慢)

【3】分类

分为两类:

​ 1)请求报文协议(浏览器发送给服务器的数据 ):1)请求行 2)请求头 3)请求体

​ 2)响应报文协议(服务器发送给浏览器的数据):1)响应行 2)响应头 3)响应体

【4】特点

​ 1.先有请求

​ 2.再有响应

​ 3.一个请求对应一个响应

内容小结

1.HTTP协议称为超文本传输协议,是浏览器和服务器数据交换固定的格式。

2.HTTP协议分为两类:

​ 1)请求报文协议:浏览器给服务器传输数据遵守的规范

​ 2)响应报文协议:服务器给浏览器传输数据遵守的规范

3.Http协议特点:

   		 1.先有请求
   				
   	​    2.再有响应
   				
   	​    3.一个请求对应一个响应

2.浏览器抓包观察请求报文协议

学习目标

  • 能够使用谷歌浏览器抓包并查看请求报文协议

内容讲解

【1】步骤

1.创建html页面
2.在html页面书写html代码
3.创建servlet
4.在servlet中书写java代码
5.启动服务器
6.打开浏览器,在浏览器访问页面,然后按f12 点击网络 network
7.抓包结果分析

【2】实现

1.创建html页面
2.在html页面书写html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h2>GET请求</h2>
<form action="/getServlet" method="get">
    用户名:<input type="text" name="username" value="zhangsan" /><br>
    密码:<input type="text" name="pwd" value="123" /><br>
    <input type="submit" value="提交"/>
</form>


<h2>POST请求</h2>
<form action="/postServlet" method="post">
    用户名:<input type="text" name="username" value="zhangsan"/><br>
    密码:<input type="text" name="pwd" value="123"/><br>
    <input type="submit" value="提交"/>
</form>

</body>
</html>

3.创建servlet
4.在servlet中书写java代码

package com.lystar.sh.d_http_04;

import javax.servlet.ServletException;
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("/getServlet")
public class GetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("get....");
    }
}



package com.lystar.sh.d_http_04;

import javax.servlet.ServletException;
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("/postServlet")
public class PostServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post....");
    }
}

5.启动服务器
6.打开浏览器,在浏览器访问页面,然后按f12 点击网络

在这里插入图片描述

7.抓包结果分析

在这里插入图片描述

内容小结

1.打开浏览器抓包工具快捷键:f12

2.请求报文协议的get请求和post请求区别:

1. GET请求:
	1)请求行直接传递请求参数.将请求参数追加在URL后面,不安全。例如:form.html?username=jack&username=1234
    补充:但是get请求可以作为商品的分享。
	2)URL长度限制(不同浏览器限制大小不一致),GET请求方式的数据大小,不可以传输数据量较大或者非文本数据。例如图片或者视频。
	3)请求体里面没有内容。

2.  POST请求:
	1)请求参数以请求体形式发送给服务器,数据传输安全。
	2)请求数据可以为非文本数据,可以传输数据量较大的数据。
	3)只有表单设置为method=”post”才是post请求.
    其他的都是get请求。常见GET请求:地址栏直接访问、<a href=””><img src=””> location.href=""等

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

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

相关文章

MyBatisPlus理解

MyBatisPlus是mybatis的增强&#xff0c;mybatis是数据库持久化的框架&#xff0c;但mybatisplus并不是替代mybatis&#xff0c;而是相辅相成的关系 MyBatisPlus不会对以前使用mybatis开发的项目进行影响&#xff0c;引入后仍然正常运行。 使用方法&#xff1a; 1.在引入了对…

IDM的使用详解 IDM是哪个国家的 IDM功能强大的网络下载器 idm下载

对于idm相信大家都不陌生&#xff0c;全称是Internet Download Manager。idm是一款非常经典、功能强大的Windows文件多线程下载加速软件&#xff0c;在电脑用户中口碑极好&#xff0c;被称为必装的HTTP下载神器。那么idm下载器是哪个国家的&#xff0c;idm下载器是哪个公司的呢…

重学SpringBoot3-集成Thymeleaf

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 重学SpringBoot3-集成Thymeleaf 1. 添加Thymeleaf依赖2. 配置Thymeleaf属性&#xff08;可选&#xff09;3. 创建Thymeleaf模板4. 创建一个Controller5. 运行应用并访问页面Thymeleaf基本语法小技巧 国际化步骤 …

【漏洞复现】华三用户自助服务产品dynamiccontent.properties.xhtml接口处存在RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

【python 】----Pytest基础知识与进阶知识

定义 用于编写和执行Python测试全功能测试框架(工具),是一个第三方库 安装 pip insatll pytest 安装pytest --version 校验 pytest的组成构成 不写调用语句也可以执行函数内容 在用例运行语句里面: -s:指的是开启与终端的交互,如果没有-s(程序不会输入与打印),一条用…

Tiktok/抖音旋转验证码识别方案

一、引言 在数字世界的飞速发展中&#xff0c;安全防护成为了一个不容忽视的课题。Tiktok/抖音&#xff0c;作为全球最大的短视频平台之一&#xff0c;每天都有数以亿计的用户活跃在其平台上。为了保护用户的账号安全&#xff0c;Tiktok/抖音引入了一种名为“旋转验证码”的安…

[数据结构]OJ用队列实现栈

225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 官方题解&#xff1a;https://leetcode.cn/problems/implement-stack-using-queues/solutions/432204/yong-dui-lie-shi-xian-zhan-by-leetcode-solution/ 首先我们要知道 栈是一种后进先出的数据结构&#xff0c…

[Spring] IoC 控制反转和DI依赖注入和Spring中的实现以及常见面试题

目录 1. 什么是Spring 2.什么是IoC容器 3.通过实例来深入了解IoC容器的作用 3.1造一量可以定义车辆轮胎尺寸的车出现的问题 3.2解决方法 3.3IoC优势 4.DI介绍 5.Spring中的IoC和DI的实现 5.1.存对象 5.1.2 类注解 5.1.3 方法注解 5.2取对像 (依赖注入) 5.2.1.属性…

esp32 idf.py cmd powershell 环境

esp32 idf.py cmd powershell 命令行 环境 win10 推荐使用 Windows Terminal 替换自己路径 设置–>添加新配置文件–>选择cmd 或者 powershell -->保存–> 去修改命令行 启动目录&#xff0c;推荐使用父进程目录 powershell C:\WINDOWS/System32/WindowsPowe…

Docker 容器化技术:构建高效、可移植的开发环境和部署流程|Docker 概述

容器技术是云原生的核心技术之一&#xff0c;利用容器化技术&#xff0c;可以将微服务以及它所需要的配置、依赖关系、环境变了等都可以便捷地部署到新的服务器节点上&#xff0c;而不用再次重新配置&#xff0c;这就使得微服务具备了强大的可移植性。 一、Docker 概述 Docke…

【前端系列】CSS 常见的选择器

CSS 常见的选择器 CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页样式的标记语言&#xff0c;它定义了网页中各个元素的外观和布局。在 CSS 中&#xff0c;选择器是一种用于选择要应用样式的 HTML 元素的模式。选择器允许开发人员根据元素的类型、属性、关系等来选…

Android平台实现无纸化同屏并推送RTMP或轻量级RTSP服务(毫秒级延迟)

技术背景 在写这篇文章之前&#xff0c;实际上几年之前&#xff0c;我们就有非常稳定的无纸化同屏的模块&#xff0c;本文借demo更新&#xff0c;算是做个新的总结&#xff0c;废话不多说&#xff0c;先看图&#xff0c;本文以Android平台屏幕实时采集推送&#xff0c;Windows…

javaEE6(网站第3章-jsp练习中三个例题动手做一遍;课后题2(1),(2))

两个数求和 用javascript实现。 输入、处理、输出用同一个页面(自己处理自己)。 输入1.jsp&#xff0c;处理和输出2.jsp。 &#xff08;4&#xff09;输入1.jsp&#xff0c;处理2.jsp&#xff0c;处理完转回1.jsp显示结果。 &#xff08;5&#xff09;输入1.jsp&#xff0c;处…

【Prometheus】k8s集群部署node-exporter

​ 目录 一、概述 1.1 prometheus简介 1.2 prometheus架构图 1.3 Exporter介绍 1.4 监控指标 1.5 参数定义 1.6 默认启用的参数 1.7 prometheus如何收集k8s/服务的–三种方式收集 二、安装node-exporter组件 【Prometheus】概念和工作原理介绍-CSDN博客 【云原生】ku…

堆宝塔(Python)

作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于…

计算表达式x*(2^i)的值math.ldexp(x, i)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算表达式x*(2^i)的值 math.ldexp(x, i) [太阳]选择题 关于以下代码输出的结果说法正确的是&#xff1f; import math print("【执行】math.ldexp(3,2)") print(math.ldexp(3,2)) …

PromptBreeder---针对特定领域演化和发展提示词的方法

原文地址&#xff1a;promptbreeder-evolves-adapts-prompts-for-a-given-domain 论文地址&#xff1a;https://arxiv.org/pdf/2309.16797.pdf 2023 年 10 月 6 日 提示方法分为两大类 硬提示是由人工精心设计的文本提示&#xff0c;包含离散的输入令牌&#xff1b;其缺点…

报名开启丨掘金海外,探寻泛娱乐社交APP出海新风口

随着国内泛娱乐行业用户规模趋于见顶&#xff0c;泛娱乐社交APP转向出海是必然趋势。 根据行业数据显示&#xff0c;有超过35%的国内实时社交企业已启动或者正在规划出海&#xff0c;而其中出海商户的音视频流量增长均超过了100&#xff05;。尤其是在东南亚、中东、拉美等新兴…

简介:CMMI软件能力成熟度集成模型

前言 CMMI是英文Capability Maturity Model Integration的缩写。 CMMI认证简称软件能力成熟度集成模型&#xff0c;是鉴定企业在开发流程化和质量管理上的国际通行标准&#xff0c;全球软件生产标准大都以此为基点&#xff0c;并都努力争取成为CMMI认证队伍中的一分子。 对一个…

Java算法之动态规划

Java算法之动态规划 前言 ​ 最近这一段时间一直在刷算法题&#xff0c;基本上一有时间就会做一两道&#xff0c;这两天做了几道动态规划的问题&#xff0c;动态规划之前一直是我比较头疼的一个问题&#xff0c;感觉好复杂&#xff0c;一遇到这样的问题就想跳过&#xff0c;昨…