Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发
DAY15.2 Java核心基础
JavaWeb
要想通过浏览器或者客户端来访问java程序,必须通过Servlet来处理
没有Servlet,java是无法处理web请求的
Web交互:
- 接收请求HttpServletRequest:可以获取到请求的信息,比如uri,url,访问的方法…
- 返回请求HttpServletResponse:可以获取Writer,来封装信息返回给浏览器
代码示例:
@WebServlet("/test")
public class MyHttpServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("重写的doGet方法,下面是业务逻辑");resp.getWriter().write("hello");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("重写的doPost方法,下面是业务逻辑");}
}
但是返回的类型是字符串

但是前端都是网页的形式,如何返回网页的形式呢?
可以返回html格式的代码

网页就可以渲染上去了
如果要返回一个写好的网页呢?
之前在Tomcat章节说过我们可以直接通过链接访问到对应的网页,那为什么还需要先访问Servlet再返回HTML呢?
因为我们需要拿到数据渲染到静态网页
静态网页:写死了的网页,无法更新数据
动态网页:我们可以渲染数据到网页上面
真正的网页:静态页面(HTML)+业务数据(后端处理)
但是处理不能在write的时候处理撒
resp.getWriter().write("<h1>Hello World</h1>");
比如要改这个h1标签里面的内容,我们不能直接在这里改,如果这个页面很大很长那咋办?是吧
如果要加一、十行…代码怎么办?
就像
writer.write("<h1>Hello World</h1>");
writer.write("<h1>Hello World2</h1>");
writer.write("<h1>Hello World3</h1>");
writer.write("<h1>Hello World4</h1>");
要是这个页面有上百行,不可能在这写一百行write吧
Java 这时候出现了 JSP 通过 JSP 的机制来解决这个问题
JSP :Java Server Page – Java服务页面
一套前端HTML的动态模板,就好像HTML和Java的混合体,可以动态拼接HTML代码,并且可以嵌入Java代码
手动拼接HTML代码太麻烦
可以直接在JSP中编写java代码,JSP会自动转化为一个Servlet,自动将所有的代码生成对应的write输出
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%String name ="张三";%><h1>Hello</h1><h1>I</h1><h1>am</h1><h1><%=name%></h1>
</body>
</html>

嵌入java代码可以渲染数据
前端看到的是经过JSP加工后的代码

JSP 内置对象
内置对象是jsp引擎自动创建的,开发者无需创建即可使用
-
request:HttpServletRequest 的一个对象,接收用户请求
-
response:HttpServletResponse 的一个对象,客户端做出响应
-
pageContext:PagaContext 的一个对象,页面上下文,获取页面信息
-
session:HttpSession 的一个对象,代表浏览器和服务器的一次会话,保存一个用户信息
-
application:ServletContext 的一个对象,表示当前 WEB 应用,全局对象,保存所有用户的共享数据
-
config:当前 JSP 对应的 Servlet 的 ServletConfig 对象,可以获取当前 Servlet 的信息
-
out:JspWriter 对象,向客户端输出打印信息
-
page:指当前 JSP 对应的 Servlet 对象
-
exception:表示 JSP 页面发送的异常信息
常用的就request、response、session三个内置对象
request常用方法
-
String getParameter(String name) :获取前端传来的参数
-
void setAttribute(String name,Object value) :通过键值对的形式来保存数据
-
Object getAttribute(String name) :通过 key 值获取数据
-
RequestDispatch getRequestDispatch(String path) :返回一个 RequestDispatch 对象,forward() 用于转发请求
doGet的重写业务代码逻辑
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("重写的doGet方法,下面是业务逻辑");// 获取到url中的query参数String id = req.getParameter("id");// 设置request的参数,以便jsp可以找到req.setAttribute("id",id);// 设置请求转发路径,转发到page.jspRequestDispatcher requestDispatcher = req.getRequestDispatcher("/page.jsp");// 请求转发requestDispatcher.forward(req,resp);
}
jsp代码:
通过request.getAttribute(“id”)获取到id的值,然后渲染到网页上面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%String name ="张三";String id = (String) request.getAttribute("id");%><h1>Hello</h1><h1>I</h1><h1>am</h1><h1><%=name%></h1><h1><%=id%></h1>
</body>
</html>
访问网页:
传递的id值为1,渲染到了这个网页上面

