typora-copy-images-to: img

http&tomcat&Servlet

学习目标

  • 能够理解软件的架构
  • 能够理解WEB资源概念
  • 能够理解WEB服务器
  • 能够启动关闭Tomcat服务器
  • 能够运用Tomcat服务器部署WEB项目
  • 能够使用idea编写servlet
  • 能够使用idea配置tomcat方式发布项目
  • 能够使用注解开发servlet
  • 能够说出servlet生命周期方法执行流程
  • 能够使用Servletcontext对象

第一章-WEB开发介绍

知识点-WEB资源分类(理解)

1.目标

  • 能够理解什么是WEB

2.讲解

2.1什么是web

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

2.2WEB资源分类

2.2.1 静态资源
  • web页面中供人们浏览的数据始终是不变 (eg: html,css,js)

2.2.2 动态资源
  • 指web页面中供人们浏览的数据是由程序产生的,不同的用户或者不同时间点访问web页面看到的内容各不相同。(eg: servlet,jsp)

3.小结

  1. 什么是WEB资源:放在服务器上供客户端访问的资源
  2. WEB资源的分类:

    1. 静态资源:WEB页面中共用户访问的数据始终是不变的,比如说:html、css、js、图片、音视频等等
    2. 动态资源:WEB页面中供用户访问的数据是由程序产生的,是会发生变化的,比如Servlet、jsp

知识点-软件架构(理解)

1.目标

  • 能够理解软件的架构

2.讲解

2.1架构类别

2.1.1C/S架构
  1. Client / Server,客户端和服务器端,**用户需要安装专门客户端程序。**

2.2.2B/S架构
  1. Browser / Server,浏览器和服务器端,**不需要安装专门客户端程序,浏览器是操作系统内置。**

2.2B/S 和C/S交互模型的比较

  • 相同点
    都是基于请求-响应交互模型:即浏览器(客户端) 向 服务器发送 一个 请求。服务器 向 浏览器(客户端)回送 一个 响应 。
    必须先有请求 再有响应
    请求和响应成对出现

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

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

3.小结

  1. 架构类别

    • CS: 客户端-服务器; 必须要安装指定的客户端
    • BS: 浏览器-服务器; 不需要安装客户端的, 通过浏览器

      我们以BS架构为主.

  2. Java

    • JavaSE java基础
    • JavaMe 移动端的,嵌入式
    • JavaEE 企业级应用(eg: 网站, 后台系统, 移动端提供数据….)

知识点-web通信【重点】

1.目标

  • 掌握web通讯机制

2.讲解

  1. 基于http协议,请求响应的机制
  2. 请求一次响应一次
  3. 先有请求后有响应

http&tomcat&Servlet - 图1

3.小结

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

第二章-服务器(重点)

processon的画图软件的注册地址:

https://www.processon.com/i/5f0440b81e085326375eb062

知识点-服务器介绍

1.目标

  • 掌握什么是服务器

2.讲解

2.1 什么是服务器

  1. 服务器就是一个软件,任何电脑只需要安装上了服务器软件, 我们的电脑就可以当做一台服务器了.
  2. 服务器: 硬件(电脑)+软件(mysql, tomcat,nginx)

2.2 常见web服务器

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

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

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

  • JBoss
    JBoss公司产品,开源,支持JavaEE规范,占用内存、硬盘小,安全性和性能高。
    http&tomcat&Servlet - 图4

  • Tomcat
    中小型的应用系统,免费,开源,效率特别高, 适合扩展(搭集群)支持JSP和Servlet.
    http&tomcat&Servlet - 图5

3.小结

  1. 服务器=硬件+软件(mysql, Nginx,Tomcat), 只要你的电脑上装了服务器软件,那么你的电脑就可以当做一台服务器了

  2. 我们常用的WEB服务器是Tomcat

知识点-tomcat介绍,安装和使用

1.目标

  • 能够安装,启动,关闭Tomcat服务器

