【JavaWeb】JSP

article/2025/7/13 15:22:06

目录

  • 8. JSP
    • 8.1 什么是JSP
    • 8.2 JSP原理
    • 8.3 JSP基础语法
    • 8.4 JSP指令
    • 8.5 九大内置对象
    • 8.6 JSP标签、JSTL标签、EL表达式
      • 8.6.1 JSP标签(JSP Actions)
        • 定义:
        • 常见标签:
        • 示例代码:
        • 注意事项:
      • 8.6.2 EL 表达式(Expression Language)
        • 定义:
        • 语法格式:
        • EL 访问对象范围:
        • 示例:
        • EL 运算符:
      • 8.6.3 JSTL 标签库(JSP Standard Tag Library)
        • 定义:
        • 引入方式(在 JSP 页面顶部添加):
        • 常用 JSTL 标签分类:
          • 核心标签库(Core Tags)
          • 格式化标签库(Fmt Tags)
          • 函数标签库(Fn Tags)
      • 8.6.4 面试高频问题(附参考答案)
      • 8.6.5 总结

8. JSP

8.1 什么是JSP

Java Server Pages:Java服务端页面,和servlet一样,用于动态web技术
最大的特点:

  • 写JSP就像在写html
  • 区别:
    • html只给用户提供静态的数据
    • JSP页面中可以嵌入Java代码,为用户提供动态数据

8.2 JSP原理

思路:JSP是怎样执行的?

  • 代码层面没有任何问题
  • 服务器内部工作
    • tomcat中有一个work目录;IDEA中使用tomcat的会在IDEA的tomcat中生产一个work目录
  • 目录地址

我电脑上的地址:

C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.2

发现页面会被转换成为一个Java类!

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!

JSP最终也会被转换成为一个Java类!

JSP本质上就是一个Servlet

// 初始化
public void _JSPInit() {
}
// 销毁
public void _JSPDestroy() {
}
// JSPservice
public void _JSPService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
  1. 判断请求的方式
  2. 内置一些对象(9个)
final javax.servlet.JSP.PageContext pageContext;    	// 页面上下文
javax.servlet.http.HttpSession session = null;       	// session
final javax.servlet.ServletContext application;        	// applicationContext
final javax.servlet.ServletConfig config;            	// config
javax.servlet.JSP.JSPWriter out = null;                	// out
final java.lang.Object page = this;                    	// page:当前
HttpServletRequest request;                            	// 请求
HttpServletResponse response;                        	// 响应
  1. 输出页面前增加的代码
response.setContentType("text/html;charset=UTF-8");// 设置响应的页面类型
pageContext = _JSPxFactory.getPageContext(this, request, response,null, true, 8192, true);
_JSPx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_JSPx_out = out;
  1. 以上的内置对象可以在JSP页面中直接使用
  2. 原理图

画板

在JSP页面中;
只要是 JAVA代码就会原封不动的输出;
如果是 HTML 代码,就会被转换为:

out.write("<html>\r\n");
out.write("<head>\r\n");

这样的格式,输出到前端!

8.3 JSP基础语法

JSP作为java技术的一种应用,它拥有一些自己扩充的语法,Java所有语法它都支持!

  1. JSP 表达式
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或表达式%>
--%>
<%= new java.util.Date() %>
  1. JSP 脚本
<%--JSP脚本片段--%>
<%int sum = 0;for (int i = 0; i < 100; i++) {sum+=i;}out.print("<h1>sum="+sum+"</h1>");
%>
//--------------------------
<%--EL表达式:${变量} --%>
<%for (int i = 0; i < 3; i++) {
%>
<h1>Hello World! ${i}</h1>
<%}
%>
  1. JSP声明
<%!
static {
System.out.println("loading Servlet!");
}
private int globalVar =0;public void kuang(){System.out.println("进入了该方法!");
}
%>

JSP 声明会被编译到JSP生成java的类中,其他的会被生成到 _JSPService 方法中

8.4 JSP指令

  1. 定制错误页面
<%--定制错误页面--%>
<%@ page errorPage="error/500.JSP" %>

或者在web.xml定制全局的错误页面

  1. 包含头部和尾部

8.5 九大内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application(ServletContext) 存东西
  • Config(ServletConfig)
  • out
  • page
  • exception

存东西的区别

pageContext.setAttribute("name1","张三1"); 	// 保存的数据只在一个页面中有效
request.setAttribute("name2","张三2");		// 保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","张三3");		// 保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","张三4");	// 保存的数据只在服务器中有效,从打开服务器到关闭服务器

