tomcat&Servlet

http&tomcat&Servlet

一、WEB开发介绍

1.WEB资源分类

1.1.什么是web

​ WEB,在英语中web即表示网页的意思,它用于表示Internet主机(服务器)上供外界访问的资源

1.2.WEB资源分类
  • 静态资源
    • web页面中供人们浏览的数据始终是不变 (eg: html,css,js、音视频)
  • 1.2.2 动态资源
    • 指web页面中供人们浏览的数据是由程序产生的,不同的用户或者不同时间点访问web页面看到的内容各不相同。(eg: servlet,jsp)

2.软件架构(理解)

2.1架构类别
  • C/S架构

​ Client / Server,客户端和服务器端,用户需要安装专门客户端程序。

  • B/S架构

​ Browser / Server,浏览器和服务器端,不需要安装专门客户端程序,浏览器是操作系统内置。

2.2B/S 和C/S交互模型的比较
  • 相同点

    ​ 都是基于请求-响应交互模型:即浏览器(客户端) 向 服务器发送 一个 请求。服务器 向 浏览器(客户端)回送 一个 响应 。

    ​ 必须先有请求 再有响应

    ​ 请求和响应成对出现

  • 不同点

    ​ 实现C/S模型需要用户在自己的操作系统安装各种客户端软件(百度网盘、腾讯QQ等);实现B/S模型,只需要用户在操作系统中安装浏览器即可。

注:B/S模型可以理解为一种特殊C/S模型。

3.web通信【重点】

  1. 浏览器必须先请求服务器, 服务器处理请求, 给浏览器响应
  2. 一次请求, 一次响应
  3. 先有请求,再有响应
  4. 请求响应基于HTTP协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i8TWmsD7-1629030915958)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/image-20191208091344175.png)]

二、服务器(重点)

1.服务器介绍

1.1 什么是服务器

​ 服务器就是一个软件,任何电脑只需要安装上了服务器软件, 我们的电脑就可以当做一台服务器了.

​ 服务器: 硬件(电脑)+软件(mysql, tomcat,nginx)

1.2 常见web服务器
  • WebLogic

    ​ Oracle公司的产品,是目前应用比较多的Web服务器,支持J2EE规范。WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。

    在这里插入图片描述

  • WebSphere

    ​ IBM公司的WebSphere,支持JavaEE规范。WebSphere 是随需应变的电子商务时代的最主要的软件平台,可用于企业开发、部署和整合新一代的电子商务应用。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SotAkI0C-1629030915964)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555895215122.png)]

  • Glass Fish

    ​ 最早是Sun公司的产品,后来被Oracle收购,开源免费,中型服务器。

  • JBoss

    ​ JBoss公司产品,开源,支持JavaEE规范,占用内存、硬盘小,安全性和性能高。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDTApBxf-1629030915966)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555895293155.png)]

  • Tomcat

    ​ 中小型的应用系统,免费,开源,效率特别高, 适合扩展(搭集群)支持JSP和Servlet.

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FxhdFhBD-1629030915973)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555895400407.png)]

2.tomcat介绍、安装和使用

2.1概述

​ Tomcat服务器是一个免费的开放源代码的Web应用服务器。

​ Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet 和JSP规范总是能在Tomcat中得到体现。

​ 因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,是目前比较流行的Web应用服务器。

2.2tomcat的下载

强调: 我们使用的软件版本,要和老师用的版本一致

目前阶段:

​ jdk8、mysql5、tomcat8

  1. 先去官网下载:http://tomcat.apache.org/,选择tomcat8版本(资料已提供)(红框所示)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JM5bDeFC-1629030915975)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/01.png)]

  2. 选择要下载的文件(红框所示):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sgiifqHv-1629030915976)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/02.png)]

    tar.gz 文件 是linux操作系统下的安装版本

    exe文件是window操作系统下的安装版本

    zip文件是window操作系统下压缩版本(我们选择zip文件)

  3. 下载完成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UetZ2XOw-1629030915978)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/03.png)]

2.3 tomcat服务器软件安装
  1. 直接解压当前这个tomcat压缩包:(不要有中文,不要有空格)

  2. 配置环境变量:

    tomcat运行依赖于java环境:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Swz5htao-1629030915979)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/05.png)]

2.4tomcat的目录结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I4o4Fi7j-1629030915981)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_5.png)]

