05 HTTP & Tomcat & Servlet

文章目录

HTTP

1、简介

  1. HTTP概念
    • HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
      • 数据传输的规则指的是请求数据和响应数据需要按照指定的格式进行传输
      • 如果想知道具体的格式,可以打开浏览器,点击F12打开开发者工具,点击Network来查看某一次请求的请求数据和响数据具体的格式内容
      • 在浏览器中如果看不到上述内容,需要清除浏览器的浏览数据。chrome浏览器可以使用ctrl+shift+Del进行清除
      • 所以学习HTTP主要就是学习请求和响应数据的具体格式内容
  2. HTTP协议特点
    • 基于TCP协议: 面向连接,安全
      TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全
    • 基于请求-响应模型:一次请求对应一次响应
    • HTTP协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的
      无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息
      • 优点:速度快
      • 缺点:多次请求间不能共享数据
        可以使用会话技术(Cookie、Session)来解决这个问题

2、请求数据格式

  1. 格式介绍
    请求数据总共分为三部分内容,分别是请求行、请求头、请求体
    • 请求行: HTTP请求中的第一行数据

      • 请求行包含三块内容
      • 分别是 GET[请求方式] /[请求URL路径] HTTP/1.1[HTTP协议及版本]
      • 请求方式有七种,最常用的是GET和POST
    • 请求头: 第二行开始,格式为key: value形式

      • 服务端可以根据请求头中的内容来获取客户端的相关信息

      • 有了这些信息服务端就可以处理不同的业务需求

      • 请求头中会包含若干个属性,常见的HTTP请求头有:

        复制代码
        Host: 表示请求的主机名
        User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
        Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
        Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
        Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
    • 请求体: POST请求的最后一部分,存储请求参数

      • GET请求请求参数在请求行中,没有请求体,POST请求请求参数在请求体中
      • GET请求请求参数大小有限制,POST没有

3、响应数据格式

  1. 格式介绍

    响应数据总共分为三部分内容,分别是响应行、响应头、响应体

    • 响应行:响应数据的第一行
      (1)响应行包含三块内容
      (2)分别是 HTTP/1.1[HTTP协议及版本] 200[响应状态码] ok[状态码的描述]
    • 响应头:第二行开始,格式为key:value形式
      (1)响应头中会包含若干个属性
    • 响应体: 最后一部分。存放响应数据
      (1)响应体和响应头之间有一个空行隔开
  2. 响应状态码

    状态码大全:https://cloud.tencent.com/developer/chapter/13553

Tomcat

1、简介

  1. Web服务器

    • Web服务器是一个应用程序(软件)
      (1)对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷
      (2)主要功能是"提供网上信息浏览服务"
  2. Web服务器软件使用步骤

    • 准备静态资源
    • 下载安装Web服务器软件
    • 将静态资源部署到Web服务器上
    • 启动Web服务器使用浏览器访问对应的资源
  3. Tomcat

    • Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范
    • JavaEE: Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF
    • 因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行
    • Tomcat的官网:https://tomcat.apache.org/

2、基本使用

  1. 启动

    • 双击: bin\startup.bat
  2. 关闭

    • 直接x掉运行窗口:强制关闭[不建议]
    • bin\shutdown.bat:正常关闭
    • ctrl+c: 正常关闭
  3. 配置

    • 修改端口:Tomcat默认的端口是8080,要想修改Tomcat启动的端口号,需要修改 conf/server.xml

      注: HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号

    • 启动时可能出现的错误

      • Tomcat的端口号取值范围是0-65535之间任意未被占用的端口,如果设置的端口号被占用,启动的时候就会包如下的错误

      • Tomcat启动的时候,启动窗口一闪而过: 需要检查JAVA_HOME环境变量是否正确配置

  4. 部署

    • Tomcat部署项目: 将项目放置到webapps目录下,即部署完成
    • 一般JavaWeb项目会被打包称war包,然后将war包放到Webapps目录下,Tomcat会自动解压缩war文件