request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

8.6 JSP标签、JSTL标签、EL表达式

8.6.1 JSP标签(JSP Actions)

定义:

JSP 标准动作标签是 JSP 内置的一组 XML 风格的标签,用于控制页面行为、操作 JavaBean、引入资源等。

常见标签:
标签功能说明
<JSP:include>包含另一个资源(相当于动态 include)
<JSP:forward>请求转发到另一个资源
<JSP:useBean>创建或查找一个 JavaBean 实例
<JSP:setProperty>设置 JavaBean 属性
<JSP:getProperty>获取 JavaBean 属性值
示例代码:
<JSP:useBean id="user" class="com.example.User" scope="request"/>
<JSP:setProperty name="user" property="name" value="张三"/>
<JSP:getProperty name="user" property="name"/>
注意事项:
  • scope 可选值:page / request / session / application
  • 推荐与 EL 表达式配合使用,避免直接写 Java 脚本

8.6.2 EL 表达式(Expression Language)

定义:

EL 表达式是一种简化版的表达式语言,用来替代 JSP 中的 <% ... %><JSP:getProperty>,使页面更简洁、易读。

语法格式:
${expression}
EL 访问对象范围:
EL 对象作用域
${pageScope}page 作用域
${requestScope}request 作用域
${sessionScope}session 作用域
${applicationScope}application 作用域
示例:
欢迎用户:${user.name} <br>
当前访问路径:${pageContext.request.requestURI} <br>
请求方法:${pageContext.request.method}
EL 运算符:
类型示例
算术运算${5 + 3}
比较运算${age > 18}
逻辑运算${user != null && user.age > 20}
条件判断${score >= 60 ? '及格' : '不及格'}

8.6.3 JSTL 标签库(JSP Standard Tag Library)

定义:

JSTL 是一组标准的自定义标签库,提供通用功能如条件判断、循环、URL 处理、国际化等。

引入方式(在 JSP 页面顶部添加):
<%@ taglib prefix="c" uri="http://java.sun.com/JSP/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/JSP/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/JSP/jstl/functions" %>
常用 JSTL 标签分类:
核心标签库(Core Tags)
标签功能
<c:set>设置变量
<c:out>输出内容(可转义 HTML)
<c:if>条件判断
<c:choose>/<c:when>/<c:otherwise>多条件分支
<c:forEach>循环遍历
<c:forTokens>拆分字符串循环
<c:url>构造 URL
<c:redirect>重定向
<c:import>导入外部 URL 内容

示例:

<c:set var="name" value="李四" />
<c:out value="${name}" escapeXml="true"/><c:if test="${age > 18}">成年人
</c:if>
<c:forEach items="${users}" var="user">${user.name} - ${user.age}<br>
</c:forEach>
格式化标签库(Fmt Tags)
标签功能
<fmt:formatDate>格式化日期时间
<fmt:parseDate>解析日期时间
<fmt:formatNumber>格式化数字、货币
<fmt:message>国际化消息显示

示例:

<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss" />
<fmt:formatNumber value="12345.6789" type="currency" currencySymbol="¥"/>
函数标签库(Fn Tags)
函数功能
fn:length()获取集合/字符串长度
fn:contains()判断是否包含某子串
fn:split()分割字符串
fn:join()合并数组为字符串

示例:

<c:if test="${fn:contains(name, 'Tom')}">名字中包含 Tom
</c:if>
长度:${fn:length("Hello World")}

使用场景推荐做法
页面展示数据使用 EL 表达式
控制流程使用 JSTL 标签
避免 Java 脚本尽量不用 <% ... %>
MVC 分离JSP 只做展示,业务逻辑交给 Servlet 或 Controller
国际化支持使用 <fmt:message> 结合 properties 文件
安全输出使用 <c:out> 防止 XSS 攻击

8.6.4 面试高频问题(附参考答案)

Q1:EL 表达式中的 .[] 有什么区别?

A:. 用于访问属性名固定的对象字段;[] 可以动态传 key,也支持带特殊字符的属性名,例如:${map['user-name']}


Q2:JSTL 标签为什么比 Java 脚本更好?

A:因为 JSTL 是标签形式,更易于维护、阅读,且更适合美工或前端人员参与开发,同时避免了大量 Java 代码混杂在 HTML 中的问题。


Q3:如何防止 EL 表达式被忽略?