2.5启动与关闭tomcat服务器
  1. 启动tomcat服务器

    查找tomcat目录下bin目录,查找其中的startup.bat命令,双击启动服务器:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b0b98AEE-1629031257391)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/06.png)]

    启动效果:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I709iKeA-1629030915985)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/07.png)]

  2. 测试访问tomcat服务器

    打开浏览器在,在浏览器的地址栏中输入:

    http://127.0.0.1:8080或者http://localhost:8080

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCdP4UTk-1629030915986)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/08.png)]

    注: Localhost相当于127.0.0.1

  3. 关闭tomcat服务器

    查找tomcat目录下bin目录,查找其中的shutdown.bat命令,双击关闭服务器:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ub41HTCd-1629030915986)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/09.png)]

小结(常见问题)

安装注意点
  • 解压到一个==没有中文和空格目录下
  • 使用之前, 配置java_home和path(jdk环境变量)
    • java_home 不要配到bin目录,配到jdk的安装目录
    • path 才是配到bin目录
端口号冲突

​ 报如下异常: java.net.BindException: Address already in use: JVM_Bind 8080

​ 解决办法:

​ 第一种:修改Tomcat的端口号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AuCMfjLj-1629030915987)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_100.png)]

​ 修改conf/server.xml , 第70行左右

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qCi4EqE5-1629030915987)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_3.png)]

第二种:查询出来哪一个进程把8080占用了, 结束掉占用8080端口后的程序

​ 打开命令行输入: netstat -ano

​ 找到占用了8080 端口的 进程的id

​ 去任务管理器kill掉这个id对应的程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CrX9Nyq-1629030915988)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_4.png)]

JAVA_HOME没有配置
  • 会出现闪退 (如果java_home配置了还是闪退 忽略它了, 后面在IDEA里面进行启动, 就没有这个问题)

3.运用Tomcat服务器部署WEB项目

3.1标准的JavaWeb应用目录结构(不要去看)
  WebAPP(文件夹,项目)  
   		|---静态资源: html,css,js,图片(它们可以以文件存在,也可以以文件夹存在)  
   		|---WEB-INF 固定写法。此目录下的文件不能被外部(浏览器)直接访问
   			|---lib:jar包存放的目录
   			|---web.xml:当前项目的配置文件(3.0规范之后可以省略)
   			|---classes:java类编译后生成class文件存放的路径
3.2 发布项目到tomcat
3.2.1 方式一:直接发布

​ 只要将准备好的web资源直接复制到tomcat/webapps文件夹下,就可以通过浏览器使用http协议访问获取

3.2.2方式二: 虚拟路径的方式发布项目
  1. 第一步:在tomcat/conf目录下新建一个Catalina目录(如果已经存在无需创建)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xRUOQZm0-1629030915988)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/26.png)]

  1. 第二步:在Catalina目录下创建localhost目录(如果已经存在无需创建)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUGfv1he-1629030915989)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/27.png)]

  1. 第三步:在localhost中创建xml配置文件,名称为:随便写,比如叫做second.xml(注:这个名称是浏览器访问路径)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-scUYCZjq-1629030915990)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/28.png)]

  1. 第四步:添加second.xml文件的内容为: docBase就是你需要作为虚拟路径的项目的路径

    <?xml version = "1.0" encoding = "utf-8"?>
    <Context docBase="C:\JavaEE_Relation\day24_html" />
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6pZ1QZnV-1629030915990)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1537667265350.png)]

  2. 第五步:直接访问(通过写配置文件的路径来访问):

    http://localhost:8080/second/a.html (second就是配置文件的名字, 映射成了myApp)

三、http协议

1.http协议概述

1.1什么是HTTP协议

​ HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,传输HTML文件。

​ HTTP是互联网上用的最多的一个协议, 所有的www开头的都是遵循这个协议的(可能是https)

1.2HTTP协议的作用

​ HTTP作用:用于定义WEB浏览器与WEB服务器之间交换数据的过程和数据本身的内容

​ 浏览器和服务器交互过程: 浏览器请求, 服务请求响应

​ 请求(请求行,请求头,请求体)

​ 响应(响应行,响应头,响应体)

2.请求部分(了解)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Uk8M1On-1629030915991)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_14.png)]

  • get方式请求
【请求行】
GET /myApp/success.html?username=zs&password=123456 HTTP/1.1

【请求头】
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 41723-10011
Referer: http://localhost:8080/myApp/login.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (MSIE 9.0; qdesk 2.4.1266.203; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
Cookie: Idea-b77ddca6=4bc282fe-febf-4fd1-b6c9-72e9e0f381e8
  • post请求