response 的常用方法
- sendRedirect(String path) //重定向
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("重写的doGet方法,下面是业务逻辑");String id = req.getParameter("id");// 获取到url中的query参数req.setAttribute("id",id);// 设置请求转发路径,跳转到page.jsp
// RequestDispatcher requestDispatcher = req.getRequestDispatcher("/page.jsp");// 请求转发
// requestDispatcher.forward(req,resp);resp.sendRedirect("/page.jsp");}
如果用sendRedirect(String path) //重定向,则无法取出request的数据
同样都是重定向,为什么sendRedirect(String path) 不能获取request保存的数据呢?(面试考题)
其实是因为sendRedirect(String path) 是重新发送了一个请求,会创建一个新的request对象,则该对象是没有携带id属性参数的
转发和重定向都是进行页面跳转的,区别在哪?
重定向:两次请求
转发:一次请求
比如刚刚那个请求,先进入的是Servlet
如果是转发的话,则进入Servlet和jsp的请求是同一个请求,那么jsp可能可以获取到servlet里面处理过有id参数的request对象,那么肯定可以获取到这个对象的属性参数了
如果是重定向的话,进入Servlet和jsp的请求不是同一个请求,第一个请求是进入Servlet,重定向就相当于让浏览器重新发送一个请求来访问 JSP,第一个请求在 Servlet 中已经结束了它的生命周期,第二次方法 JSP 的请求相当于从浏览器发送的一个全新的请求
但是我们非要用重定向来传递数据呢,那么怎么实现呢?
那么我们需要使用生命周期更长的对象来存储数据
比如session存储,就算是两次不同的请求也可以获取到session存储的数据
session的作用域大于request,都是用来存储数据的
只要不关闭浏览器,我们都可以获取到session里面的数据
HttpSession session = req.getSession();
session.setAttribute("id",id);
在代码中用session存储数据
<%String name ="张三";String id = (String) request.getSession().getAttribute("id");
%>
在jsp读取session数据

可以看见虽然重定向了,但是还是获取到了id的数据
<%String name ="张三";String id = (String) request.getSession().getAttribute("id");
%>
<h1>Hello</h1>
<h1>I</h1>
<h1>am</h1>
<h1><%=name%></h1>
<h1><%=id%></h1>
虽然可以实现数据的传输,但是步骤较为繁琐,效率较低,如何来解决呢?
使用 EL 表达式
EL 表达式有什么作用?
替换 JSP 页面中访问数据时的复杂编码
简化 JSP 页面的取值操作
语法:${key}
JSP 取值的特点是先要存值,才能取值
<body><h1>Hello</h1><h1>I</h1><h1>am</h1><h1>${id}</h1>
</body>
比之前的取值方便多了
EL 表达式 ${id} 会依次从以下作用域查找变量:
- Page Scope(页面作用域)
- Request Scope(请求作用域)
- Session Scope(会话作用域)
- Application Scope(应用作用域)

