Servlet

Servlet 是 Java EE 规范中的一个技术,专门用于处理客户端(通常是浏览器)发送到服务器的请求,并生成动态的网页内容。Servlet 是服务器端的一段 Java 代码,它运行在支持 Servlet 技术的 Web 服务器(如 Tomcat)上,主要用于生成动态网页,响应客户端请求。Servlet 的核心概念包括:

核心功能:

  1. 处理请求

    • Servlet 可以处理来自浏览器(或其他客户端)发送的 HTTP 请求(GET、POST 等),并根据请求执行不同的逻辑操作,比如从数据库获取数据,调用其他服务,或进行计算。
  2. 生成响应

    • Servlet 负责将处理结果返回给客户端。通常,响应包括生成的动态 HTML 页面、JSON 数据等内容。
  3. 生命周期管理

    • Servlet 的生命周期由容器(如 Tomcat)管理,Servlet 会经历初始化、请求处理和销毁三个阶段。

Servlet 主要方法:

  1. init():初始化方法,在 Servlet 第一次被创建时调用,通常用于执行一次性的初始化任务。
  2. service() :核心方法,用于处理每次请求。不同的请求类型(如 GET、POST)会调用 doGet()doPost() 方法。
  3. destroy():在 Servlet 被销毁前调用,用于执行清理任务。

Servlet 工作流程:

  • 浏览器请求

    • 当客户端(例如浏览器)发送请求到服务器时,请求包含以下内容:
      • 请求行 :例如 /aaa 路径。
      • 请求头:包含请求的相关元数据,如浏览器信息、请求类型等。
      • 请求体:如果是 POST 请求等可能包含请求数据。
  • Tomcat 请求处理

    • Tomcat 收到这个请求后,会将请求的内容转换为一个 HttpServletRequest 对象。该对象包含客户端请求的所有信息,比如请求头、参数、请求体等。
    • 同时,Tomcat 会创建一个 HttpServletResponse 对象,这个对象用于存储将返回给客户端的响应数据。
  • Servlet 处理

    • Tomcat 根据请求路径(例如 /aaa)找到对应的 Servlet,并调用该 Servletservice() 方法。
    • service() 方法中,Tomcat 会将 HttpServletRequestHttpServletResponse 对象作为参数传入。
    • Servletrequest 对象中提取请求的所有信息(例如参数)。
    • 根据提取的参数,生成响应数据,并将这些数据放入 response 对象。
    • 最后,response 对象中的数据将被发送回客户端。

如何使用Servlet?:

  • 创建一个 Servlet 类

    • HttpServlet 中,除了可以重写 doGet()doPost() 方法来处理 HTTP 请求外,还可以重写 service() 方法。service() 方法是 Servlet 处理请求的核心方法,它负责分发请求给具体的 doGet()doPost()doPut() 等方法。
  • 配置 Servlet

    • 你需要通过配置 Servlet 来定义它的 URL 映射,使得客户端能够通过指定的 URL 访问该 Servlet。在现代的 Java Web 应用中,通常通过 web.xml 或使用注解来配置 Servlet。

      XML 复制代码
      <!-- Servlet 配置 -->
          <servlet>
              <!-- Servlet 名称,可以任意指定 -->
              <servlet-name>myServlet</servlet-name>
              <!-- Servlet 类的完全限定名/路径 -->
              <servlet-class>com.example.MyServlet</servlet-class>
          </servlet>
      
          <!-- Servlet URL 映射 -->
          <servlet-mapping>
              <!-- 与上面的servlet-name相匹配 -->
              <servlet-name>myServlet</servlet-name>
              <!-- 访问该Servlet的URL模式 -->
              <url-pattern>/myServlet</url-pattern>
          </servlet-mapping>

      解释:

    • <servlet> 标签

      • <servlet-name>:为 Servlet 定义一个名称(可以是任意字符串)。它在 <servlet-mapping> 中使用。
      • <servlet-class>:指定 Servlet 类的完全限定名(包括包名)。
    • <servlet-mapping> 标签

      • <servlet-name>:与前面定义的 <servlet-name> 相匹配,用于将 Servlet 类和 URL 模式关联起来。
      • <url-pattern>:指定 URL 路径。当用户访问与此路径匹配的 URL 时,Servlet 会被调用。例如,上面的配置意味着当用户访问 /myServlet 时,MyServlet 将处理该请求。
  • 运行 Servlet

    • Servlet 通常运行在支持 Servlet 容器的 Web 服务器上,如 Apache Tomcat。
java 复制代码
package servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
/*
servlet开发流程:
1.创建javaWEB项目,同时将tomcat添加为当前项目的依赖
2.重写service方法  protected void service(HttpServletRequest req, HttpServletResponse resp)
3.在service方法中,定义业务处理代码
*/

public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1 .从request 对象中获取请求中的任何信息
        String username = request.getParameter("username");
        // 2.处理业务代码
        String info = "YES";
        if("atguigu".equals(username)){
            info = "NO";
        }
        //  3.将要响应的数据放入response
        PrintWriter writer = response.getWriter(); // 该方法返回的是一个向响应体中打印字符串的打印流
        writer.write(info);
    }
}

