深入理解 JSP 与 Servlet:原理、交互及实战应用

一、引言

在 Java Web 开发领域,JSP(JavaServer Pages)和 Servlet 是两个至关重要的技术,它们共同构成了动态网页开发的基础。Servlet 作为服务器端的 Java 程序,负责处理客户端请求并生成响应;而 JSP 则是一种简化的 Servlet 开发方式,允许开发者在 HTML 页面中嵌入 Java 代码,使页面的开发更加直观和便捷。本文将深入探讨 Servlet 的生命周期、请求响应处理机制,以及 JSP 与 Servlet 的交互原理,并通过一个真实的项目实战来加深理解。

二、Servlet 详解

2.1 Servlet 生命周期

Servlet 的生命周期包括加载、实例化、初始化、服务和销毁五个阶段,每个阶段都对应着特定的方法调用。以下是详细的生命周期流程图:

2.1.1 加载

当客户端首次请求访问一个 Servlet 时,Web 容器(如 Tomcat)会查找该 Servlet 的类文件,并将其加载到内存中。

2.1.2 实例化

Web 容器使用 new 关键字创建 Servlet 类的实例。一个 Servlet 类在整个 Web 应用程序的生命周期中通常只会被实例化一次。

2.1.3 初始化

在实例化之后,Web 容器会调用 Servlet 的 init() 方法进行初始化操作。init() 方法只会被调用一次,通常用于加载配置文件、建立数据库连接等初始化工作。以下是一个简单的 Servlet 初始化示例:

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("Servlet 初始化");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// 服务方法}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {// 销毁方法}
}
2.1.4 服务

当客户端发送请求时,Web 容器会调用 Servlet 的 service() 方法来处理请求并生成响应。service() 方法会根据请求的类型(如 GET、POST)调用相应的 doGet() 或 doPost() 方法。以下是一个处理 GET 请求的示例:

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;
import java.io.PrintWriter;@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {res.setContentType("text/html;charset=UTF-8");PrintWriter out = res.getWriter();out.println("<html>");out.println("<head><title>Hello Servlet</title></head>");out.println("<body>");out.println("<h1>Hello, Servlet!</h1>");out.println("</body>");out.println("</html>");}
}
2.1.5 销毁

当 Web 应用程序关闭或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行资源释放操作,如关闭数据库连接、释放文件句柄等。

2.2 请求响应处理

在 Servlet 中,通过 HttpServletRequest 和 HttpServletResponse 对象来处理客户端请求和返回响应。

2.2.1 请求参数解析

HttpServletRequest 对象提供了一系列方法来获取请求参数,如 getParameter()getParameterValues() 等。以下是一个解析请求参数的示例:

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;
import java.io.PrintWriter;@WebServlet("/paramServlet")
public class ParamServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {String name = req.getParameter("name");String age = req.getParameter("age");res.setContentType("text/html;charset=UTF-8");PrintWriter out = res.getWriter();out.println("<html>");out.println("<head><title>Request Parameters</title></head>");out.println("<body>");out.println("<h1>Name: " + name + "</h1>");out.println("<h1>Age: " + age + "</h1>");out.println("</body>");out.println("</html>");}
}
2.2.2 响应内容设置

HttpServletResponse 对象用于设置响应的内容类型、状态码和输出响应内容。以下是一个设置响应内容的示例:

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;
import java.io.PrintWriter;@WebServlet("/responseServlet")
public class ResponseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {res.setContentType("text/plain;charset=UTF-8");res.setStatus(HttpServletResponse.SC_OK);PrintWriter out = res.getWriter();out.println("这是一个响应示例");}
}

三、Servlet 与 JSP 的交互

3.1 JSP 本质

JSP 本质上是 Servlet 的一种特殊形式。当 JSP 页面第一次被请求时,Web 容器会将 JSP 页面翻译成一个 Servlet 类,并编译成字节码文件。这个过程由 JSP 引擎自动完成,开发者无需手动干预。以下是 JSP 翻译为 Servlet 的流程图:

3.2 协同工作原理

Servlet 和 JSP 可以协同工作实现动态网页开发。通常,Servlet 负责处理业务逻辑和数据处理,而 JSP 负责页面的展示。以下是一个简单的项目架构图,展示了 Servlet 和 JSP 的协同工作方式:

四、真实项目实战

4.1 项目需求

开发一个简单的用户信息管理系统,包括用户信息的添加、查询和显示功能。

4.2 项目结构图