【请求行】
POST /myApp/success.html HTTP/1.1

【请求头】
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 37569-10012
Referer: http://localhost:8080/myApp/login.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (MSIE 9.0; qdesk 2.4.1266.203; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 27
Connection: Keep-Alive
Cache-Control: no-cache

【请求体】
username=zs&password=123456
2.1请求行
  • 请求行
GET  /myApp/success.html?username=zs&password=123456 HTTP/1.1	
POST /myApp/success.html HTTP/1.1
  • 请求方式(8种,put,delete等)

    ​ GET:明文传输, 不安全,参数跟在请求路径后面,对请求参数大小有限制,

    ​ POST: 暗文传输,安全一些,请求参数在请求体里,对请求参数大小没有有限制,

  • URI:统一资源标识符(即:去掉协议和IP地址部分)

  • 协议版本:HTTP/1.1

2.2请求头

​ 从第2行到空行处,都叫请求头,以键值对的形式存在,但存在一个key对应多个值的请求头.

作用:浏览器告诉服务器自己相关的设置.

  • Accept:浏览器可接受的MIME类型 ,告诉服务器客户端能接收什么样类型的文件。
  • User-Agent:浏览器信息.(浏览器类型, 浏览器的版本…)
  • Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
  • Content-Length:表示请求参数的长度
  • Host:初始URL中的主机和端口
  • Referrer:从哪里里来的(之前是哪个资源)、防盗链
  • Content-Type:内容类型,告诉服务器,浏览器传输数据的MIME类型,文件传输的类型,application/x-www-form-urlencoded .
  • Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip
  • Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接 )
  • Cookie:这是最重要的请求头信息之一(会话技术, 后面会有专门的时间来讲的)
  • Date:Date: Mon, 22Aug 2011 01:55:39 GMT请求时间GMT
2.3请求体

​ 只有请求方式是post的时候,才有请求体. 即post请求时,请求参数(提交的数据)所在的位置

3.响应部分(了解)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9yXsReTs-1629030915991)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_15.png)]

  • 响应部分

    【响应行】
    HTTP/1.1 200 OK
    
    【响应头】
    Accept-Ranges: bytes
    ETag: W/"143-1557909081579"
    Last-Modified: Wed, 15 May 2019 08:31:21 GMT
    Content-Type: text/html
    Content-Length: 143
    Date: Sun, 08 Dec 2019 02:20:04 GMT
    
    【响应体】
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        Success
    </body>
    </html>
    
2.1响应行
HTTP/1.1 200
  • 协议/版本

  • 响应状态码 (记住-背诵下来)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S1riUVQY-1629030915992)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_20.png)]

    ​ 200:正常,跟服务器连接成功,发送请求成功

    ​ 302:重定向(跳转)

    ​ 304:读取缓存,表示客户机缓存的版本是最新的,客户机可以继续使用它,无需到服务器请求. 读取缓存

    ​ 403: forbidden 权限不够,服务器接收到了客户端的请求,但是拒绝处理

    ​ 404:服务器接收到了客户端的请求,但是我服务器里面没有你要找的资源

    ​ 500:服务器接收到了客户端的请求,也找到了具体的资源处理请求,但是处理的过程中服务器出异常了

2.2响应头

响应头以key:vaue存在, 可能多个value情况. 服务器指示浏览器去干什么,去配置什么.

a.mp3 b.mp4

  • Refresh: 5;url=http://www.baidu.com 指示客户端刷新频率。单位是秒 eg: 告诉浏览器5s之后跳转到百度

  • Content-Disposition: attachment; filename=a.jpg 指示客户端(浏览器)下载文件

  • Content-Length:80 告诉浏览器正文的长度

  • Server:apachetomcat 服务器的类型

  • Content-Encoding: gzip服务器发送的数据采用的编码类型

  • Set-Cookie:SS=Q0=5Lb_nQ;path=/search服务器端发送的Cookie

  • Cache-Control: no-cache (1.1)

  • Pragma: no-cache (1.0) 表示告诉客户端不要使用缓存

  • Connection:close/Keep-Alive

  • Date:Tue, 11 Jul 2000 18:23:51 GMT

2.3响应体

​ 页面展示内容, 和网页右键查看的源码一样

四、Servlet入门(最重要的东西)

1.使用IDEA创建web工程配置tomcat

