# 第一章 何为 Tomcat?

# Tomcat 概述

  • 简而言之,Tomcat 简单的说就是一个运行 JAVA 的网络服务器,底层是 Socket 的一个程序,它也是 JSP 和 Serlvet 的一个容器。
  • 通过 Tomcat 可以使别人访问到自己的网页的一个程序

# Tomcat 目录解读

tomcat_dir.png

  • 各个文件的解读
  1. bin:启动和关闭 tomcat 的 bat 文件
  2. conf:配置文件
    • server.xml 该文件用于配置 server 相关的信息,比如 tomcat 启动的端口号,配置主机 (Host)
    • web.xml 文件配置与 web 应用(web 应用相当于一个 web 站点)
    • tomcat-user.xml 配置用户名密码和相关权限.
  3. lib:该目录放置运行 tomcat 运行需要的 jar 包
  4. logs:存放日志,当我们需要查看日志的时候,可以查询信息
  5. webapps:放置我们的 web 应用
  6. work 工作目录:该目录用于存放 jsp 被访问后生成对应的 server 文件和.class 文件

# 第二章 Servlet

# 简述 java servlet

  • Servlet 本质上就是一个 java 接口,在该接口中包含五个方法,分别是:
    • 初始化
    • 获取配置
    • 服务
    • 获取信息
    • 销毁
    public interface Servlet {
      public void init(ServletConfig config) throws ServletException;
      public ServletConfig getServletConfig();
      public void service(ServletRequest req, ServletResponse res)
              throws ServletException, IOException;
      public String getServletInfo();
      public void destroy();
      }

# Servlet 有什么作用

  • 在网上实现聊天、发帖等交互功能

# 浅谈 HTTP 协议

  • 何为 HTTP 协议

    • 超文本传输协议(HTTP,HyperText Transfer Protocol) ~~~~ 是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。它是 TCP/IP 协议的一个应用层协议
    • 简单来说,HTTP 协议就是客户端和服务器交互的一种通迅的格式。
  • HTTP 请求

    • 浏览器向服务器请求某个 web 资源时,称之为浏览器向服务器发送了一个 http 请求。

    • 一个完整 http 请求应该包含三个部分:

      1. 请求行 ----- 描述客户端 client 的请求方式、请求资源名称以及 HTTP 版本号
      2. 多个消息头 ----- 描述客户端请求哪台主机、以及客户端的环境信息
      3. 一个空行

    • 请求行
      • 请求行中的 GET 称之为请求方式,请求方式有: POST,GET,HEAD,OPTIONS,DELETE,TRACE,PUT

      • 常用的方法POST、GET

      • 一般来说,当我们点击超链接,通过地址栏访问都是 get 请求方式。通过表单提交的数据一般是 post 方式。

      • 可以简单理解 GET 方式用来查询数据,POST 方式用来提交数据,get 的提交速度比 post 快

      • GET 方式:在 URL 地址后附带的参数是有限制的,其数据容量通常不能超过 1K

      • POST 方式:可以在请求的实体内容中向服务器发送数据,传送的数据量无限制


    • HTTP 响应
      • 一个 HTTP 响应代表着服务器向浏览器回送数据

      • 一个完整的 HTTP 响应应该包含四个部分:

        1. 一个状态行
        2. 多个消息头
        3. 一个空行
        4. 实体内容
      • 状态行

        • 格式:HTTP 版本号 状态码 原因叙述
        • 状态行:HTTP/1.1 200 OK
        • 状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为 5 类

        servletzt.png


# JavaWeb 目录

webdir.png

  • WEB-INF 目录下的资源是不能直接被浏览器访问的
  • web.xml 文件是 web 程序的主要配置文件
  • 所有的 classes 文件都放在 classes 目录下
  • jar 文件放在 lib 目录下

# Servlet 生命周期

  1. 加载 Servlet。当 Tomcat 第一次访问 Servlet 的时候,Tomcat 会负责创建 Servlet 的实例
  2. 初始化。当 Servlet 被实例化后,Tomcat 会调用 init () 方法初始化这个对象
  3. 处理服务。当浏览器访问 Servlet 的时候,Servlet 会调用 service () 方法处理请求
  4. 销毁。当 Tomcat 关闭时或者检测到 Servlet 要从 Tomcat 删除的时候会自动调用 destroy () 方法,让该实例释放掉所占的资源。一个 Servlet 如果长时间不被使用的话,也会被 Tomcat 自动销毁
  5. 卸载。当 Servlet 调用完 destroy () 方法后,等待垃圾回收。如果有需要再次使用这个 Servlet,会重新调用 init () 方法进行初始化操作。
  • 总结:只要访问 Servlet,service () 就会被调用。init () 只有第一次访问 Servlet 的时候才会被调用。
    destroy () 只有在 Tomcat 关闭的时候才会被调用。