2.讲解

2.1概述

  1. Tomcat服务器是一个免费的开放源代码的Web应用服务器。
  2. TomcatApache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由ApacheSun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet JSP规范总是能在Tomcat中得到体现。
  3. 因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,是目前比较流行的Web应用服务器。

2.2tomcat的下载

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

目前阶段:

  1. jdk8mysql5tomcat8
  1. 先去官网下载:http://tomcat.apache.org/,选择tomcat8版本(红框所示)
    http&tomcat&Servlet - 图6

  2. 选择要下载的文件(红框所示):
    http&tomcat&Servlet - 图7
    tar.gz 文件 是linux操作系统下的安装版本
    exe文件是window操作系统下的安装版本
    zip文件是window操作系统下压缩版本(我们选择zip文件)

  3. 下载完成

http&tomcat&Servlet - 图8

2.3tomcat服务器软件安装

  1. 直接解压当前这个tomcat压缩包:(不要有中文,不要有空格)

  2. 配置环境变量:
    tomcat运行依赖于java环境:
    http&tomcat&Servlet - 图9

2.4tomcat的目录结构

http&tomcat&Servlet - 图10

2.5启动与关闭tomcat服务器

  1. 启动tomcat服务器
    查找tomcat目录下bin目录,查找其中的startup.bat命令,双击启动服务器:
    http&tomcat&Servlet - 图11
    启动效果:
    http&tomcat&Servlet - 图12

  2. 测试访问tomcat服务器
    打开浏览器在,在浏览器的地址栏中输入:
    http://127.0.0.1:8080或者http://localhost:8080
    http&tomcat&Servlet - 图13
    注: Localhost相当于127.0.0.1

  3. 关闭tomcat服务器
    查找tomcat目录下bin目录,查找其中的shutdown.bat命令,双击关闭服务器:
    http&tomcat&Servlet - 图14

3.小结(常见问题)

3.0安装注意点

  • 解压到一个没有中文和空格目录下
  • 使用之前, 配置java_home和path(jdk环境变量)

    • java_home 不要配到bin目录,配到jdk的安装目录
    • path 才是配到bin目录

