七、JavaWeb之HTTP协议、Servlet

本文详细介绍了JavaWeb的基础,包括Web的定义、软件开发的结构分类(CS与BS)、Web服务器(如Tomcat)以及HTTP协议的工作原理。重点讲解了Servlet的概念、生命周期、执行原理以及如何使用注解进行开发,替代传统的web.xml配置。此外,还提到了HttpServlet的使用和其在处理HTTP请求时的内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 Web开发概述

1.1 web基础

1 Web(互联网总称)

web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。

Java Web,是用Java技术来解决相关web互联网领域的技术总和。

2 Java Web开发中的资源:

  • 静态web资源
    • HTML
    • CSS
    • JS
  • 动态web资源
    • Servlet
    • JSP

3 URL 请求路径:
URL (Uniform Resource Locator) ,统一资源定位符是对互联网上资源位置的一种表示,互联网上的每个文件都有一个唯一的URL。

协议://域名:端口号/资源位置?参数=值

* 协议,http、https、ftp等
* 域名,域名或IP地址,都可以访问WEB资源
* 端口号,程序必须使用端口号,才可以让另一个计算机访问。http协议的默认端:80
* 资源位置,用于描述WEB资源在服务器上的位置。
* 参数=值,浏览器和服务器交互传递的数据

例如:

常见路径(访问 京东-笔记本电脑)
https://list.jd.com/list.html?cat=670,671,672
常见路径(访问 京东秒杀-电脑办公)
https://miaosha.jd.com/category.html?cate_id=29

1.2 软件开发的结构分类

CS结构的软件

  • CS:Client/Server 客户端和服务器,这种软件往往需要安装。比如QQ、迅雷、播放器。
  • 优缺点:
    • 优点:
      • 可以减轻服务器端压力,将部分代码写到客户端。
      • 界面很美观。
    • 缺点:
      • 一旦服务器更新了,客户端也需要更新。
      • 分布式开发比较弱。

BS结构的软件

  • BS:Browser/Server 浏览器和服务器,这种软件不需要安装,只需要通过浏览器就可以访问。
  • 优缺点:
    • 优点:
      • 服务器一旦更新,不需要更新客户端,因为客户端就是浏览器
      • 比较强的分布式能力
    • 缺点:
      • 服务器端压力会比较大。
      • 界面效果不如CS结构软件。

1.3 web服务器

在这里插入图片描述
常见的WEB服务器:

  • Tomcat:Apache组织提供的一个开源的免费的web服务器。满足EE的Servlet和JSP的规范。
  • WebSphere :IBM公司开发的一个收费的大型web服务器。满足了EE开发的所有规范。
  • WebLogic:BEA公司开发的一个收费的大型web服务器。满足了EE开发的所有规范。

1.4 Tomcat服务器

  • Tomcat就是一个web的服务器,用来发布web项目。
  • tomcat 目前存在很多版本,希望大家了解tomcat的版本,从而知道自己的创建的项目使用的是几版本规范,不同版 本的规范技术可能不同。这里使用的是JavaEE 7.0,Servlet规范3.1,tomcat至少使用8.5版本。
  • 官网地址:http://tomcat.apache.org
Tomcat版本Servlet版本JavaEE版本
9.0.x4.08.0
8.5.x3.18.0
8.0.x3.17.0
7.0.x3.06.0
6.0.x2.55.0

注:Tomcat的安装启动,见装机必备

Tomcat的目录结构:
在这里插入图片描述
webapps下默认运行的是root目录

2 HTTP协议

2.1 HTTP协议概述

HTTP协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。用于定义WEB浏览器与WEB服务器之间交换数据的过程。
在这里插入图片描述

Http协议的版本

  • HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。
  • HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开。

HTTP协议有两种报文格式:

  • 请求报文:由客户端向服务器端发出的报文。
  • 响应报文:从服务端到客户端的报文。

2.2 Http请求报文详解

HTTP请求报文:由客户端向服务器端发出的报文。

HTTP请求报文格式:包含请求行、请求头、空行、请求体 四个部分
在这里插入图片描述

请求行
例如:POST /web01/login.html HTTP/1.1
请求行必须在HTTP请求格式的第一行。
请求行格式:请求方式 资源路径 协议/版本

请求方式:协议规定7种,常用两种:GET和POST
	GET请求:
		将请求参数追加在URL后面,不安全。例如:login.html?username=tom&password=1234
		URL长度限制GET请求方式的数据大小。
		没有请求体
	POST请求
		请求参数显示请求体处,较安全。
		请求数据大小没有显示。
	只有表单设置为method=”post”才是post请求.其他的都是get请求。
	常见GET请求:地址栏直接访问、<a href=””>、<img src=””> 等
			
请求头

请求头: 描述了客户端向服务器发送请求时使用的http协议类型,所使用的编码,以及发送内容的长度,referer,等等。

