news 2026/5/26 10:59:46

第3章:玩转Servlet

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第3章:玩转Servlet

认识Servlet

本质:

  • 运行在web服务器(如Tomact)上的Java类;
  • 专门用于接受客户端的HTTP请求,处理业务逻辑(如查询数据库,验证登录),生成动态HTTP响应(如返回HTML页面,JSON数据)。

定位:

  • Javaweb开发的"核心组件",是连接客户端(浏览器/APP)与后端服务(数据库/业务逻辑)的"桥梁",所以Javaweb框架(如SpringMVC)的底层都依赖Servlet。

版本关联:

  • Servlet6.0是JakartaEE 10 规范的一部分,包名从传统的javax。servlet改为jakarta.servlet(这是新版与旧版的核心区别,适配Tomact10)。

快速创建JavaWeb项目

项目基本结构:

项目名/ # 项目根目录 ├─ src/ # 源代码目录(核心) │ ├─ main/ # 主程序目录 │ │ ├─ java/ # Java源代码(核心业务逻辑) │ │ │ └─ com/yourcompany/ # 包路径(如Servlet类、工具类) │ │ │ ├─ servlet/ # 存放Servlet类(如LoginServlet.java) │ │ │ └─ service/ # 存放业务逻辑类(如UserService.java) │ │ └─ webapp/ # Web资源目录(前端+配置) │ │ ├─ index.jsp # 默认首页(访问项目根路径时显示) │ │ ├─ static/ # 静态资源(CSS/JS/图片) │ │ │ ├─ css/ │ │ │ ├─ js/ │ │ │ └─ img/ │ │ └─ WEB-INF/ # 受保护目录(客户端无法直接访问) │ │ ├─ web.xml # Web应用配置文件(Servlet映射、过滤器等) │ │ └─ classes/ # 编译后的class文件(Maven自动生成,无需手动放) │ └─ test/ # 测试代码目录(可选) │ └─ java/ # 测试类(如Servlet的单元测试) ├─ pom.xml # Maven核心配置文件(依赖管理、打包方式等) └─ target/ # 构建输出目录(Maven自动生成) └─ 项目名/ # 打包后的Web应用目录(与Tomcat部署结构一致) └─ WEB-INF/ # 对应src/main/webapp/WEB-INF

访问地址:http://localhost:8080

出现以上页面,表示项目初始化成功。

编写第一个Servlet程序

Servlet3.0之前写法:

import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; import java.io.PrintWriter; // 继承HttpServlet类 public class FirstServlet extends HttpServlet { // 处理GET请求 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); // 获取输出流 PrintWriter out = response.getWriter(); // 输出HTML内容 out.println("<html>"); out.println("<head>"); out.println("<title>第一个Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello, Servlet!</h1>"); out.println("<p>这是通过XML配置映射的第一个Servlet程序</p>"); out.println("</body>"); out.println("</html>"); } // 处理POST请求(简单转发到GET处理) @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

web.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>FirstServlet</servlet-name> <!-- Servlet的完整类名(包名+类名) --> <servlet-class>com.example.servlet.FirstServlet</servlet-class> </servlet> <!-- 配置Servlet映射路径 --> <servlet-mapping> <!-- 与上面的servlet-name保持一致 --> <servlet-name>FirstServlet</servlet-name> <!-- 访问路径,在浏览器中通过此路径访问 --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>

3.0之后的写法,(使用注解代替xml)

import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; // 最简配置:仅指定访问路径(value等同于urlPatterns) @WebServlet("/simple") public class SimpleServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<h1>最简Servlet:访问路径 /simple</h1>"); } }

掌握Servlet生命周期

阶段

触发时机

核心方法

作用与特点

1. 实例化

Tomcat 启动时(配置loadOnStartup

)或首次接收请求时

无参构造方法

容器创建 Servlet 实例(单实例:一个 Servlet 类仅创建一个对象,供所有请求共享)

2. 初始化

实例化后立即执行(仅 1 次)

init()

初始化资源(如数据库连接池、配置参数),可通过@WebInitParam

获取初始化参数

3. 服务

每次收到匹配的 HTTP 请求时

service()

doGet()

/doPost()