3.1 端口号冲突

  1. 报如下异常: java.net.BindException: Address already in use: JVM_Bind 8080
  2. 解决办法:
  3. 第一种:修改Tomcat的端口号
  4. ![](https://gitee.com/tgl_bug/typora-table/raw/master/img/20210121132151.png#alt=img)
  5. 修改conf/server.xml , 70行左右

http&tomcat&Servlet - 图15

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

  1. 打开命令行输入: netstat -ano
  2. 找到占用了8080 端口的 进程的id
  3. 去任务管理器kill掉这个id对应的程序
  4. ![](https://gitee.com/tgl_bug/typora-table/raw/master/img/20210121132153.png#alt=img)

3.2JAVA_HOME没有配置

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

知识点-运用Tomcat服务器部署WEB项目

1.目标

  • 能够运用Tomcat服务器部署WEB项目

2.讲解

2.1标准的JavaWeb应用目录结构

  1. WebAPP(文件夹,项目)
  2. |---静态资源: html,css,js,图片(它们可以以文件存在,也可以以文件夹存在)
  3. |---WEB-INF 固定写法。此目录下的文件不能被外部(浏览器)直接访问
  4. |---lib:jar包存放的目录
  5. |---web.xml:当前项目的配置文件(3.0规范之后可以省略)
  6. |---classes:java类编译后生成class文件存放的路径

2.2发布项目到tomcat

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

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

http&tomcat&Servlet - 图16

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

http&tomcat&Servlet - 图17

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

http&tomcat&Servlet - 图18

  1. 第四步:添加second.xml文件的内容为: docBase就是你需要作为虚拟路径的项目的路径
    1. <?xml version = "1.0" encoding = "utf-8"?>
    2. <Context docBase="G:/myApp" />


http&tomcat&Servlet - 图19

  1. 第五步:直接访问(通过写配置文件的路径来访问):
    http://localhost:8080/second/a.html (second就是配置文件的名字, 映射成了myApp)

3.小结

  1. 1. 安装Tomcat、启动Tomcat
  2. 2. Tomcat服务器中部署项目
  3. 1. 直接拷贝项目的方式进行部署
  4. 2. 虚拟路径配置的方式进行部署(两种)

第三章-http协议

知识点-http协议概述

1.目标

  • 掌握什么是HTML协议, 以及HTTP协议的作用

2.讲解

2.1什么是HTTP协议

  1. HTTPHyperText Transfer Protocol(超文本传输协议)的简写,传输HTML文件。
  2. HTTP是互联网上用的最多的一个协议, 所有的www开头的都是遵循这个协议的(可能是https)

2.2HTTP协议的作用

  1. HTTP作用:用于定义WEB浏览器与WEB服务器之间交换数据的过程和数据本身的内容
  2. 浏览器和服务器交互过程: 浏览器请求, 服务请求响应
  3. 请求(请求行,请求头,请求体)
  4. 响应(响应行,响应头,响应体)

3.小结

  1. HTTP协议:超文本传输协议,它就定义了客户端与服务器端进行交互时候的规则

  2. HTTP协议的作用:定义客户端与服务器端交互的过程以及传输的数据

知识点-请求部分(了解)

1.目标

  • 掌握请求行,常见请求头,请求体

2.讲解

http&tomcat&Servlet - 图20

  • get方式请求
  1. 【请求行】
  2. GET /myApp/success.html?username=zs&password=123456 HTTP/1.1
  3. 【请求头】
  4. Accept: text/html, application/xhtml+xml, */*
  5. X-HttpWatch-RID: 41723-10011
  6. Referer: http://localhost:8080/myApp/login.html
  7. Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
  8. 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
  9. Accept-Encoding: gzip, deflate
  10. Host: localhost:8080
  11. Connection: Keep-Alive
  12. Cookie: Idea-b77ddca6=4bc282fe-febf-4fd1-b6c9-72e9e0f381e8
  • post请求
  1. 【请求行】
  2. POST /myApp/success.html HTTP/1.1
  3. 【请求头】
  4. Accept: text/html, application/xhtml+xml, */*
  5. X-HttpWatch-RID: 37569-10012
  6. Referer: http://localhost:8080/myApp/login.html
  7. Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
  8. 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
  9. Content-Type: application/x-www-form-urlencoded
  10. Accept-Encoding: gzip, deflate
  11. Host: localhost:8080
  12. Content-Length: 27
  13. Connection: Keep-Alive
  14. Cache-Control: no-cache
  15. 【请求体】
  16. username=zs&password=123456

2.1请求行

  • 请求行
  1. GET /myApp/success.html?username=zs&password=123456 HTTP/1.1
  2. POST /myApp/success.html HTTP/1.1
  • 请求方式(8种,put,delete等)
    GET:明文传输, 不安全,参数跟在请求路径后面,对请求参数大小有限制,
    POST: 暗文传输,安全一些,请求参数在请求体里,对请求参数大小没有有限制,

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

  • 协议版本:HTTP/1.1

2.2请求头

  1. 从第2行到空行处,都叫请求头,以键值对的形式存在,但存在一个key对应多个值的请求头.
  2. 作用:浏览器告诉服务器自己相关的设置.
  • 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请求体

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

3.小结

  1. 1. 请求行
  2. 1. 请求方式
  3. 2. 请求路径
  4. 2. 请求头: 它是由键值对构成
  5. 3. 请求体: 只有post请求才有请求体,post请求的请求体是用于携带请求参数的

知识点-响应部分(了解)

1.目标

  • 掌握响应行, 常见的响应头,响应体

2.讲解

http&tomcat&Servlet - 图21

  • 响应部分
    1. 【响应行】

HTTP/1.1 200

【响应头】
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

【响应体】

2.1响应行

  1. HTTP/1.1 200
  • 协议/版本

  • 响应状态码 (记住-背诵下来)
    http&tomcat&Servlet - 图22
    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响应体

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

3.小结

  1. 1. 响应行:包含响应状态码
  2. 1. 常见的响应状态码:
  3. 1. 200 OK
  4. 2. 302 Redirect 重定向
  5. 3. 304 Cache 读取缓存
  6. 4. 400 BAD REQUEST 请求有问题(可能是请求参数等等不符合规定)
  7. 5. 403 Forbidden 拒绝处理
  8. 6. 404 NOT FOUND 找不到资源
  9. 7. 500 SERVER ERROR 服务器异常
  10. 2. 响应头: 由多个键值对构成
  11. 3. 响应体:
  12. 1. 可以用于客户端页面的展示
  13. 2. 可以用于下载

第四章-Servlet入门(最重要的东西)

知识点-Servlet概述

1.目标

  • 知道什么是Servlet,Servlet作用

2.讲解

2.1什么是Servlet

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

2.2Servlet作用

  1. 用来接收、处理客户端请求、响应给浏览器的动态资源。
  2. servlet的实质就是java代码,通过javaAPI动态的向客户端输出内容

2.3 servlet与普通的java程序的区别

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

3.小结

  1. Servlet是运行在服务器端java小程序, 动态资源
  2. Servlet的作用: 接收请求,做出响应

实操-使用IDEA创建web工程配置tomcat

1.目标

  • 能够在IDEA配置tomcat 并且创建web工程

2.讲解

2.1配置tomcat

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

http&tomcat&Servlet - 图23

http&tomcat&Servlet - 图24

http&tomcat&Servlet - 图25

http&tomcat&Servlet - 图26

2.2创建JavaWeb工程

2.2.1web工程创建

http&tomcat&Servlet - 图27

http&tomcat&Servlet - 图28

http&tomcat&Servlet - 图29

http&tomcat&Servlet - 图30

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

http&tomcat&Servlet - 图31

http&tomcat&Servlet - 图32

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

http&tomcat&Servlet - 图33

http&tomcat&Servlet - 图34

3.小结

  1. 配置tomcat(选择local)
  2. 创建javaweb项目,选择Java Enterprise

http&tomcat&Servlet - 图35

  1. 发布

  2. 目录结构

http&tomcat&Servlet - 图36

先看笔记 配置发布一下, 如果看笔记配置不出来, 看视频 ( 自己操作<=30分钟), 问同桌, 老师

案例-Servlet入门案例

1.需求

  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.itheima.web包下创建一个类实现Servlet接口
  1. package com.itheima.web;
  2. import javax.servlet.*;
  3. import java.io.IOException;
  4. public class ServletDemo01 implements Servlet {
  5. @Override
  6. //服务方法: 处理请求的
  7. public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  8. System.out.println("hello world...");
  9. }
  10. @Override
  11. public void init(ServletConfig servletConfig) throws ServletException {
  12. }
  13. @Override
  14. public ServletConfig getServletConfig() {
  15. return null;
  16. }
  17. @Override
  18. public String getServletInfo() {
  19. return null;
  20. }
  21. @Override
  22. public void destroy() {
  23. }
  24. }
  • web.xml配置(该文件在web/WEB-INF 文件夹下):
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  6. version="2.5">
  7. <!--配置Servlet-->
  8. <servlet>
  9. <!--servlet-name: 名字 随便取; 一般就是类名-->
  10. <servlet-name>ServletDemo01</servlet-name>
  11. <!--servlet-class:Servlet这个类的全限定名-->
  12. <servlet-class>com.itheima.web.ServletDemo01</servlet-class>
  13. </servlet>
  14. <servlet-mapping>
  15. <!--servlet-name: 必须和servlet标签里面的servlet-name一样-->
  16. <servlet-name>ServletDemo01</servlet-name>
  17. <!--url-pattern: 配置访问的路径-->
  18. <url-pattern>/demo01</url-pattern>
  19. </servlet-mapping>
  20. </web-app>

3.2注解方式实现

  • 在com.itheima.web包下创建一个类实现Servlet接口, 添加注解
  1. package com.itheima.web;
  2. import javax.servlet.*;
  3. import javax.servlet.annotation.WebServlet;
  4. import java.io.IOException;
  5. @WebServlet("/demo02")
  6. public class ServletDemo02 implements Servlet{
  7. @Override
  8. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  9. System.out.println("hello world...");
  10. }
  11. @Override
  12. public void init(ServletConfig servletConfig) throws ServletException {
  13. }
  14. @Override
  15. public ServletConfig getServletConfig() {
  16. return null;
  17. }
  18. @Override
  19. public String getServletInfo() {
  20. return null;
  21. }
  22. @Override
  23. public void destroy() {
  24. }
  25. }

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