1.1.配置tomcat

我们要将idea和tomcat集成到一起,可以通过idea就控制tomcat的启动和关闭:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-prn9aznv-1629030915993)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555838575577.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TkHHbbz3-1629030915993)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555838600225.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rrsIvtzq-1629030915994)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555838669879.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k9Asqzqj-1629030915995)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555838727262.png)]

2.2.创建JavaWeb工程
2.2.1web工程创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lOh8gYB8-1629030915996)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/200.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JaQKMcj7-1629030915997)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555902807303.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2RQ0hld-1629030915999)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555902832195.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uDV5GF53-1629030916002)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555902959035.png)]

2.2.2 发布
  • 情况一: 已经关联成功的情况(因为我创建项目的时候, 已经选择了tomcat)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oZzNPTqY-1629030916004)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555903047439.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SL6LpzSN-1629030916006)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555903115979.png)]

  • 情况二: 如果之前没有选择tomcat, 现在就需要自己关联发布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xZL9FrbD-1629030916007)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555903217846.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RmGnAljS-1629030916009)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555903238067.png)]

2.Servlet概述

2.1 什么是Servlet

​ Servlet **运行在服务端(tomcat)**的Java小程序(对象),是sun公司提供一套规范. 就是动态资源

2.2Servlet作用

​ 用来接收、处理客户端请求、响应给浏览器的动态资源。

​ 但servlet的实质就是java代码,通过java的API动态的向客户端输出内容

2.3 servlet与普通的java程序的区别
  1. 必须实现servlet接口
  2. 必须在servlet容器(服务器 tomcat)中运行
  3. servlet程序可以接收用户请求参数以及向浏览器输出数据

案例-Servlet入门案例

1.需求

​ 在IDEA编写Servlet,发布到Tomcat. 在浏览器输入路径请求, 控制台打印Hello…

2.分析
2.1配置文件方式实现
  1. 创建web工程
  2. 创建一个类实现Servlet接口
  3. 在web.xml配置servlet的映射路径
2.2注解方式实现
  1. 创建web工程
  2. 创建一个类实现Servlet接口
  3. 在这个类上面添加@WebServlet(“访问的路径”)
3.实现
3.1配置文件方式实现
  • 在com.work.web包下创建一个类实现Servlet接口
package com.work.web;


import javax.servlet.*;
import java.io.IOException;
public class ServletDemo01 implements Servlet {

    @Override
    //服务方法: 处理请求的
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        System.out.println("hello world...");
    }


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

    }

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



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

    @Override
    public void destroy() {

    }
}

  • web.xml配置(该文件在web/WEB-INF 文件夹下):
<?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_2_5.xsd"
           version="2.5">

    <!--配置Servlet-->
    <servlet>
        <!--servlet-name: 名字 随便取; 一般就是类名-->
        <servlet-name>ServletDemo01</servlet-name>
        <!--servlet-class:Servlet这个类的全限定名-->
        <servlet-class>com.work.web.ServletDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--servlet-name: 必须和servlet标签里面的servlet-name一样-->
        <servlet-name>ServletDemo01</servlet-name>
        <!--url-pattern: 配置访问的路径-->
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>

</web-app>

3.2注解方式实现
  • 在com.work.web包下创建一个类实现Servlet接口, 添加注解
package com.work.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo02")
public class ServletDemo02 implements Servlet{

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


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

    }

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



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

    @Override
    public void destroy() {

    }
}

浏览器地址栏输入:http://localhost:8080/demo02

4.小结
4.1 如果出现实现Servlet报错
  • 检查当前的工程是否依赖了Tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K4FvPSnZ-1629030916010)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555904633352.png)]

  • 如果没有依赖, 依赖tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PtGKlnw-1629030916011)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555905478996.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zyI8RJQK-1629030916012)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555905493524.png)]

4.2配置文件方式与注解方式比较

​ 注解方式简化的javaweb代码开发,可以省略web.xml配置文件.

​ 但是配置文件方式必须掌握的(后面在框架或者大项目里面会使用到的)

3.入门案例原理和路径

3.1Servlet执行原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KEaGaP6u-1629030916013)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_31.png)]

通过上述流程图我们重点需要掌握如下几个点:

  • Servlet对象是由服务器创建(反射)
  • request与response对象也是由tomcat服务器创建
  • service()方法也是服务器调用的
3.3 Servlet路径的配置url-pattern