# 编写一个简单的 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;
import java.io.PrintWriter;
@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        super.doPost(request,response);
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("hello world,servlet");
        out.close();
    }
}

# Servlet 的调用图

servlet01.png

# Servlet 细节

  • 一个已经注册的 Servlet 可以被多次映射
    • 同一个 Servlet 可以被映射到多个 URL 中
  • Servlet 映射的 URL 可以使用通配符
    • 通配符的两种格式
      • *. 扩展名
      • 正斜杠 / 开头并以 /* 结尾
        • 其中 *. 扩展名的优先级最低

# Servlet 是单例的


# 为什么 Servlet 是单例的?

  • 浏览器多次对 Servlet 的请求,一般情况下,服务器只创建一个 Servlet 对象,也就是说,Servlet 对象一旦创建类就会驻留在内存中,后续的请求做服务,直到服务器关闭

# 每次访问请求对象和响应对象都是新的

  • 对于每次访问要求,Servlet 引擎都会创建一个新的 HttpServletRequest 请求对象和一个新的 HttpServletResponse 响应对象,然后将这两个对象作为参数传递给它调用的 Servlet 的 service () 方法,service 方法再跟进请求方式分别调用 doXxx 方法

# 线程安全问题

  • 当多个用户访问 Servlet 的时候,服务器会为每个用户创建一个线程,当多个用户并发 Servlet 共享资源的时候就会出现线程安全问题
    • 如果一个变量需要多个用户分享,则应当在访问该变量的时候,加入同步机制:
      synchronized(对象名){
      }
    • 如果一个变量不需要共享,则直接在 doGet() 或者 doPost() 定义,这样不会存在线程安全问题

# ServletConfig 对象

# 何为 ServletConfig 对象


通过此对象可以读取 Web.xml 中配置的初始化参数


  • 作用:
    • 大大提高程序的灵活性
    • 当需要修改时,只需更改配置文件 Web.xml 即可

# ServletContext 对象

# 何为 ServletContext 对象


当 Tomcat 启动的时候,就会创建一个 ServletContext 对象,它代表着当前 Web 站点


  • 作用:
    • ServletContext 代表当前 Web 站点,那么所有 Servlet 都共享一个 ServletContext 对象,因此 Servlet 之间可以通过 ServletContext 实现通讯
    • ServletConfig 获取的是配置单个 Servlet 的参数信息,ServletContext 可以获取的是配置整个 Web 站点的参数信息
    • 利用 ServletContext 读取 web 站点的资源文件
    • 实现 Servlet 转发

# 第三章 request 和 response

# request、response 对象


 Tomcat 收到客户端的 HTTP 请求,会针对每一次请求,分别创建一个代表请求的 **request 对象和代表响应的 response 对象


  • 我们在获取浏览器传输过来的数据时,通过使用 request 对象即可
  • 如果要向浏览器输出数据,则需要使用 response 对象

# 什么是 HttpServletResponse 对象?

  • HTTP 响应由状态行、实体内容、消息头和一个空行组成。HttpServletResponse 对象就封装了 HTTP 响应的信息

# 调用 getOutputStream () 方法向浏览器输出数据

  • 代码:
    // 获取 ServletOutputStream 对象
      ServletOutputStream ServletOutputStream= response。getOutputStream();
      // 使用 meta 标签和 http 消息头,告诉浏览器回送数据的编码和格式
      servletOutputStream.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
      servletOutputStream.write("我是吴亦凡".getBytes("UTF-8"));

# 调用 getWriter () 方法向浏览器输出数据

  • 代码:
    // 设置浏览器用 UTF-8 编码显示数据
    response.setContentType("text/html;charset=UTF-8");
    // 获取到 printwriter 对象
    PrintWriter printwriter =response.getWriter();
    printWriter.write("完成finish");