如果设置没问题,还是出现了${id}的话,有可能EL表达式被忽略了,我们可以手动在 jsp文件 顶部启用
<%@ page isELIgnored="false" %>
相关文章:
Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发
DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序,必须通过Servlet来处理 没有Servlet,java是无法处理web请求的 Web交互: 接收请求HttpServletRequest:可以获取到请求的信息,比如uri&#…...
2300年直线公理使数学一直存在尖锐自相矛盾
2300年直线公理使数学一直存在尖锐自相矛盾 黄小宁 复平面z各点z的对应点2z的全体是2z平面。z面拉伸(平移)变换为2z面(z2面)就使x轴⊂z面沿本身拉伸(平移)变换为u2x轴(ux2轴)。R可…...
hackmyvm-Icecream
arp-scan -l nmap -sS -v 192.168.222.106 enum4linux 192.168.222.106 445端口 smbmap -H 192.168.222.106 icecream为只读模式 smbclient \\192.168.222.106\icecream 反弹shell(上传put php-reverse-shell.php) 开启监听 nc -lnvp 1234 拿到webshell cat /etc/passwd 9000端…...
Apache Tomcat漏洞公开发布仅30小时后即遭利用
近日,Apache Tomcat曝出一项安全漏洞,在公开发布概念验证(PoC)仅30小时后,该漏洞即遭到攻击者利用。这一漏洞编号为CVE-2025-24813,主要影响以下版本: 1. Apache Tomcat 11.0.0-M1 至 11.0.2 …...
告别低效人工统计!自动计算计划进度
实时监控任务进度一直是项目管理中的一项巨大挑战。 人工统计方式不仅耗时耗力,而且往往由于信息传递的延迟和人为误差,导致无法实时获得准确的项目进展信息。 这种不准确性可能掩盖潜在的风险点,从而影响项目的整体进度和成果。 Ganttable …...
AI比人脑更强,因为被植入思维模型【16】反脆弱
毛选中就有言,不经历困难,我们就不会掌握战胜困难的方法。 这个世界纷繁复杂,不是强者总是运气好,而是他们能够失败后快速复原,不断找到战胜困难的方法。 定义 马斯洛需求层次模型是一种将人类需求从低到高按层次进…...
L2TP实验
放开安全策略机制,FW1不配IP [FW1]firewall zone trust [FW1-zone-trust]add interface GigabitEthernet 1/0/0 [FW1]security-policy [FW1-policy-security]default action permit FW2 和FW3 [FW2]interface g1/0/1 [FW2-GigabitEthernet1/0/1]ip address 2…...
【数据预测】基于遗传算法GA的LSTM光伏功率预测 GA-LSTM光伏功率预测【Matlab代码#91】
文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. 遗传算法GA2. 长短期记忆网络LSTM3. 基于GA-LSTM的光伏功率预测4. 部分代码展示5. 运行结果展示6. 资源获取 【可更换其他算法,获取资源请见文章第6节:资源获取】 …...
【记录一下】LMDeploy学习笔记及遇到的问题
LMDeploy 是一个用于大型语言模型(LLMs)和视觉-语言模型(VLMs)压缩、部署和服务的 Python 库。 其核心推理引擎包括 TurboMind 引擎和 PyTorch 引擎。前者由 C 和 CUDA 开发,致力于推理性能的优化,而后者纯…...
Ciura序列
一 概述 Ciura序列是一种用于希尔排序(Shell Sort)的高效增量序列。 由Marcin Ciura于2002年通过实验提出。 1)经验证最优的初始序列为:[1, 4, 10, 23, 57, 132, 301, 701] 2) 后续增量可通过最后一个元素乘以2.25生成(如:701*2.25=1577,1577*2.25=3548...)。 3)时…...
一、MySQL8的my.ini文件
MySQL8.0.11的安装版本my.ini配置文件默认存放在:C:/Program Files/MySQL/MySQL Server 8.0/ 目录下;而MySQL8.0.11绿色免安装版本是没有my.ini配置文件,用户可以自行构建后,再通过my.ini进行数据库的相关配置 一、MySQL8.0.11默…...
【贝叶斯定理(Bayesian Theorem)】
贝叶斯定理(Bayesian Theorem)是概率论中一个革命性的工具,它将主观信念与客观数据结合,形成了独特的贝叶斯统计体系。以下我们将从数学原理、哲学内涵、实际应用三个维度进行深度解析。 一、贝叶斯定理的数学本质 1. 核心公式的…...
HC-05与HC-06蓝牙配对零基础教程 以及openmv识别及远程传输项目的概述
这个是上一年的项目,之前弄得不怎么完整,只有一个openmv的,所以openmv自己去我主页找,这篇主要讲蓝牙 这个是我在使用openmv连接单片机1然后单片机1与单片机2通过蓝牙进行通信 最终实现的效果是:openmv识别到图形和数…...
如何在1分钟内编写Cursorrules
如何在1分钟内编写Cursorrules:Cursor AI用户的快速指南 编写Cursor AI的.cursorrules文件并不需要花费太多时间或显得复杂。无论你是希望定制AI编码助手的开发者,还是想确保团队编码标准一致,你都可以在短短一分钟内创建一个有效的.cursorr…...
Linux中mutex机制
在Linux中,mutex是一种用于多线程编程的同步机制,用于保护共享资源,防止多个线程同时访问或修改这些资源,从而避免竞态条件的发生。mutex 是“mutual exclusion”的缩写,意为“互斥”。 1. Mutex 的基本概念 互斥锁&…...
Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测
Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测 目录 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预…...
AMD公司
本文来自腾讯元宝 AMD(Advanced Micro Devices, Inc.)(先进的微型计算机设备)是一家全球领先的半导体公司,成立于1969年,总部位于美国加利福尼亚州圣克拉拉。AMD 主要从事设计、开发和销售计算机处理器、图…...
数字证书 与 数字签名 介绍
目录 数字签名 什么时候公钥加密数据,什么时候私钥加密数据? 消息认证码(MAC)和数字签名 区别 数字证书 如何使用数字证书验证服务器身份? 数字签名 定义:它类似于现实生活中的手写签名。 手写签名的法律…...
通过webrtc+canvas+css实现简单的电脑滤镜拍照效果
这里我们用的是webrtc中的MediaDevices.getUserMedia()的浏览器api进行的效果实现,MediaDevices.getUserMedia() 会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道…...
OpenLayers集成天地图服务开发指南
以下是一份面向GIS初学者的OpenLayers开发详细教程,深度解析代码: 一、开发环境搭建 1.1 OpenLayers库引入 <!-- 使用CDN引入最新版OpenLayers --> <link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/ollatest/ol.c…...
VBA-Excel
VBA 一、数据类型与变量 常用数据类型: Byte:字节型,0~255。Integer:整数型,用于存储整数值,范围 -32768 到 32767。Long:长整型,可存储更大范围的整数,范围 -214748364…...
OpenHarmony 开源鸿蒙北向开发——linux使用make交叉编译第三方库
这几天搞鸿蒙,需要编译一些第三方库到鸿蒙系统使用。 头疼死了,搞了一个多星期总算搞定了。 开贴记坑。 一、SDK下载 1.下载 在linux下使用命令 wget https://cidownload.openharmony.cn/version/Master_Version/OpenHarmony_5.1.0.54/20250313_02…...
向量库特点和使用场景
开源的专用向量数据库 Milvus 特点:开源分布式向量数据库,性能强大,支持多种索引类型(如IVF、HNSW等)、多种距离度量和灵活的查询方式,社区活跃,功能丰富,适用于处理大规模向量数据和复杂的检索任务。适用场景:适用于需要高性能、高扩展性的向量检索场景,如大型AI应用…...
【第14届蓝桥杯C/C++B组省赛】01串的熵
问题描述 算法思想 首先分析题目中给出的公式 S 100时,其信息熵为 H(S)−p(0)log2(p(0)) − p(0)log2(p(0)) − p(1)log2(p(1)) 继续化简公式得 设0出现的次数为x,1出现的次数为3-x H(S)−x * p(0) * log2(p(0)) − (3-x) * p(1) * log2(p(1)…...
鸿蒙harmonyOS笔记:练习CheckBoxGroup获取选中的值
除了视觉效果实现全选和反选以外,咱们经常需要获取选中的值,接下来看看如何实现。 核心步骤: 1. 给 CheckBoxGroup 注册 onChange。 2. CheckBox 添加 name 属性。 3. 在 onChange 的回调函数中获取 选中的 name 属性。 事件:…...
收数据花式画图plt实战
目录 Python plt想把纵坐标化成对数形式代码 子图ax. 我又有ax scatter,又有ax plot,都要去对数 数字接近0,取对数没有定义,怎么办 创建数据 添加一个小的常数以避免对数未定义的问题 创建一个figure和一个子图ax 在子图a…...
系统架构书单推荐(一)领域驱动设计与面向对象
本文主要是个人在学习过程中所涉猎的一些经典书籍,有些已经阅读完,有些还在阅读中。于我而言,希望追求软件系统设计相关的原则、方法、思想、本质的东西,并希望通过不断的学习、实践和积累,提升自身的知识和认知。希望…...
Centos6配置yum源
Centos6配置yum源 为Centos6配置CentOS Vault源—防止yum源过期为Centos6配置epel源为Centos6配置ELRepo源---已ELRepo被官方清空Centos6安装dockerdocker配置国内镜像加速 为Centos6配置CentOS Vault源—防止yum源过期 参考:https://mirrors.ustc.edu.cn/help/cen…...
CVPR 2025 | 文本和图像引导的高保真3D数字人高效生成GaussianIP
小小宣传一下CVPR 2025的工作GaussianIP。 arXiv:https://arxiv.org/abs/2503.11143 Github:https://github.com/silence-tang/GaussianIP 欢迎star, issue~ 摘要 文本引导的3D人体生成随着高效3D表示及2D升维方法(如SDS)的发展…...
MySQL密码修改的全部方式一篇详解
本文将详细介绍多种修改MySQL密码的方式。 本文目录 一、alter user 语句操作步骤 二、set password操作步骤 三、直接修改 mysql.user表操作步骤 一、alter user 语句 当你以 root 用户或者拥有足够权限的用户登录 MySQL 时,可以使用 ALTER USER 语句来修改密码。…...