自动根据请求方法(GET/POST)调用对应doXxx()方法,处理业务逻辑并返回响应

4. 销毁

Tomcat 正常关闭时

destroy()

释放资源(如关闭连接池),避免内存泄漏

测试代码:

/** * servlet的生命周期 */ @WebServlet(urlPatterns = "/live",loadOnStartup = 1) public class LiveServlet extends HttpServlet { //1.实例化阶段:容器调用无参构造 public LiveServlet(){ System.out.println("Instantiation"); } //2.初始化阶段:容器调用init方法 @Override public void init() { System.out.println("init"); } //3.服务阶段:容器调用service方法,处理GET请求 @Override protected void doGet(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws ServletException, IOException { System.out.println("service"); } //4.销毁阶段:容器调用destroy方法 @Override public void destroy() { System.out.println("destroy"); } }

测试结果:

Connected to server [2025-12-24 10:08:30,538] Artifact JavaWebDemo:war exploded: Artifact is being deployed, please wait... Instantiation init [2025-12-24 10:08:30,771] Artifact JavaWebDemo:war exploded: Artifact is deployed successfully [2025-12-24 10:08:30,771] Artifact JavaWebDemo:war exploded: Deploy took 233 milliseconds service 24-Dec-2025 10:08:40.235 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-10.1.50\webapps\manager] 24-Dec-2025 10:08:40.269 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-10.1.50\webapps\manager]的部署已在[34]毫秒内完成

什么是HttpServletRequest?

其是用来封装客户端请求的数据;

常见方法如下:

方法

作用

示例

getParameter(String name)

获取单个请求参数(GET/POST)

request.getParameter("username")

getParameterValues(String name)

获取多个请求参数(如复选框)

request.getParameterValues("hobby")

getRequestURI()

获取请求 URI 路径

/servlet-demo/hello

getMethod()

获取请求方法(GET/POST/PUT/DELETE)

request.getMethod()

→ "GET"

getSession()

获取当前会话(Session)

request.getSession().getAttribute("user")

实例代码:

//3.服务阶段:容器调用service方法,处理GET请求 @Override protected void doGet(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); int age = Integer.parseInt(request.getParameter("age")); response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("<h1>Hello, " + name + " " + age + "</h1>"); System.out.println("service"); }

什么是HttpServletResponse方法?

其是封装服务端响应的数据;

常用方法:

方法

作用

示例

setContentType(String type)

设置响应类型与编码

response.setContentType("text/html;charset=UTF-8")

setStatus(int sc)

设置响应状态码

response.setStatus(404)

(未找到)

sendRedirect(String path)

重定向(客户端跳转,URL 变化)

response.sendRedirect("/servlet-demo/login")

getWriter()

获取字符输出流(返回文本 / HTML/JSON)

response.getWriter().write("success")

测试代码:

//3.服务阶段:容器调用service方法,处理GET请求 @Override protected void doGet(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/json;charset=UTF-8"); String json = "{\"code\":200,\"msg\":\"success\",\"data\":{\"name\":\"张三\",\"age\":20}}"; response.getWriter().write(json); System.out.println("service"); }

什么是Json?

Json:

  • 是一种轻量级的数据交换格式;
  • 它基于ECMAScript(JS规范)的子集,但独立于编程语言;
  • 几乎所以主流编程语言都支持JSON的解析和生成;
  • JSON的设计目标是简洁,易读,易解析;
  • 常用于前后端数据传输(列如:浏览器于服务器之间API通信);
  • 配置文件存储等场景。

核心特点:

特点

说明

文本格式

以纯文本形式存储,任何文本编辑器都可查看 / 编辑

跨语言

与编程语言无关,Java、Python、JavaScript 等均支持

轻量性

相比 XML,语法更简洁(无冗余标签),传输效率更高

结构化

数据以键值对和有序列表(数组)组织,结构清晰


JSON数据类型:

类型

说明

示例

字符串

用双引号""

包裹的文本(不可用单引号)

"name": "张三"

数字

整数或浮点数(无引号)

"age": 20"score": 95.5

布尔值

只能是truefalse(无引号)

"isStudent": true

数组

有序集合,用[]包裹,元素用逗号分隔

