Servlet详解(超详细)

Servlet详解

文章目录

一、基本概念

在Java中,Servlet是用于创建动态Web内容的服务器端组件。Servlet运行在Java EE服务器上,可以响应客户端(通常是Web浏览器)发出的请求。Servlet的生命周期由服务器管理,主要包括初始化、请求处理和销毁三个阶段。

Servlet是一种Java类,它实现了javax.servlet.Servlet接口。Servlet主要用于处理HTTP请求和生成HTTP响应,可以用于创建动态网页、处理表单数据、管理会话等。

二、Servlet的使用

使用Servlet开发Web应用程序主要涉及以下几个步骤:创建Servlet类、配置Servlet、处理请求和生成响应。

1、创建Servlet类

创建一个继承自HttpServlet类的Servlet,并重写doGetdoPost方法以处理HTTP请求。

java 复制代码
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

public class HelloWorldServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html");
        
        // 获取响应输出流
        response.getWriter().println("<h1>Hello, World!</h1>");
    }
}

2、配置Servlet

Servlet可以通过web.xml文件或使用注解配置。在配置中,定义Servlet的名称和URL映射。

a. 使用web.xml配置

WEB-INF目录下的web.xml文件中配置Servlet。

xml 复制代码
<web-app>
    <servlet>
        <servlet-name>HelloWorldServlet</servlet-name>
        <servlet-class>com.example.HelloWorldServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorldServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
b. 使用注解配置

在Servlet类上使用@WebServlet注解配置Servlet。

java 复制代码
import javax.servlet.annotation.WebServlet;

@WebServlet("/hello")
public class HelloWorldServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.getWriter().println("<h1>Hello, World!</h1>");
    }
}

3、部署Web应用

将Servlet类和相关配置文件打包成一个Web应用程序(WAR文件),然后将WAR文件部署到支持Servlet的Java EE服务器(如Tomcat、Jetty等)上。

如图:

4、处理HTTP请求和生成响应

doGetdoPost方法中,可以处理请求参数、生成响应内容、设置响应头等。

java 复制代码
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 获取请求参数
    String name = request.getParameter("name");
    
    // 设置响应内容类型
    response.setContentType("text/html");
    
    // 生成响应内容
    response.getWriter().println("<h1>Hello, " + name + "!</h1>");
}

5、处理表单数据

Servlet可以处理来自HTML表单的数据。以下是一个简单的表单和处理Servlet的示例:

HTML表单
html 复制代码
	<!DOCTYPE html>
<html>
<head>
    <title>Form Example</title>
</head>
<body>
    <form action="submitForm" method="POST">
        Name: <input type="text" name="name">
        <input type="submit" value="Submit">
    </form>
</body>
</html>
Servlet
java 复制代码
@WebServlet("/submitForm")
public class FormServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取表单参数
        String name = request.getParameter("name");
        
        // 设置响应内容类型
        response.setContentType("text/html");
        
        // 生成响应内容
        response.getWriter().println("<h1>Hello, " + name + "!</h1>");
    }
}

6、管理会话

Servlet可以使用HttpSession对象来管理用户会话数据。

java 复制代码
@WebServlet("/sessionExample")
public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取会话对象
        HttpSession session = request.getSession();
        
        // 获取会话属性
        String user = (String) session.getAttribute("user");
        if (user == null) {
            user = "Guest";
        }
        
        // 设置响应内容类型
        response.setContentType("text/html");
        
        // 生成响应内容
        response.getWriter().println("<h1>Hello, " + user + "!</h1>");
        
        // 设置会话属性
        session.setAttribute("user", "John Doe");
    }
}

总结 : Servlet是Java Web开发的核心组件,通过继承HttpServlet类并重写doGetdoPost等方法,可以处理HTTP请求并生成响应。Servlet的配置可以通过web.xml文件或注解完成。Servlet应用广泛,包括动态网页生成、表单处理、会话管理等。通过这些基本步骤和示例代码,可以开始使用Servlet开发功能强大的Web应用程序。

三、servlet生命周期

Servlet的生命周期是指Servlet在服务器中从创建到销毁的整个过程。Servlet生命周期由Servlet容器(如Tomcat、Jetty等)管理,主要包括以下几个阶段:加载和实例化、初始化、请求处理和销毁。

注意:Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。

1、加载和实例化

  • 加载:当服务器启动或首次接收到对该Servlet的请求时,Servlet容器会加载Servlet类。加载过程包括将Servlet类字节码加载到内存中。
  • 实例化 :加载类之后,Servlet容器会创建Servlet类的实例。这个过程类似于使用new关键字创建对象。
java 复制代码
// 服务器加载Servlet类并创建其实例
HelloWorldServlet servlet = new HelloWorldServlet();

2、初始化

  • 初始化 :实例化后,Servlet容器会调用Servlet的init方法进行初始化。init方法在Servlet生命周期内只调用一次,通常在此方法中进行资源分配,如数据库连接、读取配置文件等。
java 复制代码
@Override
public void init() throws ServletException {
    // 执行初始化操作
    System.out.println("Servlet 初始化");
}

3、 请求处理

  • 请求处理 :Servlet初始化完成后,每次有请求到达时,Servlet容器会调用Servlet的service方法。service方法根据请求类型(GET、POST等)调用相应的doGetdoPost等方法。每个请求都会触发一次service方法的调用。
java 复制代码
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 处理GET请求
    response.getWriter().println("<h1>Hello, World!</h1>");
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 处理POST请求
    String name = request.getParameter("name");
    response.getWriter().println("<h1>Hello, " + name + "!</h1>");
}

4、销毁

  • 销毁 :当服务器关闭或Servlet被移除时,Servlet容器会调用Servlet的destroy方法进行清理工作。destroy方法在Servlet生命周期内只调用一次,通常在此方法中释放资源,如关闭数据库连接、清理缓存等。

**注意:**针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。

java 复制代码
@Override
public void destroy() {
    // 执行清理操作
    System.out.println("Servlet 销毁");
}

总结:

  1. 加载和实例化:服务器启动或首次请求时加载Servlet类并创建其实例。
  2. 初始化 :调用init方法进行初始化。
  3. 请求处理 :每次请求调用service方法,根据请求类型调用相应的doGetdoPost等方法。
  4. 销毁 :服务器关闭或Servlet被移除时调用destroy方法进行清理。

注意:在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

小tips: 如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。 用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的公共数据。

对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

小tips: 如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。 用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的公共数据。

Servlet理解图:

相关推荐
计算机人哪有不疯的1 小时前
Hadoop的组成,HDFS架构,YARN架构概述
大数据·数据库·hadoop·spark
静听山水20 小时前
Hive JOIN 优化策略详解
hive
Microsoft Word21 小时前
数据仓库Hive
数据仓库·hive·hadoop
IvanCodes1 天前
四、Hive DDL表定义、数据类型、SerDe 与分隔符核心
大数据·hive·hadoop
IvanCodes1 天前
三、Hadoop1.X及其组件的深度剖析
大数据·hadoop·分布式
IvanCodes1 天前
三、Hive DDL数据库操作
大数据·数据库·hive·hadoop
嘟嘟嘟嘟嘟嘟嘟.1 天前
ETL介绍
hadoop
IT成长日记2 天前
【Hive入门】Hive数据导入与导出:批量操作与HDFS数据迁移完全指南
hive·hadoop·hdfs·数据导入与导出·load data
洋芋爱吃芋头2 天前
hadoop中的序列化和反序列化(3)
大数据·hadoop·python
心碎土豆块2 天前
hadoop的运行模式
大数据·hadoop·分布式