4.小结

4.1 如果出现实现Servlet报错

  • 检查当前的工程是否依赖了Tomcat

http&tomcat&Servlet - 图37

  • 如果没有依赖, 依赖tomcat

http&tomcat&Servlet - 图38

http&tomcat&Servlet - 图39

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

  1. 注解方式简化的javaweb代码开发,可以省略web.xml配置文件.
  2. 但是配置文件方式必须掌握的(后面在框架或者大项目里面会使用到的)

4.3步骤回顾

  • xml方式

    • 创建一个类实现Servlet接口
    • 在web.xml配置servlet
  • 注解方式

    • 创建一个类实现Servlet接口
    • 在类上面添加@WebServlet(“访问的路径”)

知识点-入门案例原理和路径

1.目标

  • 掌握Servlet执行原理和Servlet路径的配置url-pattern

2.讲解

2.1Servlet执行原理

http&tomcat&Servlet - 图40

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

  • Servlet对象是由服务器创建(反射)
  • request与response对象也是由tomcat服务器创建
  • service()方法也是服务器调用的

2.3 Servlet路径的配置url-pattern

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

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

注意的地方:

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

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

3.小结

  1. 讲Servlet原理目的让大家对Servlet执行有一个深入认识, 只需要能懂就可以. 具体操作是服务器(创建servlet,执行service), 你【重点】要做的就是写出Servlet
  2. 路径有多种方式, 一般用完全路径匹配