user-management-system
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── example
│       │           ├── controller
│       │           │   ├── AddUserServlet.java
│       │           │   └── ListUsersServlet.java
│       │           └── model
│       │               └── User.java
│       └── webapp
│           ├── WEB-INF
│           │   └── web.xml
│           ├── addUser.jsp
│           └── listUsers.jsp

4.3 源码实现

4.3.1 User.java
package com.example.model;public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}
4.3.2 AddUserServlet.java
package com.example.controller;import com.example.model.User;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;
import java.util.ArrayList;
import java.util.List;@WebServlet("/addUser")
public class AddUserServlet extends HttpServlet {private static List<User> users = new ArrayList<>();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {String name = req.getParameter("name");int age = Integer.parseInt(req.getParameter("age"));User user = new User(name, age);users.add(user);res.sendRedirect("listUsers");}
}
4.3.3 ListUsersServlet.java
package com.example.controller;import com.example.model.User;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;
import java.util.ArrayList;
import java.util.List;@WebServlet("/listUsers")
public class ListUsersServlet extends HttpServlet {private static List<User> users = new ArrayList<>();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {req.setAttribute("users", users);req.getRequestDispatcher("listUsers.jsp").forward(req, res);}
}
4.3.4 addUser.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>添加用户</title>
</head>
<body><form action="addUser" method="post"><label for="name">姓名:</label><input type="text" id="name" name="name" required><br><label for="age">年龄:</label><input type="number" id="age" name="age" required><br><input type="submit" value="添加"></form>
</body>
</html>
4.3.5 listUsers.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head><title>用户列表</title>
</head>
<body><h1>用户列表</h1><table border="1"><tr><th>姓名</th><th>年龄</th></tr><c:forEach items="${users}" var

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22824.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[通俗易懂C++]:指针和const