url-pattern配置方式共有三种:

  • 完全路径匹配: 以 / 开始. 注: 访问的路径不能多一个字母也不能少一个
例如: 配置了/demo01  请求的时候必须是: /demo01  
  • 目录匹配"以 / 开始需要以 * 结束. 注: Servlet里面用的 不多, 但是过滤器里面通常就使用目录匹配
例如:  配置/* 访问/a, /aa, /aaa; 配置 /aa/*  访问 /aa/b , /aa/cc
  • 扩展名匹配不能以 / 开始, 以 * 开始的 .
例如:  *.action;  访问: aa.action, bb.action, c.action;   错误写法: /*.do, 不可以写*.jsp,*.html

注意的地方:

  • 一个路径只能对应一个servlet, 但是一个servlet可以有多个路径

  • tomcat获得匹配路径时,优先级顺序:完全路径匹配> 目录匹配 > 扩展名匹配

五、Servlet进阶

1.Servlet的生命周期

Servlet生命周期描述【面试题】

​ 默认情况下, 第一次请求的时候, 调用init()方法进行初始化【调用一次】

​ 任何一次请求, 都会调用service()方法进行处理这个请求

​ 服务器正常关闭/项目从服务器移除, 调用destory()方法进行销毁【调用一次】

Servlet是单例多线程的

1.1.Servlet生命周期方法

​ servlet从创建到销毁的过程

​ 出生:(初始化)用户第一次访问时执行。

​ 活着:(服务)应用活着。每次访问都会执行。

​ 死亡:(销毁)应用卸载。

​ serrvlet生命周期方法:

​ init(ServletConfig config)

​ service(ServletRequest req, ServletResponse res)

​ destroy()

1.2.Servlet生命周期描述
  1. 常规【重点】

    ​ 默认情况下, 来了第一次请求, 会调用init()方法进行初始化【调用一次】

    ​ 任何一次请求 都会调用service()方法处理这个请求

    ​ 服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁【调用一次】

  2. 扩展

    ​ servlet是单例多线程的, 尽量不要在servlet里面使用值可变的全局(成员)变量,可能会导致线程不安全

    ​ 单例: 只有一个对象(init()调用一次, 创建一次)

    ​ 多线程: 服务器会针对每次请求, 开启一个线程调用service()方法处理这个请求

1.3. ServletConfig【了解】

​ Servlet的配置对象, 可以使用用ServletConfig来获得Servlet的初始化参数,在SpringMVC里面会遇到

  • 先在配置文件里面配置初始化参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ul4v4R2P-1629030916014)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1537837644263.png)]

  • 可以通过akey获得aaa

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-npSu7fwg-1629030916015)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1537837616004.png)]

1.4 启动项

​ Servlet默认情况下什么是创建? 默认情况下是第一次请求的时候.

​ 如果我想让Servlet提前创建(服务器启动的时候), 这个时候就可以使用启动项 在SpringMVC里面会遇到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K41jQiZE-1629030916016)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1555981767256.png)]

2.Servlet体系结构(重点)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7j9DDnRg-1629030916017)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_30-1571447571193.png)]

  • Servlet接口

    ​ 前面我们已经学会创建一个类实现sevlet接口的方式开发Servlet程序,实现Servlet接口的时候,我们必须实现接口的所有方法。但是,在servlet中,真正执行程序逻辑的是service,对于servlet的初始化和销毁,由服务器调用执行,开发者本身不需要关心。因此,有没有一种更加简洁的方式来开发servlet程序呢?

我们先来查阅API回顾Servlet接口:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U0he8ffT-1629030916018)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_32-1571447571193.png)]

​ 由上图可知在servlet接口规范下,官方推荐使用继承的方式,继承GenericServlet 或者HttpServlet来实现接口,那么我们接下来再去查看一下这两个类的API:

  • GenericServlet 类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-THrI0xPh-1629030916018)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_33-1571447571193.png)]

​ 阅读上图API可知,GenericServlet 是一个类,它简化了servlet的开发,已经提供好了一些servlet接口所需的方法,我们开发者只需要重写service方法即可

我们来使用GenericServlet 创建servlet:

  1. 创建一个类
  2. 继承GenericServlet
  3. 重写service方法
package cn.itcast.web;

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

@WebServlet(name = "GenericDemoServlet",urlPatterns = "/generic")
public class GenericDemoServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("GenericDemoServlet执行.......");
    }
}

​ 虽然,GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,因此,sun公司又专门提供了HttpServlet,来适配这种协议下的开发。

  • HttpServlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sqPoACFJ-1629030916019)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_34-1571447571193.png)]

阅读上图的API可知,继承HttpServlet,我们需要重写doGet、doPost等方法中一个即可,根据Http不同的请求,我们需要实现相应的方法。

我们来使用HttpServlet创建servlet:

  1. 创建一个类
  2. 继承HttpServlet
  3. 重写doGet方法和doPost方法
/**
 * 包名:com.servlet
 *
 * @author Leevi
 * 日期2020-07-11  15:39
 * Servlet的常用的编写方法:
 * 1. 写一个类继承HttpServlet,重写doGet和doPost方法
 *    1.1 doGet()方法,是处理来自客户端的get请求
 *    1.2 doPost()方法,是处理来自客户端的post请求
 *
 *    通常情况下:服务器端针对同一个请求(不同的请求方式)不会做不同的处理,所以我们会选择在doGet中调用doPost
 * 2. 配置servlet的映射路径
 */