第五章-Servlet进阶

知识点-Servlet的生命周期

1.目标

  • 掌握Servlet的生命周期

2.讲解

2.1生命周期概述

  1. 一个对象从创建到销毁的过程

2.2Servlet生命周期方法

  1. servlet从创建到销毁的过程
  2. 出生:(初始化)用户第一次访问时执行。
  3. 活着:(服务)应用活着。每次访问都会执行。
  4. 死亡:(销毁)应用卸载。
  5. serrvlet生命周期方法:
  6. init(ServletConfig config)
  7. service(ServletRequest req, ServletResponse res)
  8. destroy()

2.3Servlet生命周期描述

  1. 常规【重点】
    默认情况下, 来了第一次请求, 会调用init()方法进行初始化【调用一次】
    任何一次请求 都会调用service()方法处理这个请求
    服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁【调用一次】

  2. 扩展
    servlet是单例多线程的, 尽量不要在servlet里面使用全局(成员)变量,可能会导致线程不安全
    单例: 只有一个对象(init()调用一次, 创建一次)
    多线程: 服务器会针对每次请求, 开启一个线程调用service()方法处理这个请求

2.4.ServletConfig【了解】

  1. Servlet的配置对象, 可以使用用ServletConfig来获得Servlet的初始化参数, SpringMVC里面会遇到
  • 先在配置文件里面配置初始化参数

http&tomcat&Servlet - 图41

  • 可以通过akey获得aaa