之前的文章有说过,使用指针我们可以改变指针指向的内容(通过给指针赋一个新的地址)或者改变被保存地址的值(通过给解引用指针赋一个新值): int main() {int x { 5 }; // 创建一个整数变量 x&#xff0c;初始值为 5int* ptr { &x }; // 创建一个指针 ptr&#xff0c;指向 …

DL/CV领域常见指标术语(FLOPS/mIoU/混淆矩阵/F1-measure)------一篇入门

1. FLOPS、FLOPs和GFLOPs FLOPS: floating-point operations per second&#xff0c;每秒浮点运算次数&#xff0c;用来衡量硬件性能。 FLOPs&#xff1a;floating point of operations&#xff0c;是浮点运算次数&#xff0c;用来衡量算法、模型的复杂度。 GFLOPS&#xff…

被裁20240927 --- WSL-Ubuntu20.04安装cuda、cuDNN、tensorRT

cuda、cuDNN、tensorRT的使用场景 1. CUDA&#xff08;Compute Unified Device Architecture&#xff09; 作用&#xff1a; GPU 通用计算&#xff1a;CUDA 是 NVIDIA 的并行计算平台和编程模型&#xff0c;允许开发者直接利用 GPU 的并行计算能力&#xff0c;加速通用计算任…

DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?

DeepSeek vs ChatGPT&#xff1a;AI对决中的赢家是……人类吗&#xff1f; 文章目录 DeepSeek vs ChatGPT&#xff1a;AI对决中的赢家是……人类吗&#xff1f;一、引言1. 背景2. 问题 二、DeepSeek vs ChatGPT&#xff1a;谁更胜一筹&#xff1f;2.1 语言生成能力评测对比场景…

旧手机热点无法提供ipv6解决方法(emui 8 热点提供ipv6)

旧手机热点无法提供ipv6解决方法 手机&#xff1a;荣耀8x 系统版本: EMUI 8 网络&#xff1a;移动流量卡 解决方案 设置-》无线和网络-》移动网络-》接入点名称(APN)-》cmiot 修改 APN协议: IPv4/IPv6 修改 APN漫游协议: IPv4/IPv6

I2C学习笔记-软件模拟I2C

I2C学习笔记&#xff08;软件模拟&#xff09; 介绍GPIO的配置信号的展示起始信号 与 停止信号应答信号&#xff08;非应答信号&#xff09;检测应答信号发送一个字节数据接收一个字节数据 硬件配置实物测试 介绍 I2C的信号大概有 起始信号、应答信号、停止信号、写数据、读数…

VUE四:Vue-cli

什么是Vue-cli vue-cli是官方提供的一个脚手架,用于快速生成一个vue的项目模板; 预先定义好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven项目时可以选择创建一个骨架项目&#xff0c;这个骨架项目就是脚手架,我们的开发更加的快速; 什么是web pack 本质上&#…

基于 openEuler 构建 LVS-DR 群集

目录 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式&#xff0c;比较其各自的优势 NAT 模式&#xff08;网络地址转换模式&#xff09; DR 模式&#xff08;直接路由模式&#xff09; 基于 openEuler 构建 LVS-DR 群集 实验准备环境 配置web服务器 web1 web2 首先下载ngi…

传统的自动化行业的触摸屏和上位机,PLC是否会被取代?

传统的自动化行业的触摸屏和上位机是否会被取代&#xff1f; 在工业自动化领域&#xff0c;触摸屏和上位机长期扮演着核心角色&#xff0c;尤其在污水处理、化工生产等场景中&#xff0c;它们通过实时数据采集、逻辑控制、报警联动等功能&#xff0c;保障了生产设备的稳定运行…

Spring Boot 集成MyBatis-Plus

文章目录 一、背景说明二、集成过程 2.1 引入 maven 依赖2.2 增加属性配置2.3 自动配置类 三、验证集成 3.1 控制器3.2 服务类3.3 Mapper接口类3.4 实体类3.4 不要忘记XML文件3.5 发起请求 四、技巧拓展 4.1 如何打印sql语句&#xff1f;4.2 如何对参数增加非空验证&#xff1f…

力扣hot100——排序链表(常见方法,归并排序)

解题思路&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a;将待排序的列表递归地分成两半&#xff0c;直到每个子列表只包含一个元素&#xff08;此时每个子列表都是有序的&#xff09;。解决&#xff08;Conquer&#xff09;&#xff1a;递归地对每个子列表进行排…

技术解析 | 适用于TeamCity的Unreal Engine支持插件,提升游戏构建效率

龙智是JetBrains授权合作伙伴、Perforce授权合作伙伴&#xff0c;为您提供TeamCity、Perforce Helix Core等热门的游戏开发工具及一站式服务 TeamCity 是游戏开发的热门选择&#xff0c;大家选择它的原因包括支持 Perforce、可以进行本地安装&#xff0c;并提供了多种配置选项。…

Three.js 快速入门教程【二】透视投影相机

系列文章目录 系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六…

无人机仿真、感知、规划

文章目录 1.仿真环境1.1 博客教学1.2 教学视频1基础无人机仿真教学视频介绍2 XTDrone无人机仿真与控制技术全面教程3 ROS机器人集群仿真与实践教程 1.3 开源项目及插件1 ROS2-Gazebo Drone Simulation Plugin2 RotorS_UAV_Gazebo_Simulator3 自主无人机与Aruco导航教程4 基于 A…

php文件包含

文章目录 基础概念php伪协议什么是协议协议的格式php中的协议file协议http协议ftp协议php://input协议php://filter协议php://data协议 php文件上传机制高级文件包含nginx文件日志包含临时文件包含session文件包含pear文件包含远程文件包含 基础概念 文件包含&#xff0c;相当…

【超详细】神经网络的可视化解释

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

微软CEO-纳德拉访谈-AGI计划

在与知名科技播客主播 Dwarkesh Patel 的深度访谈中,微软 CEO 萨提亚・纳德拉围绕 AI、量子计算、微软发展等多方面分享深刻见解,下面是针对访谈内容的介绍,其中还是有很多值得我们学习的地方。 1 AI 领域见解 影响力评估:纳德拉直言行业所标榜的 AGI 里程碑是 “无意义的基…

HAProxy介绍与编译安装

目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…

细说STM32F407单片机2个ADC使用DMA同步采集各自的1个输入通道的方法

目录 一、示例说明 二、工程配置 1、RCC、DEBUG、CodeGenerator 2、USART6 3、TIM3 &#xff08;1&#xff09;Mode &#xff08;2&#xff09;参数设置 &#xff08;3&#xff09; TRGO &#xff08;4&#xff09;ADC1_IN0 1&#xff09;ADCs_Common_Settings 2&a…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(一)

项目包含5个模块 1.首页 (聊天主页) 2.注册 3.登录 4.个人资料 5.设置主题 一、配置开发环境 建立项目文件夹 mkdir chat-project cd chat-project mkdir server && mkdir webcd server npm init cd web npm create vitelatest 创建前端项目时我们选择javascrip…