@WebServlet("/demo02")
public class ServletDemo02 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("编写很多代码处理这次post请求");
    }
}

​ 通过以上两个API阅读,同学们注意一个细节HttpServlet是GenericServlet的子类,它增强了GenericServlet一些功能,因此,在后期使用的时候,我们都是选择继承HttpServlet来开发servlet程序。

案例:登录

流程分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9XgDlap-1629030916020)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/login.jpg)]

代码

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
    <!--
        怎么在页面上指定提交给LoginServlet
        项目的虚拟路径/servlet的映射路径
    -->
    <form action="/LoginDemo/login" method="post">
        用户名<input type="text" name="username"><br>
        密码<input type="text" name="password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

LoginServlet

package com.servlet;

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;

/**
 *
 * @author Leevi
 * 日期2020-07-11  15:59
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 使用request获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //2. 校验用户名和密码
        if ("jay".equals(username) && "123456".equals(password)) {
            //登录成功
            response.getWriter().write("login success");
        }else {
            //登录失败
            response.getWriter().write("login failed");
        }
    }
}

六、ServletContext

1.ServletContext概述

1.1 servletContext概述

​ ServletContext: 是一个全局对象, 上下文对象.

​ 服务器为每一个应用(项目)都创建了一个ServletContext对象。 ServletContext属于整个应用(项目)的,不局限于某个Servlet。并且整个项目有且只会有一个ServletContext对象

1.2 ServletContext作用

​ 作为域对象存取数据,让Servlet共享(掌握)

​ 获得文件MIME类型(文件下载)(了解)

​ 获得全局初始化参数(了解)

​ 获取web资源路径 ,可以将Web资源转换成字节输入流(掌握)

2.ServletContext的功能

2.1作为域对象存取值【重点】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y44Uvuha-1629030916022)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/image-20191208154333086.png)]

  1. API

    • getAttribute(String name) ;向ServletContext对象的map取数据
    • setAttribute(String name, Object object) ;从ServletContext对象的map中添加数据
    • removeAttribute(String name) ;根据name去移除数据
  2. 代码

    • ServletDemo01
   package com.servlet;
   
   import javax.servlet.ServletContext;
   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;
   
   /**
   - 包名:${PACKAGE_NAME}
   *
   - @author Leevi
     - 日期2020-07-11  16:11
     - 目标: 在ServletDemo02中获取servletDemo01中的一个变量的值
     - 1. 获取ServletContext对象:
     - getServletContext()
   */
   @WebServlet("/demo01")
   public class ServletDemo01 extends HttpServlet {
       @Override
       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           doGet(request, response);
       }
       @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           String name = "周杰棍";
           //1. 获取ServletContext对象
           ServletContext servletContext = getServletContext();
           //2. 往容器ServletContext中存值
           servletContext.setAttribute("name",name);
       }
   }
  • ServletDemo02
package com.servlet;

import javax.servlet.ServletContext;
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;
/**

- 包名:${PACKAGE_NAME}
*
- @author Leevi
- 日期2020-07-11  16:11
*/
@WebServlet("/demo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 获取那个容器ServletContext
        ServletContext servletContext = getServletContext();
        //2. 从容器ServletContext中获取数据
        String name = (String) servletContext.getAttribute("name");

        System.out.println("在ServletDemo02中获取的name是:" + name);
    }
}  
2.2 获得文件mime-type(了解)
  1. getMimeType(String file)
  2. 代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据文件名获得文件的mini类型
