Servlet详解(超详细)
Servlet详解
文章目录
- Servlet详解
- 一、基本概念
- 二、Servlet的使用
- 1、创建Servlet类
- 2、配置Servlet
- a. 使用web.xml配置
- b. 使用注解配置
- 3、部署Web应用
- 4、处理HTTP请求和生成响应
- 5、处理表单数据
- HTML表单
- Servlet
- 6、管理会话
- 三、servlet生命周期
- 1、加载和实例化
- 2、初始化
- 3、 请求处理
- 4、销毁
一、基本概念
在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,并重写doGet
或doPost
方法以处理HTTP请求。
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;public class HelloWorldServlet extends HttpServlet {@Overrideprotected 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。
<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。
import javax.servlet.annotation.WebServlet;@WebServlet("/hello")
public class HelloWorldServlet extends HttpServlet {@Overrideprotected 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请求和生成响应
在doGet
或doPost
方法中,可以处理请求参数、生成响应内容、设置响应头等。
@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表单
<!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
@WebServlet("/submitForm")
public class FormServlet extends HttpServlet {@Overrideprotected 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对象来管理用户会话数据。
@WebServlet("/sessionExample")
public class SessionServlet extends HttpServlet {@Overrideprotected 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
类并重写doGet
、doPost
等方法,可以处理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
关键字创建对象。
// 服务器加载Servlet类并创建其实例
HelloWorldServlet servlet = new HelloWorldServlet();
2、初始化
- 初始化:实例化后,Servlet容器会调用Servlet的
init
方法进行初始化。init
方法在Servlet生命周期内只调用一次,通常在此方法中进行资源分配,如数据库连接、读取配置文件等。
@Override
public void init() throws ServletException {// 执行初始化操作System.out.println("Servlet 初始化");
}
3、 请求处理
- 请求处理:Servlet初始化完成后,每次有请求到达时,Servlet容器会调用Servlet的
service
方法。service
方法根据请求类型(GET、POST等)调用相应的doGet
、doPost
等方法。每个请求都会触发一次service
方法的调用。
@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实例对象才会销毁。
@Override
public void destroy() {// 执行清理操作System.out.println("Servlet 销毁");
}
总结:
- 加载和实例化:服务器启动或首次请求时加载Servlet类并创建其实例。
- 初始化:调用
init
方法进行初始化。 - 请求处理:每次请求调用
service
方法,根据请求类型调用相应的doGet
、doPost
等方法。 - 销毁:服务器关闭或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理解图:
相关文章:

Servlet详解(超详细)
Servlet详解 文章目录 Servlet详解一、基本概念二、Servlet的使用1、创建Servlet类2、配置Servleta. 使用web.xml配置b. 使用注解配置 3、部署Web应用4、处理HTTP请求和生成响应5、处理表单数据HTML表单Servlet 6、管理会话 三、servlet生命周期1、加载和实例化2、初始化3、 请…...

Meta AI引入Imagine Me功能,上传图片输入提示词即可实现个性化照片
AITOP100平台获悉,Meta 公司在 AI 领域再次迈出了重要的步伐,其发布的 Llama 3.1 开源 AI 模型以及对 Meta AI 功能的更新扩充引发了广泛关注。 其中,新引入的“Imagine Me”功能尤为引人注目。在这一功能下,美国地区的用户只需上…...
常用自启设置
一、开机自启动 1、编辑 vi /lib/systemd/system/nginx.service 文件,没有创建一个 touch nginx.service 然后将如下内容根据具体情况进行修改后,添加到nginx.service文件中: [Unit] Descriptionnginx Afternetwork.target remote-fs.targ…...
模块与组件、模块化与组件化的理解
在React或其他现代JavaScript框架中,模块与组件、模块化与组件化是核心概念,它们对于提高代码的可维护性、复用性和开发效率具有重要意义。以下是对这些概念的理解: 模块与组件 模块(Module) 定义:模块是…...
Rust:cargo的常用命令
1.查看版本 $ cargo --version cargo 1.79.0 (ffa9cf99a 2024-06-03) 2.创建新的项目 $ cargo new hello 创建后的目录结构为 $ tree hello/ hello/ ├── Cargo.toml └── src └── main.rs 3.运行项目 $ cd hello $ cargo run Compiling hello v0.1.0 (/home/c…...
LeetCode 3106.满足距离约束且字典序最小的字符串:模拟(贪心)
【LetMeFly】3106.满足距离约束且字典序最小的字符串:模拟(贪心) 力扣题目链接:https://leetcode.cn/problems/lexicographically-smallest-string-after-operations-with-constraint/ 给你一个字符串 s 和一个整数 k 。 定义函…...
Elasticsearch 与 MySQL 在查询和插入性能上的深度剖析
在当今的数据处理领域,选择合适的数据库对于应用的性能和效率至关重要。Elasticsearch 和 MySQL 作为两款常用的数据库,它们在查询和插入操作上的性能表现各有千秋。本文将对这两款数据库在这两个关键操作上进行详细的对比分析。 一、引言 随着数据量的…...

day4 vue2以及ElementUI
创建vue2项目 可能用到的命令行们 vue create 项目名称 // 创建项目 cd 项目名称 // 只有进入项目下,才能运行 npm run serve // 运行项目 D: //切换盘符 cd .. // 返回到上一级目录 clear // 清空终端 更改 Vue项目的端口配置 基础语法 项目创建完成之后&#…...
把redis用在Java项目
1. Java连接redis Java连接redis的方式是通过jedis,连接redis需要遵循jedis协议。 1.1 引入依赖 <!--引入java连接redis的驱动--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version&…...
GORM:优雅的Go语言ORM库
文章目录 引言GORM原理基础使用安装GORM定义模型连接数据库CRUD操作 高级使用关联事务回调 优点结论 引言 在Go语言开发中,数据库操作是不可或缺的一部分。虽然直接使用SQL语句可以灵活地与数据库交互,但随着项目规模的扩大,SQL语句的编写、…...

Golang | Leetcode Golang题解之第279题完全平方数
题目: 题解: // 判断是否为完全平方数 func isPerfectSquare(x int) bool {y : int(math.Sqrt(float64(x)))return y*y x }// 判断是否能表示为 4^k*(8m7) func checkAnswer4(x int) bool {for x%4 0 {x / 4}return x%8 7 }func numSquares(n int) i…...

Oracle系统表空间的加解密
实验环境 数据库选择的是orclpdb1,当前系统表空间未加密: SQL> show con_nameCON_NAME ------------------------------ ORCLPDB1SQL> select TABLESPACE_NAME, STATUS, ENCRYPTED from dba_tablespaces;TABLESPACE_NAME STATUS …...
pytorch backbone
1 简介 在PyTorch深度学习中,预训练backbone(骨干网络)是一个常见的做法,特别是在处理图像识别、目标检测、图像分割等任务时。预训练backbone通常是指在大型数据集(如ImageNet)上预先训练好的卷积神经网络…...
uniapp 开发app使用renderjs操作dom
需求:把页面中的对话内容另存为一张图片保存到手机相册。 解决方案:这时我们需要使用到document对象创建一个dom对象计算对话内容的宽高、位置等,再利用canvas能力将内容绘制绘制成一张图保存。 现状:总所周知,非H5端&…...
【面试题】MySQL `EXPLAIN`的`Extra`字段:深入解析查询优化的隐藏信息
MySQL EXPLAIN的Extra字段:深入解析查询优化的隐藏信息 引言 在MySQL的EXPLAIN输出中,Extra字段提供了关于查询执行计划的额外信息。这些信息对于理解查询的内部工作机制和优化查询性能至关重要。本文将详细解析Extra字段中常见的几个关键指标…...

Jenkins持续部署
开发环境任务的代码只要有更新,Jenkins会自动获取新的代码并运行 1. pycharm和git本地集成 获取到下面的 Git可执行文件路径 2. pycharm和gitee远程仓库集成 先在pycharm中安装gitee插件 在设置中找到gitee,点击添加账户,并将自己的账户添…...

橙单前端项目下载编译遇到的问题与解决
今天下载orange-admin前端项目,不过下载下来运行也出现一些问题。 1、运行出现下面一堆错误,如下: 2、对于下面这个错误 error Expected linebreaks to be LF but found CRLF linebreak-style 这就是eslint的报错了,可能是原作者…...
在android中怎么处理后端返回列表中包含图片id,如何将列表中的图片id转化成url
在 Android 中实现从包含图片 ID 的列表获取实际图片 URL 并显示图片,你可以使用以下步骤: 定义数据模型:创建一个 Java 或 Kotlin 类来表示列表中的对象。 网络请求:使用 Retrofit 或其他网络库来获取图片 URL。 异步处理:使用 AsyncTask、RxJava 或 Kotlin 协程来处理网…...
IM聊天代码
客户端 Headers inet inet.h #pragma once #include<Winsock2.h>//#pragma comment(lib,"Ws2_32.lib")class INetMediator; class INet { public:INet(){}virtual ~INet(){}//初始化网络virtual bool initNet() 0;//接收数据virtual void recvData() 0;…...

【Go - context 速览,场景与用法】
作用 context字面意思上下文,用于关联管理上下文,具体有如下几个作用 取消信号传递:可以用来传递取消信号,让一个正在执行的函数知道它应该提前终止。超时控制:可以设定一个超时时间,自动取消超过执行时间…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...