3、Maven创建Web项目

  1. Web项目结构

    Web项目的结构分为:开发中的项目和开发完可以部署的Web项目

    • Maven Web项目结构: 开发中的项目
    • 开发完成部署的Web项目
      • 开发项目通过执行Maven打包命令package,可以获取到部署的Web项目目录
      • 编译后的Java字节码文件和resources的资源文件,会被放到WEB-INF下的classes目录下
      • pom.xml中依赖坐标对应的jar包,会被放入WEB-INF下的lib目录下
  2. 创建Maven Web项目

    创建方式有两种:使用骨架和不使用骨架

    • 使用骨架

      1.创建Maven项目时,选择使用Web项目骨架

      2.完成项目创建后,删除pom.xml中多余内容

      3.补齐Maven Web项目缺失的目录结构

    • 不使用骨架

      1.创建Maven项目后,在pom.xml设置打包方式为war

      2.补齐Maven Web项目缺失webapp的目录结构

      3.补齐Maven Web项目缺失WEB-INF/web.xml的目录结构

4、IDEA使用Tomcat

在IDEA中集成使用Tomcat有两种方式,分别是集成本地Tomcat和Tomcat Maven插件

  1. 集成本地Tomcat

    • 打开添加本地Tomcat的面板

    • 指定本地Tomcat的具体路径

    • 修改Tomcat的名称,此步骤可以不改,只是让名字看起来更有意义,HTTP port中的端口也可以进行修改,比如把8080改成80

    • 将开发项目部署项目到Tomcat中

      扩展内容: xxx.war和 xxx.war exploded这两种部署项目模式的区别?

      • war模式是将WEB工程打成war包,把war包发布到Tomcat服务器上

      • war exploded模式是将WEB工程以当前文件夹的位置关系发布到Tomcat服务器上

      • war模式部署成功后,Tomcat的webapps目录下会有部署的项目内容

      • war exploded模式部署成功后,Tomcat的webapps目录下没有,而使用的是项目的target目录下的内容进行部署

      • 建议选war模式进行部署,更符合项目部署的实际情况

    • 部署成功后,就可以启动项目

    • 启动成功后,可以通过浏览器进行访问测试

    • 最终的注意事项

  2. Tomcat Maven插件

    • 在pom.xml中添加Tomcat插件

      xml 复制代码
      <build>
          <plugins>
          	<!--Tomcat插件 -->
              <plugin>
                  <groupId>org.apache.tomcat.maven</groupId>
                  <artifactId>tomcat7-maven-plugin</artifactId>
                  <version>2.2</version>
              </plugin>
          </plugins>
      </build>
    • 使用Maven Helper插件快速启动项目,选中项目,右键-->Run Maven --> tomcat7:run

    • 如果选中项目并右键点击后,看不到Run Maven和Debug Maven,这个时候就需要在IDEA中下载Maven Helper插件,具体的操作方式为: File --> Settings --> Plugins --> Maven Helper ---> Install,安装完后按照提示重启IDEA,就可以看到了

    • Maven Tomcat插件目前只有Tomcat7版本,没有更高的版本可以使用(截止2021年)

    • 使用Maven Tomcat插件,要想修改Tomcat的端口和访问路径,可以直接修改pom.xml

      xml 复制代码
      <build>
          <plugins>
          	<!--Tomcat插件 -->
              <plugin>
                  <groupId>org.apache.tomcat.maven</groupId>
                  <artifactId>tomcat7-maven-plugin</artifactId>
                  <version>2.2</version>
                  <configuration>
                  	<port>80</port><!--访问端口号 -->
                      <!--项目访问路径
      					未配置访问路径: http://localhost:80/tomcat-demo2/a.html
      					配置/后访问路径: http://localhost:80/a.html
      					如果配置成 /hello,访问路径会变成什么?
      						答案: http://localhost:80/hello/a.html
      				-->
                      <path>/</path>
                  </configuration>
              </plugin>
          </plugins>
      </build>