servlet-api.jar 导入问题

servlet-api 编码的时候需要,运行的时候,在服务器的环境中,由服务软件(Tomcat)提供

因此,我们的IAVAWEB项目中,在打包/构建的时候,是无需携带servlet-api的iar包

UserServlet 中没有显式设置 Content-Type

介绍Content-Type:

Content-Type 是HTTP头字段之一,用于指示发送给接收方的实体的媒体类型。它定义了资源的类型以及服务器如何解释该资源。Content-Type 通常在HTTP请求和响应中使用,尤其是在上传文件和服务器返回文件时。

Content-Type头部的格式为:

bash 复制代码
Content-Type: type/subtype; charset=encoding

其中:

  • type 表示媒体类型的主类型,如 textimageapplication 等。
  • subtype 表示具体的媒体子类型,如 htmlplainjpegjson 等。
  • charset 是可选的参数,表示文本的字符编码方式,如 UTF-8

显示处理:

在Java的HttpServlet中,如果你希望在响应中设置Content-Type,需要显式地调用response.setContentType()方法。默认情况下,Content-Type并不会自动设置,因此如果你没有指定它,浏览器或者客户端可能无法正确处理返回的内容。

java 复制代码
 response.setHeader("Content-Type","text/css");

Servlet url-pattern的一些特殊写法:

1. 精确匹配 (Exact Match)

这种方式是最常见的,Servlet 只处理与指定路径完全匹配的请求。

XML 复制代码
<url-pattern>/myServlet</url-pattern>
  • 示例:访问 http://localhost:8080/app/myServlet 会匹配这个 Servlet。
  • 只能精确匹配 /myServlet,其他任何路径都不会被匹配。

模糊匹配

1. 根路径匹配 /

  • 匹配规则 :匹配所有请求的 URL,但不包括 JSP 文件

  • 说明

    • 当你在 url-pattern 中配置为 / 时,这个 Servlet 将会处理所有的请求,除了一些静态资源(如 JSP 页面)和明确分配给其他 Servlet 的请求。
    • 这种方式适合作为默认的请求处理器,特别是当你想为整个 Web 应用提供一个通用的处理逻辑时。

2. 通配符路径匹配 /*

  • 匹配规则 :匹配所有的 URL 请求,包括 JSP 文件

  • 说明

    • 当你在 url-pattern 中使用 /* 时,它会捕获所有请求,包括 JSP 文件的请求
    • 这意味着请求的 URL 不论路径和文件扩展名是什么,都可以匹配该 Servlet。例如,静态资源、动态资源和 JSP 页面都会由该 Servlet 处理。

3. 路径匹配 /a/*

  • 匹配规则 :匹配以 /a/ 开头的所有请求,前缀为固定的路径,后缀可以是任意路径。

  • 说明

    • 这是路径前缀匹配的一种形式,它会捕获所有以 /a/ 为开头的 URL。
    • 例如:
      • /a/test/a/user/profile/a/settings 都会匹配此 url-pattern
      • /b/test/c/d 则不会匹配。

4. 扩展名匹配 *.action

  • 匹配规则 :匹配所有以 .action 为扩展名的请求,后缀固定,前缀可以是任意路径。

  • 说明

    • 这种模式可以用来匹配具有特定扩展名的所有请求,不论前缀是什么。它非常适合处理特定类型的请求,比如使用 .action 扩展名的请求。

Servlet 注解方式配置Servlet:

@WebServlet 注解的基本用法

@WebServlet 注解用于将一个类声明为 Servlet,并指定它的 URL 映射(url-pattern)。以下是 @WebServlet 注解的常见属性:

  • name:指定 Servlet 的名称,通常可选,如果不指定,默认使用类名。
  • urlPatternsvalue:指定这个 Servlet 可以处理哪些 URL 请求。
  • loadOnStartup:指定 Servlet 是否在服务器启动时加载。值为负数或不设置时,表示在首次访问时加载;如果值为 0 或正数,表示在启动时加载,值越小优先级越高。
  • initParams:定义 Servlet 的初始化参数。
java 复制代码
package servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/s1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet1执行了");
    }
}
相关推荐
XXXJessie2 小时前
c++249多态
java·c++·servlet
dawn1912283 小时前
SpringMVC 中的域对象共享数据
java·前端·servlet
readmancynn3 小时前
Servlet
hive·hadoop·servlet
.生产的驴15 小时前
SpringBoot 消息队列RabbitMQ在代码中声明 交换机 与 队列使用注解创建
java·spring boot·分布式·servlet·kafka·rabbitmq·java-rabbitmq
SuperherRo21 小时前
蓝队技能-应急响应篇&Web内存马查杀&JVM分析&Class提取&诊断反编译&日志定性
servlet·filter·蓝队·内存马
落落落sss1 天前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
ChinaRainbowSea1 天前
十三,Spring Boot 中注入 Servlet,Filter,Listener
java·spring boot·spring·servlet·web
前端小马1 天前
解决IDEA出现:java: 程序包javax.servlet不存在的问题
java·servlet·intellij-idea
寻爱的希斯克利夫2 天前
tomcat 配置jenkins_home 目录
servlet·tomcat·jenkins