初识Servlet(一)🚗

331 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情

写在前面👀

这篇文章主要讲讲HTTP协议和Servlet快速入门

一、HTTP协议

HTTP协议可是个大内容,俺在这就讲些主要的,为了引出Servlet的作用。

1️⃣简介

a.HTTP协议概念

数据传输规则:指的是请求数据响应数据需要按照指定的格式进行传输

  • HTTP协议(HyperText Transfer Protocol,超文本传输协议)是基于 TCP/IP 通信协议来传递数据的,规定的就是浏览器服务器之间数据传输规则

b.HTTP协议特点

  1. 支持客户/服务器模式(C/S架构模型)
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  4. 无连接:一次请求对应一次响应,请求和响应是一一对应关系。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  5. 无状态:对于事物处理没有记忆能力,每次请求和响应都是独立的。客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。
    • 优点:速度快
    • 缺点:多次请求间不能共享数据(所以后面就有了会话技术cookiesession)

2️⃣HTTP请求数据格式

请求方式有很多种,常用的有GET和POST请求

GET请求数据格式总共分为三部分内容,分别是请求行请求头请求空行

POST请求数据格式总共分为四部分内容,分别是请求行请求头请求空行请求体

  • GET请求数据格式示例👇
GET /login.html HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Host: 127.0.0.1:8080
...省略大部分请求头属性
             //请求空行
a.请求行

HTTP请求中的第一行数据,请求行包含三块内容:请求方式请求URL路径HTTP协议及版本

  • 示例👇
GET /login.html HTTP/1.1
b.请求头

从第二行开始,格式为键值对形式

  • 示例👇
Host: 127.0.0.1:8080
  • 服务端可以根据请求头中的内容来获取客户端的相关信息,有了这些信息,服务端就可以处理不同的业务需求。比如服务端通过请求头中的数据获取到客户端的浏览器类型,根据不同浏览器类型执行解析HTML的方式也不同,解决了浏览器兼容问题
c.请求空行

即使第四部分的请求体为空,也必须有请求空行

d.请求体

POST请求的最后一部分,用来存储请求参数

POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
...省略大部分请求头属性
                //请求空行
username=bighorn&password=123456

image-20220425181006594

f.GET请求和POST请求区别
  1. GET请求请求参数在请求行中,没有请求体,POST请求请求参数在请求体中
  2. GET请求请求参数大小有限制,POST没有

3️⃣HTTP响应数据格式

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

  • 响应数据格式示例👇
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html
...省略大部分响应头属性
               //响应空行
<html>
      <head></head>
      <body>
       ...
      </body>
</html>               
a.响应行

响应数据的第一行,响应行包含三块内容,分别是 HTTP协议及版本、响应状态码、状态码消息

  • 示例👇
HTTP/1.1 200 OK
b.响应头

从第二行开始,格式为键值对形式,和服务端的信息和响应数据的信息有关

  • 示例👇
Content-Type: text/html
c.响应空行

响应空行用来分隔响应体

d.响应体

最后一部分,用来存放响应数据

  • 例如上面的示例存放了HTML标签内容
f.状态码
状态码分类说明
1xx响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它
2xx成功——表示请求已经被成功接收,处理已完成
3xx重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。
4xx客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
5xx服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等

二、Servlet简介

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层

1️⃣Servlet工作模式

  • 客户端发送请求至服务器
  • 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
  • 服务器将响应返回客户端

2️⃣Servlet架构

  • Servlet 在 Web 应用程序中的位置👇

image-20220425185421371

3️⃣使用Servlet

  • Servlet其实是javax.servlet接口,使用前,要先定义Servlet实现类,并重写它的五个方法
public interface Servlet {
    void init(ServletConfig var1) throws ServletException;
    ServletConfig getServletConfig();
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    String getServletInfo();
    void destroy();
}

三、第一个Servlet程序

0️⃣创建web项目

  • 这一步就略了,之前文章里演示过好多次

1️⃣导入Servlet依赖坐标

  • 注意依赖范围要写provided(在编译和测试过程中有效,打包的时候无效),这是因为Tomcat的lib目录自带servlet-api这个jar包,这样可以避免在打包时jar包发生冲突
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

2️⃣实现Servlet接口

  1. 定义一个类,实现Servlet接口,并重写接口中所有方法
  2. 使用@WebServlet注解,配置该Servlet的访问路径,如@WebServlet("/demo1")
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {

    public void init(ServletConfig servletConfig) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello servlet!");
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}

3️⃣访问Servlet

  1. 启动Tomcat服务器
  2. 在浏览器地址栏里输入URL,访问该Servlet
http://localhost:8080/tomcat/demo1
  1. 之后会在控制台看见hello servlet!

image-20220424232405018

写在后面🍻

感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