A:在 web.xml 中设置 JSP 默认启用 EL:

<JSP-config><JSP-property-group><url-pattern>*.JSP</url-pattern><el-ignored>false</el-ignored></JSP-property-group>
</JSP-config>

Q4:JSTL 的 <c:forEach> 和 Java 的 for 循环有什么不同?

A:<c:forEach> 是标签库实现的循环,底层由 Java 代码处理,但它是声明式的,适合嵌入 HTML 页面中使用,而 Java 的 for 是命令式的,用于后端逻辑。


8.6.5 总结

在现代 JSP 开发中,应尽量避免使用 <% ... %> 脚本,而是使用 EL 表达式 + JSTL 标签库 来完成页面逻辑,这样不仅结构清晰,而且更符合 MVC 设计模式。


http://www.hkcw.cn/article/jyvNDCtEbp.shtml

相关文章

中国区域每月地下水水位栅格数据集(2005-2022)

时间分辨率&#xff1a;月空间分辨率&#xff1a;1km - 10km共享方式&#xff1a;开放获取数据大小&#xff1a;8.52 GB数据时间范围&#xff1a;2005-01-01 — 2022-12-01元数据更新时间&#xff1a;2024-09-09 数据集摘要 数据集“GWs_cn_1km”提供了2005年至2022年中国区域…

哪些岗位最易被AI替代?

随着AI技术高速演进&#xff0c;一场“职场大洗牌”正悄然上演。当ChatGPT出口成章、机器人能精准执勤&#xff0c;AI时代的“就业焦虑”已不再是空谈。你是否认真思考过&#xff0c;自己所处的岗位是否也正面临被AI边缘化的风险&#xff1f; 以下几类职业&#xff0c;已成为AI…

【实操】配置VLAN间路由

原创&#xff1a;厦门微思网络 点击查看【相关学习】 【干货】什么是VLAN&#xff1f; 【技术分享】常见VLAN部署方式 【必看】华为设备配置单臂路由实现VLAN间通信 实验目的 1. 理解VLAN间路由的原理 2. 掌握VLAN间路由的配置方法 实验拓扑 实验需求 1、根据实验拓扑图…

光谱相似度匹配算法设计

一、核心算法类型 ‌光谱角度匹配&#xff08;SAM&#xff09;‌ 通过计算两个光谱向量间的夹角评估相似性&#xff0c;夹角越小相似度越高。适用于高光谱遥感地物分类&#xff0c;对光照强度变化不敏感。 公式&#xff1a; 其中X/YX/Y为待比较光谱向量 ‌交叉相关匹配‌ 计…

RedisTemplate查询不到redis中的数据问题(序列化)

RedisTemplate查询不到redis中的数据问题(序列化) 一.问题描述 存入Redis中的值取出来却为null,问题根本原因就是RedisTemplate和StringRedisTemplate的序列化问题、代码示例&#xff1a; SpringBootTest class Redis02SpringbootApplicationTests {Autowiredprivate RedisTe…

SPI通信

第一章&#xff1a;SPI通信协议概述 SPI&#xff08;串行外设接口&#xff09;协议是一种由摩托罗拉公司开发的通信协议&#xff0c;它支持芯片与外部设备之间进行半双工或全双工、同步、串行的数据交换。该协议允许设备配置为主模式&#xff0c;为主设备提供通信时钟&#xff…

ArkUI--抽奖

摘要&#xff1a;本文展示了一个基于ArkUI的生肖抽奖应用实现。通过State管理当前选中索引(n1)、各卡片中奖次数(nums)和生肖图片资源(pics)。点击抽奖按钮时&#xff0c;启动15次循环动画后随机停在0-5索引位置&#xff0c;并在对应卡片Badge上累计中奖次数。界面包含32网格展…

平台对比:澳洲电商增速放缓期,Kogan如何实现38%客户增长?

过去三年&#xff0c;全球电商经历了一场从“井喷”到“冷静”的转变。澳洲市场也不例外。根据Statista数据显示&#xff0c;2023年澳大利亚整体电商零售增长仅为3.8%&#xff0c;远低于前两年的两位数增长。在这样的背景下&#xff0c;本土电商平台Kogan却逆势上扬&#xff0c…

差分S参数-信号与电源完整性分析

差分S参数: 由于差分互连中使用差分信号传递信息&#xff0c;接收器最关心的是差分信号的质量&#xff0c;如果互连通道的S参数能直接反映出对差分信号的影响&#xff0c;对分析问题将方便得多。差分互连通道可以看成是一个四端口网络&#xff0c;激励源为单端信号&#xff0c;…