//1.获得ServletContext
//2.调用getMimeType()方法
String file01 = "a.mp3";
String file02 = "b.png";
String mimeType01 = getServletContext().getMimeType(file01);
String mimeType02 = getServletContext().getMimeType(file02);

response.getWriter().print("ServletDemo05..."+mimeType01+":"+mimeType02);

}
2.3.获得全局初始化参数(了解)
  • String getInitParameter(String name) ; //根据配置文件中的key得到value;

在web.xml配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VI9mdiVK-1629030916023)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1537841534534.png)]

通过ServletContext来获得

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UtObVGrb-1629030916026)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/1537841552654.png)]

2.4 获取web资源路径
  1. API
    • String getRealPath(String path);根据资源名称得到资源的绝对路径.
    • getResourceAsStream(String path) ;返回制定路径文件的流

注意: filepath:直接从项目的根目录开始写

  1. 代码
/**
 * 包名:${PACKAGE_NAME}
 * @author Leevi
 * 日期2020-07-11  16:41
 * 使用ServletContext获取web里面的资源文件的真实路径
 * 目标: 使用字节输入流,读取mm.jpg这张图片
 *     方法1: FileInputStream
 *     方法2: ClassLoader
 *     方法3: 使用ServletContext
 *
 * 在web项目中,将文件转换成流,有两种方式
 * 1. 如果文件在resources里面,使用类加载器
 * 2. 如果文件在web里面,使用ServletContext
 */
@WebServlet("/demo04")
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //方法1: 使用FileInputStream,此时使用磁盘路径
        //InputStream is = new FileInputStream("C:/JavaEE_Relation/day24_servletcontext_03/web/mm.jpg");
        //方法2: 使用ClassLoader将文件转换成流
        //InputStream is = ServletDemo04.class.getClassLoader().getResourceAsStream("../../mm.jpg");

        //方法3: 使用ServletContext可以获取web里面的资源的真实路径
        ServletContext servletContext = getServletContext();
        //String realPath = servletContext.getRealPath("mm.jpg");

        InputStream is = servletContext.getResourceAsStream("mm.jpg");
        System.out.println(is);
    }
}
2.5.小结
  1. 作为域对象存取数据【共享】

    • setAttribute(String name,Object value) 存
    • getAttribute(String name) 取
    • removeAttribute(String name) 移除
  2. 获得文件的Mime类型

    • getMineType(String fileName);
  3. 获得全局初始化参数

    • 在web.xml配置
    • getInitParameter(String name);
  4. 获得web资源路径【已经在web目录了】

    • getRealPath(String file); 获得文件的绝对路径
    • getReSourceAsStream(String file); 获得文件流

案例-统计网站被访问的总次数

1.需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02nCexeN-1629030916028)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/tu_3.gif)]

  • 在页面中显示您是第x位访问的用户.
2.思路分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iHEIuZ30-1629030916028)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day24 tomcat与servlet/笔记/img/count.jpg)]

3.代码实现
  • CountServlet
package com.servlet;

import javax.servlet.ServletContext;
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;

/**
 * 包名:${PACKAGE_NAME}
 *
 * @author Leevi
 * 日期2020-07-11  17:04
 * 每次接收到请求,则往容器中的计数器上面+1
 */
@WebServlet("/count")
public class CountServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 获取容器中计数器原本的次数
        ServletContext servletContext = getServletContext();
        Object count = servletContext.getAttribute("count");

        //判断ServletContext中是否有计数器
        if (count == null) {
            //说明当前是第一次访问
            //就往ServletContext中添加一个计数器
            servletContext.setAttribute("count",1);
        }else {
            //说明我不是第一次访问,那么就要对原来的计数器+1,再存进去
            int number = ((int) count) + 1;
            servletContext.setAttribute("count",number);
        }
        //2. 向客户端响应WelCome
        response.getWriter().write("WelCome!!!");
    }
}
  • ShowServlet
package com.servlet;

import javax.servlet.ServletContext;
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;

/**
 * 包名:${PACKAGE_NAME}
 *
 * @author Leevi
 * 日期2020-07-11  17:04
 */
@WebServlet("/show")
public class ShowServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从容器中获取计数器的值
        ServletContext servletContext = getServletContext();

        int count = (int) servletContext.getAttribute("count");

        //将count响应给客户端
        response.getWriter().print("access count is:"+count);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值