请求头也是用的键值对key:value

常见请求头描述
Referer浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链
Cookie与会话有关技术,用于存放浏览器缓存的cookie信息。
User-Agent浏览器通知服务器,客户端浏览器与操作系统相关信息
请求体
通常情况下,只有post请求方式才会使用到请求体,请求体中都是用户表单提交的数据,每一项数据都使用键值对key=value,多组值使用&相连。
	例如;username=tom&password=1234

举个例子:
get抓包数据
在这里插入图片描述
POST请求抓包数据:
在这里插入图片描述

2.3 Http响应报文详解

响应报文:从服务端到客户端的报文。

HTTP响应报文格式:响应行、响应头、空行、响应体 四个部分
在这里插入图片描述

响应行
例如:HTTP/1.1 200 OK
格式:协议/版本 状态码  状态码描述
	状态码:服务器与浏览器用于确定状态的固定数字号码
		200 :请求成功。
		302 :请求重定向。
		304 :请求资源没有改变,访问本地缓存。
		404 :请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。
		500 :服务器内部错误。通常程序抛异常。
		
响应头

响应头: 用来描述服务器回给客户端浏览器的content的一些描述,例如: 我是什么服务器,我返回的是啥编码,我返回的内容有多长等等

响应头也是用的键值对 key:value

常见请求头描述
Location指定响应的路径,需要与状态码302配合使用,完成跳转。
Content-Disposition文件下载的时候使用。通过浏览器以下载方式解析正文
Set-Cookie与会话相关技术。服务器向浏览器写入cookie
Refresh定时刷新
响应体

响应体,就是服务器发送给浏览器的正文。

举个例子:
Http响应报文演示
在这里插入图片描述

3 Servlet

3.1 Servlet概述

  • Servlet(Server Applet)是Java Servlet的简称,称为服务器端小程序,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
  • 狭义的Servlet是指Java语言实现的一个接口
  • 广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

总结:

 *  Servlet技术快速入门
 *  运行在服务器端的程序,称为Servlet, 必须在服务器中运行 Tomcat
 *  等待客户端访问,连接
 *
 *  Servlet技术,客户端交互技术,请求和响应
 *
 *  Sun公司,JavaEE平台上的十三个规范之一
 *
 *  定义接口: javax.servlet.Servlet

使用Servlet

  • 编写一个Java类实现Servlet的接口
  • 在web.xml中,配置Servlet

3.2 Servlet快速入门之小案例

步骤一:创建包和类, 实现servlet的接口

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 *  定义接口: javax.servlet.Servlet
 *
 *  Servlet技术快速入门:
 *   1: 创建类,实现接口Servlet
 *   2: 重写抽象方法,5个 (关注一个方法 service )
 *   3: 编写核心配置文件
 */
public class HelloServlet implements Servlet{
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet快速入门");

        servletResponse.getWriter().write("welcome to ");
    }

    @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中配置这个类

<!--配置servlet-->
<servlet>
    <!--配置servlet名称-->
    <servlet-name>hello</servlet-name>
     <!--配置servlet类的全路径-->
    <servlet-class>com.he.servlet.HelloServlet</servlet-class>
</servlet>
 <!--配置servlet映射关系-->
<servlet-mapping>
    <!--配置关联的servlet名称-->
    <servlet-name>hello</servlet-name>
    <!--配置 访问路径-->
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

步骤三:访问servlet

http://localhost:8080/web01/hello

3.3 Servlet的执行原理

在这里插入图片描述
Tomcat引擎执行的操作

  1. 接受并解析客户端浏览器的请求 “/web01/hello”
  2. 创建2个对象 request, response
  3. 在webapps找访问的资源 “com.he.servlet.HelloServlet”
  4. 反射技术创建Servlet实现类的对象
  5. 调用对象中的方法 service, 传递参数 request, response
  6. 数据写在了 reponse对象的缓冲区中
  7. service方法结束后,数据从response对象的缓冲区取出,组装成HTTP的响应信息, 回传给浏览器

3.4 Servlet生命周期

Servlet生命周期定义了一个Servlet如何被加载、初始化,以及它怎样接收请求、响应请求,提供服务。

 * Servlet对象的生命周期
 * 对象什么时候生,什么时候死
 * 什么时候被创建,什么时候被销毁
 *
 *  1: 对象创建
 *    Servlet对象什么时候被创建
 *    默认: 在客户端第一次访问的时候,对象会被创建
 *    Servlet中有方法 init(),对象创建的时候,会调用init()方法
 *    Tomcat引擎调用方法init()传递参数ServletConfig
 *
 *    在Tomcat启动的时候创建!!  web.xml  <load-on-startup>整数越小,启动优先级越高</load-on-startup>
 *
 *  2: 客户端访问
 *    客户端每次请求Servlet,都会执行方法service
 *    只要有1个请求,就会执行一次
 *
 *  3: 对象销毁
 *    Tomcat服务器关闭的时候,销毁对象
 *    Tomcat引擎调用方法 destroy()
 *
 *    LifeServlet类对象,对象销毁前调用
 *
 *    将你的web项目,从Tomcat的 webapps中移除