http&tomcat&Servlet - 图42

2.5启动项

  1. Servlet默认情况下什么是创建? 默认情况下是第一次请求的时候.
  2. 如果我想让Servlet提前创建(服务器器的时候), 这个时候就可以使用启动项 SpringMVC里面会遇到

http&tomcat&Servlet - 图43

3.小结

  1. Servlet生命周期方法

    • init() 初始化
    • service() 服务
    • distory() 销毁
  2. Servlet生命周期描述【面试题】
    默认情况下, 第一次请求的时候, 调用init()方法进行初始化【调用一次】
    任何一次请求, 都会调用service()方法进行处理这个请求
    服务器正常关闭/项目从服务器移除, 调用destory()方法进行销毁【调用一次】

    Servlet是单例多线程的


知识点-Servlet体系结构

1.目标

  • 掌握Servlet的继承关系,能够使用IDEA直接创建Servlet

2.讲解

http&tomcat&Servlet - 图44

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

我们先来查阅API回顾Servlet接口:
http&tomcat&Servlet - 图45

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

http&tomcat&Servlet - 图46

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

我们来使用GenericServlet 创建servlet:

  1. 创建一个类
  2. 继承GenericServlet
  3. 重写service方法
  1. package cn.itcast.web;
  2. import javax.servlet.GenericServlet;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.ServletRequest;
  5. import javax.servlet.ServletResponse;
  6. import javax.servlet.annotation.WebServlet;
  7. import java.io.IOException;
  8. @WebServlet(name = "GenericDemoServlet",urlPatterns = "/generic")
  9. public class GenericDemoServlet extends GenericServlet {
  10. @Override
  11. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  12. System.out.println("GenericDemoServlet执行.......");
  13. }
  14. }
  1. 虽然,GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,因此,sun公司又专门提供了HttpServlet,来适配这种协议下的开发。
  • HttpServlet

http&tomcat&Servlet - 图47

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

我们来使用HttpServlet创建servlet:

  1. 创建一个类
  2. 继承HttpServlet
  3. 重写doGet方法和doPost方法
  1. /**
  2. * 包名:com.itheima.servlet
  3. *
  4. * @author Leevi
  5. * 日期2020-07-11 15:39
  6. * Servlet的常用的编写方法:
  7. * 1. 写一个类继承HttpServlet,重写doGet和doPost方法
  8. * 1.1 doGet()方法,是处理来自客户端的get请求
  9. * 1.2 doPost()方法,是处理来自客户端的post请求
  10. *
  11. * 通常情况下:服务器端针对同一个请求(不同的请求方式)不会做不同的处理,所以我们会选择在doGet中调用doPost
  12. * 2. 配置servlet的映射路径
  13. */
  14. @WebServlet("/demo02")
  15. public class ServletDemo02 extends HttpServlet{
  16. @Override
  17. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  18. doPost(req,resp);
  19. }
  20. @Override
  21. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  22. System.out.println("编写很多代码处理这次post请求");
  23. }
  24. }
  1. 通过以上两个API阅读,同学们注意一个细节HttpServletGenericServlet的子类,它增强了GenericServlet一些功能,因此,在后期使用的时候,我们都是选择继承HttpServlet来开发servlet程序。

3.小结

  1. 继承关系

http&tomcat&Servlet - 图48

  1. 我们可以直接创建一个类继承HttpServlet, 直接在IDEA里面new Servlet

http&tomcat&Servlet - 图49

4.扩展(Servlet体系源码)

  1. 看HttpServlet的service()方法

http&tomcat&Servlet - 图50

补充案例:登录

流程分析

http&tomcat&Servlet - 图51

代码

login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>登录页面</title>
  6. </head>
  7. <body>
  8. <!--
  9. 怎么在页面上指定提交给LoginServlet
  10. 项目的虚拟路径/servlet的映射路径
  11. -->
  12. <form action="/LoginDemo/login" method="post">
  13. 用户名<input type="text" name="username"><br>
  14. 密码<input type="text" name="password"><br>
  15. <input type="submit" value="登录">
  16. </form>
  17. </body>
  18. </html>

