Tomcat+Http+Servlet

文章目录

    • 1.HTTP
    • [2. Apache Tomcat](#2. Apache Tomcat)
      • [2.1 基本使用](#2.1 基本使用)
      • [2.2 IDEA中创建 Maven Web项目](#2.2 IDEA中创建 Maven Web项目)
      • [2.3 IDEA中使用Tomcat](#2.3 IDEA中使用Tomcat)
    • [3. Servlet](#3. Servlet)
      • [3.1 Servlet快速入门](#3.1 Servlet快速入门)
      • [3.2 Servlet执行流程](#3.2 Servlet执行流程)
      • [3.3 Servlet 生命周期](#3.3 Servlet 生命周期)
      • [3.4 Servlet体系结构](#3.4 Servlet体系结构)
        • [3.4.1 自定义Servlet类](#3.4.1 自定义Servlet类)
      • [3.5 Servlet urlPattern配置](#3.5 Servlet urlPattern配置)
      • [3.6 XML配置方式编写Servlet](#3.6 XML配置方式编写Servlet)

JAVAWeb技术栈

BS架构:

B/S架构(Browser/Server架构)是一种常见的软件架构模式,用于构建Web应用程序。在B/S架构中,浏览器(Browser)作为客户端,通过网络协议(通常是HTTP)与服务器(Server)进行通信,而服务器负责处理客户端的请求并生成响应。

  • 客户端(浏览器):客户端通常是用户使用的Web浏览器,如Chrome、Firefox或Safari。客户端负责向服务器发送请求,并将服务器返回的响应显示给用户。
  • 服务器:服务器是Web应用程序的核心组件,负责接收客户端的请求并生成响应。服务器通常运行在专用的硬件设备或计算机上,并提供处理请求的软件环境

通信

  • 网络通信:B/S架构依赖于网络通信来实现客户端和服务器之间的数据传输。通常使用HTTP协议进行通信,客户端发送HTTP请求到服务器,服务器处理请求并生成HTTP响应返回给客户端。
    数据交互(动态资源)
  • 数据交互:客户端通过发送请求参数(如表单数据、URL参数等)向服务器发送数据。服务器可以使用不同的技术(如JavaServlet、JSP、ASP.NET等)来处理这些数据,并对其进行验证、处理和存储。
    界面(静态资源)
  • 前端界面:B/S架构中的前端界面通常由HTML、CSS和JavaScript等技术来构建和呈现。

1.HTTP

HTTP(超文本传输协议)是一种用于在Web上进行通信的协议。

  • 它定义了客户端和服务器之间进行请求和响应的规范。
  • HTTP是基于TCP/IP协议栈的应用层协议,使用在Web浏览器和Web服务器之间。
  • HTTP基于请求和响应模型的,一次请求对应一次响应
  • HTTP是无状态的协议,即:每一次请求响应都是独立的
    • 缺点:多次请求不能共享数据
    • 优点: 速度快

1.1 请求和响应

url格式

复制代码
http://www.itcast.cn:8080/news/index.html?uid=123&page=1
  • 协议:"http",常见的协议有HTTP,HTTPS、FTP等
  • ip地址或域名:"www.itcast.cn",也可以使用IP地址作为域名使用
  • 端口:"8080",端口可以省略,默认端口(HTTP:80,HTTPS:443,FTP:21)
  • 资源路径:"/news/index.html"
  • 查询参数:"uid=123&page=1",可以允许有多个参数,多个之间用"&"作为分隔符

http协议特点

  • 简单快速
  • 无连接
  • 无状态;
  • 灵活;
  • 支持C/S模式
HTTP请求:请求行+请求头+请求体

请求行:

说明请求方法、要访问的资源以及所使用的协议版本;

  • 请求方法:
    GET:从服务器获取资源(一项或多项)
    POST:在服务器新建一个资源
    PUT:在服务器更新资源(客户端提供改变后的完整资源)
    DELETE:从服务器删除资源
    请求头:

紧接着请求行,请求头部由键值对组成,每行一对。 请求头部通知服务器有关于客户端请求的信息,典型 的请求头有:

  • Host:表示请求的主机名称
  • User-Agent:产生请求的浏览器类型
  • Accept:客户端(浏览器)可接受的资源类型
  • Content-Type:请求体数据的类型
  • Authorization:用于发送身份验证凭据。
  • Cookie:用于发送服务器分配的Cookie信息。
    请求体

请求体不在GET方法中使用,经常在POST、PUT方法中使用

  • 请求体的数据可以是:表单数据、文本、XML、JSON
  • 与请求数据相关的最常使用的请求头是Content-Type和Content-Length
复制代码
- - 注意事项:- - 
请求行中的请求方法指定了对资源的操作类型,如获取、创建、更新或删除。
请求头提供了关于请求的附加信息,如客户端特性、所接受的响应类型等。
请求体用于传输实际数据,通常在POST、PUT等方法中使用。

Q1: GET和POST请求的区别
- 语义方面:
GET方法用于从服务器获取资源。GET请求不应该对服务器产生副作用,即不应该修改服务器状态。
POST方法用于向服务器提交数据,通常用于创建新资源或发送更新请求。POST请求可以对服务器产生副作用,即可以修改服务器状态。
- 数据传输方面:
GET请求将数据附加在URL的查询参数中,以键值对的形式发送。
POST请求将数据放在请求体中进行传输,而不是作为URL的一部分。
这使得POST请求更适合传输大量数据或敏感数据,因为请求体中的数据不会直接暴露在URL中。
- 数据长度方面:
GET请求的数据传输长度通常受到URL长度的限制。
POST请求的数据传输长度没有特定的限制,但服务器和网络基础设施可能会设置其自己的限制。
- 缓存方面:
GET请求通常可以被浏览器缓存,浏览器可以缓存GET请求的响应并在下次请求相同资源时重用缓存的响应,以提高性能。
POST请求通常不被浏览器缓存,因为它们可能具有副作用,且每个POST请求可能会产生不同的结果。

HTTP响应:响应行(状态行)+响应头+响应体

HTTP响应也由三个部分组成,分别是:状态行、响应头、响应体

状态行

状态行由协议版本号、状态码、状态消息三部分组成

复制代码
状态码有三位数字组成,第一个数字定义了响应的类别:
1xx:响应中--表示请求已接收,正常处理中或需要进一步操作;
2xx:成功--表示请求已被成功接收、理解、接受 
3xx:重定向--要完成请求必须进行更进一步的操作  
4xx:客户端错误--客户发送的请求存在问题有语法错误或请求无法实现 
5xx:服务器端错误--服务器在处理请求时出现了问题,服务器未能实现合法的请求
请求码 说明
100 Continue(继续): 表示服务器已经接收到了请求的头部,并且客户端应该继续发送请求的主体部分。
101 Switching Protocols(切换协议): 表示服务器正在根据客户端的请求切换协议。例如,客户端可以发送Upgrade请求头,请求将连接从HTTP协议切换到WebSocket协议。
102 Processing(处理中): 表示服务器正在处理请求,但尚未完成处理。
200 OK(成功): 表示请求已成功处理,并且服务器返回了请求的内容。
201 Created(已创建): 表示服务器成功创建了新的资源。通常在使用POST请求创建资源时返回.
300 Multiple Choices(多种选择): 表示请求有多个可供选择的资源,需要客户端进行进一步的选择。
301 Moved Permanently(永久重定向): 表示请求的资源已永久移动到新的URL。客户端应该使用新的URL进行后续的请求。
302 Found(临时重定向): 表示请求的资源暂时移动到了新的URL。客户端应该继续使用原始的URL进行后续的请求。
400 Bad Request(错误请求): 表示服务器无法理解客户端发送的请求,通常是由于请求语法错误或参数验证失败导致的。
401 Unauthorized(未授权): 表示客户端需要进行身份验证才能访问请求的资源。需要在请求中提供有效的身份验证凭据。
404 Not Found(未找到): 表示请求的资源在服务器上不存在,无法找到。这是最常见的客户端错误响应码。
500 Internal Server Error(服务器内部错误): 表示服务器在处理请求时遇到了未知的内部错误,导致无法完成请求。
501 Not Implemented(未实现): 表示服务器不支持或未实现请求的功能。通常用于指示服务器无法满足请求的特定功能

\

响应头

响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理响应数据

复制代码
常见的响应头
Content-Type:响应内容的类型,例如"text/html"表示HTML文档,"application/json"表示JSON数据等。
Content-Length:指定响应体的字节长度,用于表示响应内容的大小。
Location:用于重定向响应中,指定重定向的目标URL。
Cache-Control:用于控制响应的缓存行为,例如设置缓存的有效期、是否可缓存等。
Set-Cookie:设置响应中的Cookie,用于在客户端存储数据或维持会话状态。
Server:指定服务器软件的名称和版本号。

响应体

响应体就是响应的消息体,数据可以是普通文本、XML、JSON、HTML源码

2. Apache Tomcat

Web服务器

Web服务器是一种软件或计算机程序,用于接收HTTP请求并返回HTTP响应。它在Web应用程序和客户端之间充当中间层,负责处理和传递网络请求,并提供所请求的资源或执行特定的操作。

//通俗的讲:Web服务器就是把我们自己本地写的html网页放到一个平台,这个平台其他用户通过输入你的IP地址和端口号等也可以访问到。
功能

  • 接收和解析HTTP请求:Web服务器监听指定的端口,接收来自客户端的HTTP请求,并解析请求中的方法、URL、请求头、请求体等信息。
  • 处理请求、生成和发送HTTP响应
  • 将web项目部署到服务器中,对外提供网上浏览服务

常见的Web服务器

  • Nginx:Nginx是一个高性能的开源Web服务器和反向代理服务器。它以轻量级和高并发性能著称,适用于处理大量并发连接
  • Apache HTTP Server:Apache是最流行的开源Web服务器软件之一。它具有稳定性、可靠性和灵活性,广泛用于各种Web应用和网站。

Tomcat是一个轻量级的Web服务器,支持Servlet/JSP少量JavaEE规范,也称为Web容器,Servlet容器。

注意:

Tomcat的启动与Java Development Kit (JDK) 的位置是相关的。Tomcat是一个Java Web应用服务器,它需要Java运行时环境来执行。当你启动Tomcat时,它会查找并使用Java命令来启动。

Tomcat在启动时会按照以下顺序查找JDK:

  1. 检查JAVA_HOME环境变量:Tomcat会首先查找JAVA_HOME环境变量,该变量指向JDK的安装目录。如果JAVA_HOME已经设置,并且指向有效的JDK路径,Tomcat将使用该JDK来启动。

  2. 检查系统路径:如果JAVA_HOME未设置,Tomcat会查找系统路径(PATH环境变量)中的可执行文件java来启动。它将使用找到的第一个java命令执行。

2.1 基本使用

下载:

配置环境变量

启动:双击bin\startup.bat

(控制台中文乱码解决:修改conf/logging.properties

java.util.logging.ConsoleHandler.encoding = GBK (utf-8改为GBK)


验证:在浏览器输入localhost:8080

修改配置:

1.修改启动端口号:conf/server.xml

部署项目

将项目放到webapps目录下,即部署完成。

2.2 IDEA中创建 Maven Web项目

项目结构

  • 编译后的Java字节码文件和resources的资源文件,放到WEB-INF下的classes目录下
  • pomxml中依赖坐标对应的jar包,放入WEB-INF下的lib目录下

IDEA创建Maven Web项目步骤

视频地址: https://www.bilibili.com/video/BV1Qf4y1T7Hx/




2.3 IDEA中使用Tomcat

视频地址:https://www.bilibili.com/video/BV1Qf4y1T7Hxf

方法1:将本地的tomcat集成到IDEA中,然后进行项目部署;



方法2:在pom文件里添加插件

xml 复制代码
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.imooc</groupId>
  <artifactId>web-demo</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <!-- tomcat 插件 -->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>81</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>


</project>

3. Servlet

Servlet是一种Java语言编写的服务器端程序,用于处理客户端发起的请求并返回响应。

  • Servlet 是javaEE规范之一,其实就是一个接口,将来我们需要定义Servlet实现类,并由web服务器运行。
  • Servlet运行在支持Java Servlet规范的Web服务器中,可以接收HTTP请求、处理请求参数、生成动态内容、访问数据库等等。
  • Servlet是Java Web开发的核心技术之一,它可以与JSP、JavaBean等技术结合使用,构建出功能强大的Web应用程序。

3.1 Servlet快速入门

步骤:

  1. 创建web项目,导入Servlet依赖坐标;
  2. 定义一个类,实现Servlet接口,并重写里边的所有方法,并在service方法里输入一句话;
  3. 配置:在类上使用@WebServlet注解,配置该Servlet访问路径;
  4. 访问:启动Tomcat,浏览器输入url访问该Servlet;
xml 复制代码
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
java 复制代码
//2. 定义一个类,实现Servlet接口,并重写里边的所有方法,并在service方法里输入一句话;
package com.itheima;

import javax.servlet.*;
import java.io.IOException;

public class web 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("servlet hello world");
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}




3.2 Servlet执行流程

Q1: Servlet 由谁创建? Servlet方法由谁调用?

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

Q2:服务器怎么知道Servlet中一定有service方法?

  • 因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法

3.3 Servlet 生命周期

复制代码
//方法
1.service() 方法:
- Servlet接口中最重要的方法是service()方法。
- 该方法用于处理HTTP请求,并根据请求的方法(GET、POST、PUT、DELETE等)调用对应的doGet()、doPost()、doPut()、doDelete()等方法进行处理。
- 在service()方法中,开发人员可以根据具体的需求编写自己的处理逻辑。

2.init() 和 destroy() 方法:
- init()方法在Servlet被初始化时调用,可以在该方法中进行一些初始化操作,例如加载配置文件、建立数据库连接等。
- - destroy()方法在Servlet被销毁时调用,可以在该方法中进行一些资源释放操作,例如关闭数据库连接、释放内存等。

3.doGet() 和 doPost() 方法:
- 这两个方法是service()方法中被调用的具体处理HTTP请求的方法。
- doGet()方法用于处理GET请求,doPost()方法用于处理POST请求。

4.getServletConfig() 和 getServletInfo() 方法:
- 这两个方法用于获取Servlet的配置信息和信息描述。
- getServletConfig()方法返回一个ServletConfig对象,该对象包含了Servlet的配置参数。- getServletInfo()方法返回一个描述性字符串,用于描述Servlet的信息。

3.4 Servlet体系结构

Aim:简化开发

HttpServlet类

HttpServlet类是Java Servlet规范中的一个抽象类,它扩展自GenericServlet类,并提供了用于处理HTTP请求和响应的方法。

//通俗来说,我们开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet都会继承HttpServlet

HttpServlet抽象类的方法及说明

方法 说明
doGet() 和 doPost(): 这两个方法用于处理GET和POST请求。
service(): 根据请求的HTTP方法(GET、POST、PUT、DELETE等)自动调用对应的doGet()、doPost()、doPut()、doDelete()等方法。如果业务逻辑不依赖HTTP方法,可以直接重写service()方法。
init() 和 destroy(): 这两个方法用于Servlet的初始化和销毁。
getServletContext(): 该方法返回一个ServletContext对象,用于访问Servlet上下文。
java 复制代码
//get和post
package com.itheima.web;

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;

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        System.out.println("get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        System.out.println("post...");
    }
}

post

编写测试网页

xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
<form action="/web-demo/demo" method="post">
    <input name="username"><input type="submit">
</form>
</body>
</html>

3.4.1 自定义Servlet类

在service方法中,根据请求的不同方式(GET或POST),分别调用了doGet和doPost方法。这意味着你可以在这两个方法中编写处理GET请求和POST请求的逻辑

java 复制代码
package com.itheima.web;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class MyHttpServlet implements Servlet {
    @Override
    public void init(ServletConfig config) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        // 根据请求方式的不同,进行分别的处理

        HttpServletRequest request = (HttpServletRequest) req;

        //1. 获取请求方式
        String method = request.getMethod();
        //2. 判断
        if("GET".equals(method)){
            // get方式的处理逻辑

            doGet(req,res);
        }else if("POST".equals(method)){
            // post方式的处理逻辑

            doPost(req,res);
        }
    }

    protected void doPost(ServletRequest req, ServletResponse res) {
    }

    protected void doGet(ServletRequest req, ServletResponse res) {
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

继承MyServlet

java 复制代码
package com.itheima.web;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

@WebServlet("/demo1")
public class ServletDemo1 extends MyHttpServlet{

    @Override
    protected void doPost(ServletRequest req, ServletResponse res) {
        System.out.println("post...!");
    }

    @Override
    protected void doGet(ServletRequest req, ServletResponse res) {
        System.out.println("get.....!");
    }
}


3.5 Servlet urlPattern配置

servlet urlpattern是指在web.xml文件中配置servlet时,用于指定servlet的访问路径的一种方式。

  • 它可以通过正则表达式来匹配不同的URL路径,从而将请求分发给不同的servlet处理。
    // 例如,可以将urlpattern设置为"/hello",这样当用户访问"http://localhost:8080/hello"时,就会调用对应的servlet来处理请求。
  • 一个Servlet可以配置多个urlPattern
    //例如:@WebServlet(urlPattern = {"/demo1","/demo2"})
复制代码
URL Pattern配置规则:

1.精确匹配:使用具体的URL路径来匹配。
例如,/hello表示只匹配路径为/hello的请求。

2.前缀匹配:使用通配符*来匹配路径的前缀。
例如,/api/*表示匹配以/api/开头的所有请求,如/api/users、/api/products等。

3.后缀匹配:使用通配符*来匹配路径的后缀。(注意不要写斜杠)
例如,*.html表示匹配以.html结尾的请求,如index.html、about.html等。

4.扩展名匹配:使用通配符*来匹配指定扩展名的请求。(注意不要加斜杠)
例如,*.do表示匹配以.do结尾的请求,如/login.do、/register.do等。

5.路径匹配:使用通配符**来匹配多级路径。
例如,/api/**表示匹配以/api/开头的所有请求,无论后面还有多少级路径
如/api/users/getAll、/api/products/getById等。

6.正则表达式匹配:使用正则表达式来匹配路径。
例如,/user/[0-9]+表示匹配以/user/后面跟着一个或多个数字的请求,如/user/123、/user/456等。

3.6 XML配置方式编写Servlet

步骤:

  1. 编写Servlet类
  2. 在web.xml中配置该类
java 复制代码
package com.itheima.web;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

public class ServletDemo13 extends MyHttpServlet {

    @Override
    protected void doGet(ServletRequest req, ServletResponse res) {

        System.out.println("demo13 get...");
    }
    @Override
    protected void doPost(ServletRequest req, ServletResponse res) {
    }
}

在web.xml中配置该Servlet

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
    
    
    <!-- 
        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>
</web-app>
相关推荐
AIGCExplore1 天前
Jenkins 全局配置及工具验证教程
java·servlet·jenkins
计算机毕设指导61 天前
基于微信小程序的丽江市旅游分享系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·旅游
五仁火烧1 天前
HTTP 服务器
服务器·网络·网络协议·http
五仁火烧1 天前
Vite和HTTP 服务器
服务器·网络协议·http·vue
小王不爱笑1321 天前
Java架构从单体到微服务历程
servlet
fy zs1 天前
HTTP协议与HTTPS
网络协议·http·https
alonewolf_991 天前
Tomcat整体架构深度解析:从设计精髓到实战应用
java·架构·tomcat
kaoa0001 天前
Linux入门攻坚——61、tomcat负载均衡集群-LB Cluster
linux·tomcat·负载均衡
@TangXin1 天前
Jenkins-Pipeline语法示例
java·servlet·jenkins
weixin_515069661 天前
OkHttp-HTTP 客户端框架
网络协议·http·okhttp·框架