Servlet

1、简介

  • 概述

    • Servlet是JavaWeb最为核心的内容,是Java提供的一门动态web资源开发技术
    • 作用:使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容
    • Servlet是JavaEE规范之一,就是一个接口,需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
  • 快速入门

    需求分析: 编写一个Servlet类,并使用IDEA中Tomcat插件进行部署,最终通过浏览器访问所编写的Servlet程序

    1. 创建Web项目web-demo,导入Servlet依赖坐标

      xml 复制代码
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <!--
            provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
             因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
          -->
          <scope>provided</scope>
      </dependency>
    2. 创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话

      java 复制代码
      package com.itheima.web;
      
      import javax.servlet.*;
      import java.io.IOException;
      
      public class ServletDemo1 implements Servlet {
      
          public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
              System.out.println("servlet hello world~");
          }
          public void init(ServletConfig servletConfig) throws ServletException {
      
          }
      
          public ServletConfig getServletConfig() {
              return null;
          }
      
          public String getServletInfo() {
              return null;
          }
      
          public void destroy() {
      
          }
      }
    3. 配置:在类上使用@WebServlet注解,配置该Servlet的访问路径

      java 复制代码
      @WebServlet("/demo1")
    4. 访问:启动Tomcat,浏览器中输入URL地址访问该Servlet

      java 复制代码
      http://localhost:8080/web-demo/demo1
  • 执行流程

    • 浏览器发出http://localhost:8080/web-demo/demo1请求,从请求中可以解析出三部分内容,分别是localhost:8080web-demodemo1
      • 根据localhost:8080可以找到要访问的Tomcat Web服务器
      • 根据web-demo可以找到部署在Tomcat服务器上的web-demo项目
      • 根据demo1可以找到要访问的是项目中的哪个Servlet类,根据@WebServlet后面的值进行匹配
    • 找到ServletDemo1这个类后,Tomcat Web服务器就会为ServletDemo1这个类创建一个对象,然后调用对象中的service方法
      • ServletDemo1实现了Servlet接口,所以类中必然会重写service方法供Tomcat Web服务器进行调用
      • service方法中有ServletRequest和ServletResponse两个参数,ServletRequest封装的是请求数据,ServletResponse封装的是响应数据,后期我们可以通过这两个参数实现前后端的数据交互

    Servlet由web服务器创建,Servlet方法由web服务器调用

2、方法介绍

  • 生命周期

    • 生命周期: 对象的生命周期指一个对象从被创建到被销毁的整个过程
    • Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
      • (1)加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
      • (2)初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作,该方法只调用一次
      • (3)请求处理:每次 请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理
      • (4)服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
  • 方法

    Servlet中总共有5个方法

    • void init(ServletConfig config) :初始化方法,在Servlet被创建时执行,只执行一次
    • void service(ServletRequest req, ServletResponse res):提供服务方法, 每次Servlet被访问,都会调用该方法
    • void destroy() :销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
    • String getServletInfo() :获取Servlet信息
    • ServletConfig getServletConfig():获取ServletConfig对象
    java 复制代码
    @WebServlet(urlPatterns = "/demo2",loadOnStartup = 1)
    public class ServletDemo2 implements Servlet {
    	private ServletConfig servletConfig;
    	
        /**
         * (1)初始化方法
         *  1.调用时机:默认情况下,Servlet被第一次访问时,调用
         *      * loadOnStartup: 默认为-1,修改为0或者正整数,则会在服务器启动的时候,调用
         *  2.调用次数: 1次
         */
        public void init(ServletConfig config) throws ServletException {
        	this.servletConfig = config;
            System.out.println("init...");
        }
    
    	// (5)获取ServletConfig对象
    	public ServletConfig getServletConfig() {
            return servletConfig;
        }
    
        /**
         * (2)提供服务
         * 1.调用时机:每一次Servlet被访问时,调用
         * 2.调用次数: 多次
         */
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            System.out.println("servlet hello world~");
        }
    
        /**
         * (3)销毁方法
         * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
         * 2.调用次数: 1次
         */
        public void destroy() {
            System.out.println("destroy...");
        }
        
    	//(4)该方法用来返回Servlet的相关信息,没有什么太大的用处,一般返回一个空字符串即可
    	public String getServletInfo() {
    	    return "";
    	}
    
    
    }