LoginServlet

  1. package com.itheima.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. /**
  9. *
  10. * @author Leevi
  11. * 日期2020-07-11 15:59
  12. */
  13. @WebServlet("/login")
  14. public class LoginServlet extends HttpServlet {
  15. @Override
  16. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. doGet(request, response);
  18. }
  19. @Override
  20. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  21. //1. 使用request获取请求参数
  22. String username = request.getParameter("username");
  23. String password = request.getParameter("password");
  24. //2. 校验用户名和密码
  25. if ("jay".equals(username) && "123456".equals(password)) {
  26. //登录成功
  27. response.getWriter().write("login success");
  28. }else {
  29. //登录失败
  30. response.getWriter().write("login failed");
  31. }
  32. }
  33. }

第六章-ServletContext

知识点-ServletContext概述

1.目标

  • 知道什么是ServletContext, 以及作用

2.讲解

2.1 servletContext概述

  1. ServletContext: 是一个全局对象, 上下文对象.
  2. 服务器为每一个应用(项目)都创建了一个ServletContext对象。 ServletContext属于整个应用的,不局限于某个Servlet
  3. eg: 把项目当做咱班, servlet当做每一位同学, ServletContext当做班主任

2.2ServletContext作用

  1. 作为域对象存取数据,让Servlet共享(掌握)
  2. 获得文件MIME类型(文件下载)(了解)
  3. 获得全局初始化参数(了解)
  4. 获取web资源路径 ,可以将Web资源转换成字节输入流(掌握)

3.小结

知识点-ServletContext的功能

1.目标

  • 掌握ServletContext的作用

2.路径

  • 作为域对象存取数据
  • 获得文件mini类型(文件下载)
  • 获得全局初始化参数
  • 获取web资源路径

3.讲解

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

http&tomcat&Servlet - 图52

  1. API

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

    • ServletDemo01 ```java package com.itheima.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;

/**

  1. -
  2. 包名:${PACKAGE_NAME}<br />
  3. *
  4. -
  5. [@author ](/author ) Leevi
  6. - 日期2020-07-11 16:11
  7. - 目标: ServletDemo02中获取servletDemo01中的一个变量的值
  8. -
  9. 1. 获取ServletContext对象:
  10. - getServletContext()<br />
  11. */<br />
  12. @WebServlet("/demo01")<br />
  13. public class ServletDemo01 extends HttpServlet {<br />
  14. [@Override ](/Override ) <br />
  15. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
  16. doGet(request, response);<br />
  17. }

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = “周杰棍”;

  1. //1. 获取ServletContext对象
  2. ServletContext servletContext = getServletContext();
  3. //2. 往容器ServletContext中存值
  4. servletContext.setAttribute("name",name);

}

  1. -
  2. ServletDemo02
  3. ```java
  4. package com.itheima.servlet;
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. 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();

    1. //2. 从容器ServletContext中获取数据
    2. String name = (String) servletContext.getAttribute("name");
    3. System.out.println("在ServletDemo02中获取的name是:" + name);


}
}

3.2获得文件mime-type(了解)

    • getMimeType(String file)
  1. 代码
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. //根据文件名获得文件的mini类型
  3. //1.获得ServletContext
  4. //2.调用getMimeType()方法
  5. String file01 = "a.mp3";
  6. String file02 = "b.png";
  7. String mimeType01 = getServletContext().getMimeType(file01);
  8. String mimeType02 = getServletContext().getMimeType(file02);
  9. String value = getServletContext().getInitParameter("bkey");
  10. response.getWriter().print("ServletDemo05..."+mimeType01+":"+mimeType02+":"+value);
  11. }

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

  • String getInitParameter(String name) ; //根据配置文件中的key得到value;