3.5 Servlet的访问路径配置

url-pattern的配置
url-pattern配置方式共有三种:完全匹配、目录匹配、扩展名匹配
web.xml配置:

<!--mapping 映射 ,配置Servlet的映射关系-->
<servlet-mapping>
   <servlet-name>config</servlet-name>

   <!--
       <url-pattern></url-pattern> 浏览器的访问路径 (虚拟路径)
       1: 完全匹配方式,绝对匹配 (Servlet的最常用配置)
         /路径

       2: 目录匹配
       /aaa/bbb/*    浏览器必须输入 /aaa/bbb/任意

       3: 后缀名匹配
       *.qqq   浏览器必须驶入 任意.qqq

       注意: 目录匹配和后缀名匹配不能同时使用
   -->

   <url-pattern>/config</url-pattern>
</servlet-mapping>

注意:目录匹配和后缀名匹配不可以同时使用

3.6 Tomcat引擎的全局web.xml

tomcat目录中/conf/web.xml 是全局配置文件,所有的WEB项目都使用

自己的写web.xml只有你自己的项目使用

当全局配置web.xml和自己的web.xml冲突了,听自己的

在这里插入图片描述

4 HttpServlet

4.1 HttpServlet概述

Servlet接口			
	|
	|
GenericServlet类		通用的Servlet,是一个与协议无关的Servlet
	|
	|
HttpServlet类		Http协议专用的Servlet

HTTPServlet继承自GenericServlet类,GenericServlet实现了Servlet接口

HttpServlet是一个与HTTP协议相关的Servlet,专门用来处理HTTP协议的请求响应。

  • 在HttpServlet类的service方法内部,根据HTTP协议请求方式不同,执行不同的doXXX的方法(get请求执行doGet方法,如果是post请求就会执行doPost方法)。
  • 继承了父类HttpServlet之后不需要重写service方法,只需要重写doGet和doPost方法即可。(父类中的service()调用回到我们自己定义实现类的方法doGet())

4.2 HttpServlet执行原理

HTTPServlet如何实现调用service方法
HttpServlet分别重载和重写了service方法,我们实现类重写doGet方法和doPost方法,父类HTTPServlet的service方法会调用我们的doGet和doPost方法
在这里插入图片描述
在这里插入图片描述

4.3 案例介绍

/**
 *  IDEA工具创建出的Servlet
 *  包含2个方法
 *    doPost : 处理客户端的POST请求方式
 *    doGet  : 处理客户端的GET请求方式
 *
 *    Servlet接口,是Sun公司标准
 *    Tomcat引擎调用该接口实现类的方法 service
 *
 *    MyHttpServlet肯定是Servlet接口实现类
 *    MyHttpServlet继承HttpServlet
 *    HttpServlet继承GenericServlet
 *    GenericServlet实现接口Servlet
 *
 *    结论:
 *      客户端请求服务器的时候,Tomcat引擎创建MyHttpServlet对象,调用方法service()
 *      来自于父类的继承,而父类中的service()调用回到我们自己的方法doGet()
 *
 *
 *    无论什么请求方式,都用一个方法来处理
 */
public class MyHttpServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //调用doGet()
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("GET");
    }
}

5 注解开发取代web.xml

Servlet版本JavaEE版本
4.08.0
3.18.0
3.17.0
3.06.0
2.55.0
  • Servlet 2.5版本时
    • Servlet、过滤器(Filter)和监听器(Listener)的声明都必须使用web.xml
  • Servlet 3.0版本时
    • 新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 文件从该版本开始不再是必选的了

@WebServlet, 注解添加到自己定义的Servlet中的类声明上即可, 注解的属性 urlPatterns,属性值就是浏览器的访问地址

//创建servlet,在@WebServlet注解中添加urlPatterns= "/test",作为请求路径
@WebServlet(urlPatterns = "/test")
  • 注解servlet模板修改
    • doPost方法内, 添加doGet(request, response);
    • 修改注解小括号内容为(urlPatterns = "/${Entity_Name}")

创建注解Servlet
在这里插入图片描述
在这里插入图片描述

总结

 * Servlet程序的注解开发
 * 注解取代配置
 * Servlet版本3.0以后,有的注解开发
 * 注解 @WebServlet  写在类上
 * 注解属性 String[] urlPatterns() default {};
 * 数组赋值一个
 *
 * 原理: Tomcat引擎启动的时候,读取 web.xml
 * 并且还会扫描你的所有Servlet接口实现类,获取类上的注解,通过反射建立对象
 * 获取注解值  /annotation,浏览器的访问地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值