3、体系结构

我们更关注的其实只有Servlet接口中的service()方法,通过自定义Servlet继承HttpServlet,创建方式更加简单

java 复制代码
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //TODO GET 请求方式处理逻辑
        System.out.println("get...");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //TODO Post 请求方式处理逻辑
        System.out.println("post...");
    }
}

HttpServlet原理:获取请求方式,并根据不同的请求方式,调用不同的doXxx方法

HttpServlet不仅可以处理GET和POST还可以处理其他五种请求方式

4、urlPattern配置

  • 一个Servlet,可以配置多个urlPattern

    例如:@WebServlet(urlPatterns = {"/demo7","/demo8"})

  • urlPattern配置规则

    • 精确匹配

    • 目录匹配

    • 扩展名匹配

      如果路径配置的不是扩展名,那么在路径的前面就必须要加/否则会报错

      如果路径配置的是*.do,那么在*.do的前面不能加/,否则会报错

    • 任意匹配

      • //*的区别
      1. " / "会覆盖DefaultServlet" /* "不会
      2. tomcat中的DefaultServlet 用来处理静态资源
      3. 当其他的url-pattern匹配不上时会走DefaultServlet
      4. DefaultServlet被覆盖掉,就会引发请求静态资源的时走自定义的Servlet类,导致静态资源无法被访问

    五种配置的优先级为 精确匹配 > 目录匹配> 扩展名匹配 > /* > /

5、XML配置

  • Servlet从3.0版本后开始支持注解配置
  • 3.0版本前只支持XML配置文件的配置方法
  • XML的配置步骤有两步:
    • 编写Servlet类

    • 在web.xml中配置该Servlet

      xml 复制代码
      	<!-- 
              Servlet 全类名
          -->
          <servlet>
              <!-- servlet的名称,名字任意-->
              <servlet-name>demo13</servlet-name>
              <!--servlet的类全名-->
              <servlet-class>com.itheima.web.ServletDemo13</servlet-class>
          </servlet>
      
          <!-- 
              Servlet 访问路径
          -->
          <servlet-mapping>
              <!-- servlet的名称,要和上面的名称一致-->
              <servlet-name>demo13</servlet-name>
              <!-- servlet的访问路径-->
              <url-pattern>/demo13</url-pattern>
          </servlet-mapping>
相关推荐
解决问题no解决代码问题14 小时前
Quartz 1.6.5
数据库·servlet·oracle
菜_小_白17 小时前
tcpdump
linux·网络·测试工具·http·tcpdump
Simon5231417 小时前
HTTP、Cookie、Session知识小计
网络·网络协议·http
XS03010617 小时前
HTTP协议
网络·网络协议·http
仍然.18 小时前
HTTPS
网络协议·http·https
皓月盈江18 小时前
Linux Ubuntu系统使用Docker搭建vulhub靶场环境
linux·ubuntu·docker·tomcat·vulhub·漏洞靶场
许彰午19 小时前
Tomcat漏洞修复升级——被遗忘的中间件安全
安全·中间件·tomcat
Linux运维技术栈20 小时前
Jenkins服务器更新密钥后任务构建不了?排查实录与解决方案
服务器·servlet·jenkins
Summer不秃1 天前
深入理解 Token 无感刷新:从并发雪崩到单例锁 + 请求队列的完整实现
前端·http
lunzi_08262 天前
《图解HTTP》--第3章 HTTP报文内的HTTP信息
网络·网络协议·http