计算机一次取数过程分析

计算机一次取数过程分析 1 取址过程 CPU由运算器和控制器组成&#xff0c;其中控制器中的程序计数器(PC)保存的是下一条指令的虚拟地址&#xff0c;经过内存管理单元(MMU)&#xff0c;将虚拟地址转换为物理地址&#xff0c;之后交给主存地址寄存器(MAR)&#xff0c;从主存中取…

鸿蒙OS的5.0.1.120版本体验怎么样?

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 越来越是好用了&#xff0c;之前是凑合能用&#xff0c;现在是大多能用。 我朋友的mate30PRO和PuraX一起用&#xff0c;新系统确实满足我90%以上的需求 一个系统适配一款机型&#xff0c;是要…

CPT302 Multi-Agent Systems 题型

Agent games Wumpus World 乌普斯世界 设定 环境&#xff1a;一个二维网格状的洞穴&#xff08;cave&#xff09;&#xff0c;由多个房间&#xff08;rooms&#xff09;组成。 起点&#xff1a;智能体&#xff08;agent&#xff09;总是从左下角的 Room[1,1] 开始。 连接方式…

太阳诱电多层陶瓷电容器的优势和特点

基于电容器市场需求或将扩大的方向性战略所开展的产品研发 除多层陶瓷电容器外&#xff0c;电容器还包括电解电容器和薄膜电容器等类型。随着节能化、物联网化的进一步加速发展&#xff0c;可以预见高性能电容器的需求量将在中长期内有所增长。 多层陶瓷电容器对于实现电子设…

Chrome v131.0.6778.86 绿色便携版 下载

Google Chrome浏览器增强版&#xff0c;采用shuax便携式Dll劫持补丁加入原版打包而成&#xff0c; Chrome增强软件模块&#xff0c;强制实现flash插件支持&#xff0c;解除Adobe Flash Player地区不相容限制和移除警告提示&#xff0c;增强标签页功能。 百度网盘&#xff1a;ht…

PYTHON调用讯飞唤醒实现麦克风说话机器人离线唤醒

引言 语音唤醒技术是现代智能语音交互系统中的重要组成部分&#xff0c;它允许设备在待机状态下通过特定的唤醒词进入交互状态。本文将介绍如何使用Python结合讯飞语音SDK实现一个简单的语音唤醒系统。 技术背景 语音唤醒技术主要依赖于以下几个关键技术点&#xff1a; 声学…

做销售讲究接地气

你有没有遇到过这种情况&#xff1f;两个人聊了半天&#xff0c;你越说对方越皱眉&#xff0c;最后礼貌地说"我再考虑考虑"。其实不是产品不够好&#xff0c;而是没戳中对方心里那根弦。做销售最讲究的就是"接地气"。 和人打交道就像炒菜&#xff0c;火候…

ImBatch 7.6.3 中文版 - 高效图片批量处理工具

ImBatch是一款专业高效的图片批量处理工具。它提供强大的图像编辑功能&#xff0c;包括裁剪、尺寸调整、旋转等操作&#xff0c;并内置数十种专业工具&#xff0c;能满足各类复杂的图像处理需求。软件界面已全面中文化&#xff0c;操作更加便捷直观。 ImBatch下链接&#xff1…

Python+requests+pytest接口自动化测试框架的搭建(全)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 框架的设计思路 首先要明确进行接口自动化需要的步骤&#xff0c;如下图所示&#xff1a; 然后逐步拆解需要完成的工作&#xff1a; 1&#xff09;了解分析需求&…

C#定时器深度对比:System.Timers.Timer vs System.Threading.Timer性能实测与选型指南

本文通过真实基准测试揭秘两种常用定时器的性能差异&#xff0c;助你做出最佳选择 一、C#定时器全景概览 在C#生态中&#xff0c;不同定时器适用于不同场景。以下是主流定时器的核心特性对比&#xff1a; 定时器类型命名空间适用场景触发线程精度内存开销依赖框架System.Wind…

简单配置RHEL9.X

切换默认运行级别 将系统默认启动模式从多用户的图形界面调整为多用户的文本界面&#xff0c;适用于优化系统资源占用或进行远程服务器管理的场景。 注意&#xff1a;安装选择“带GUI的服务器”部分常用命令默认安装&#xff1b;如果选择“最小安装”时&#xff0c;部分常用命…