第一章 何为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");