"hobbies": ["篮球", "编程"]

对象

无序键值对集合,用{}包裹,键必须是字符串(双引号)

{"name": "张三", "age": 20}

null

表示空值(无引号)

"address": null

合规JSON示例

{ "id": 1001, "name": "张三", "age": 22, "isMale": true, "hobbies": ["足球", "游戏"], "address": { "city": "北京", "street": "中关村大街" }, "score": null }

序列化和反序列化

序列化:

  • 将内存中的对象转换为可传输/存储的JSON字符串的过程;

反序列化:

  • 将JSON字符串转换为内存中的对象的过程;

操作

输入

输出

核心目的

序列化

内存对象(如 Java Bean)

JSON 字符串

便于数据传输(如网络传输)或持久化(如写入文件)

反序列化

JSON 字符串

内存对象(如 Java Bean)

便于程序对数据进行逻辑处理(如调用对象的方法)

常见工具

  • FastJSON(阿里巴巴,轻量、快速)
  • Jackson(Spring 框架默认集成)
  • Gson(Google)



总结:

  • JSON 核心:轻量级数据交换格式,基于键值对和数组,跨语言支持。
  • 序列化JSON.toJSONString(对象)(FastJSON)→ 将对象转 JSON。
  • 反序列化JSON.parseObject(JSON字符串, 类名.class)→ 将 JSON 转对象。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 5:50:52

Pyfolio投资组合分析终极指南:量化投资实战手册

"为什么我的投资策略在回测时表现优异&#xff0c;实盘却屡屡亏损&#xff1f;"这可能是每个量化投资者最深的痛点。传统的Excel分析表早已无法应对海量交易数据的挑战&#xff0c;而复杂的代码编写又让非技术背景的投资者望而却步。 【免费下载链接】pyfolio Portfo…

作者头像 李华
网站建设 2026/5/20 15:38:00

QRemeshify完整指南:5分钟学会将三角网格转换为高质量四边形拓扑

你是否在为复杂的三角网格模型而烦恼&#xff1f;想要快速获得规整的四边形拓扑结构却不知从何下手&#xff1f;QRemeshify这款Blender重网格插件正是为你量身打造的终极解决方案。它能智能地将任意三角网格转换为高质量的四边形拓扑&#xff0c;让3D建模工作变得更加简单高效。…

作者头像 李华
网站建设 2026/5/16 11:13:55

小天才USB驱动下载与设备识别问题深度剖析

小天才USB连接为何总失败&#xff1f;从驱动签名到ADB枚举的硬核拆解 你有没有试过把小天才电话手表插上电脑&#xff0c;结果系统提示“未知设备”&#xff1f;明明只是想同步个联系人、升级下固件&#xff0c;却卡在“USB驱动下载”这一步动弹不得。重装驱动、换线、重启电脑…

作者头像 李华
网站建设 2026/5/22 11:31:49

Ventoy启动界面美化三步法:从单调到惊艳的实战手册

Ventoy启动界面美化三步法&#xff1a;从单调到惊艳的实战手册 【免费下载链接】Ventoy 一种新的可启动USB解决方案。 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy 厌倦了千篇一律的启动界面&#xff1f;想要打造专属的个性化启动体验&#xff1f;Ventoy作…

作者头像 李华
网站建设 2026/5/22 5:40:58

Vue3+Element Plus后台管理系统:从零构建企业级应用的实战指南

Vue3Element Plus后台管理系统&#xff1a;从零构建企业级应用的实战指南 【免费下载链接】vue-element-plus-admin A backend management system based on vue3, typescript, element-plus, and vite 项目地址: https://gitcode.com/gh_mirrors/vu/vue-element-plus-admin …

作者头像 李华
网站建设 2026/5/21 14:43:34

终极指南:Windows Hyper-V运行macOS的完整配置方案

终极指南&#xff1a;Windows Hyper-V运行macOS的完整配置方案 【免费下载链接】OSX-Hyper-V OpenCore configuration for running macOS on Windows Hyper-V. 项目地址: https://gitcode.com/gh_mirrors/os/OSX-Hyper-V 想要在Windows电脑上无缝体验macOS系统吗&#x…

作者头像 李华