在web.xml配置

http&tomcat&Servlet - 图53

通过ServletContext来获得

http&tomcat&Servlet - 图54

3.4 获取web资源路径

  1. API

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

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

  1. 代码
  1. /**
  2. * 包名:${PACKAGE_NAME}
  3. *
  4. * @author Leevi
  5. * 日期2020-07-11 16:41
  6. * 使用ServletContext获取web里面的资源文件的真实路径
  7. * 目标: 使用字节输入流,读取mm.jpg这张图片
  8. * 方法1: FileInputStream
  9. * 方法2: ClassLoader
  10. * 方法3: 使用ServletContext
  11. *
  12. * 在web项目中,将文件转换成流,有两种方式
  13. * 1. 如果文件在resources里面,使用类加载器
  14. * 2. 如果文件在web里面,使用ServletContext
  15. */
  16. @WebServlet("/demo04")
  17. public class ServletDemo04 extends HttpServlet {
  18. @Override
  19. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. doGet(request, response);
  21. }
  22. @Override
  23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24. //方法1: 使用FileInputStream,此时使用磁盘路径
  25. //InputStream is = new FileInputStream("C:/JavaEE_Relation/JavaEE98/itheima98_web/day24_servletcontext_03/web/mm.jpg");
  26. //方法2: 使用ClassLoader将文件转换成流
  27. //InputStream is = ServletDemo04.class.getClassLoader().getResourceAsStream("../../mm.jpg");
  28. //方法3: 使用ServletContext可以获取web里面的资源的真实路径
  29. ServletContext servletContext = getServletContext();
  30. //String realPath = servletContext.getRealPath("mm.jpg");
  31. InputStream is = servletContext.getResourceAsStream("mm.jpg");
  32. System.out.println(is);
  33. }
  34. }

4.小结

  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.需求

http&tomcat&Servlet - 图55

  • 在页面中显示您是第x位访问的用户.

2.思路分析

http&tomcat&Servlet - 图56

3.代码实现

  • CountServlet
  1. package com.itheima.servlet;
  2. import javax.servlet.ServletContext;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. /**
  10. * 包名:${PACKAGE_NAME}
  11. *
  12. * @author Leevi
  13. * 日期2020-07-11 17:04
  14. * 每次接收到请求,则往容器中的计数器上面+1
  15. */
  16. @WebServlet("/count")
  17. public class CountServlet extends HttpServlet {
  18. @Override
  19. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. doGet(request, response);
  21. }
  22. @Override
  23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24. //1. 获取容器中计数器原本的次数
  25. ServletContext servletContext = getServletContext();
  26. Object count = servletContext.getAttribute("count");
  27. //判断ServletContext中是否有计数器
  28. if (count == null) {
  29. //说明当前是第一次访问
  30. //就往ServletContext中添加一个计数器
  31. servletContext.setAttribute("count",1);
  32. }else {
  33. //说明我不是第一次访问,那么就要对原来的计数器+1,再存进去
  34. int number = ((int) count) + 1;
  35. servletContext.setAttribute("count",number);
  36. }
  37. //2. 向客户端响应WelCome
  38. response.getWriter().write("WelCome!!!");
  39. }
  40. }
  • ShowServlet
  1. package com.itheima.servlet;
  2. import javax.servlet.ServletContext;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. /**
  10. * 包名:${PACKAGE_NAME}
  11. *
  12. * @author Leevi
  13. * 日期2020-07-11 17:04
  14. */
  15. @WebServlet("/show")
  16. public class ShowServlet extends HttpServlet {
  17. @Override
  18. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  19. doGet(request, response);
  20. }
  21. @Override
  22. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23. //从容器中获取计数器的值
  24. ServletContext servletContext = getServletContext();
  25. int count = (int) servletContext.getAttribute("count");
  26. //将count响应给客户端
  27. response.getWriter().print("access count is:"+count);
  28. }
  29. }

4.小结