活动介绍

JavaServerPages(JSPs)技术详解

立即解锁
发布时间: 2025-08-17 02:29:10 阅读量: 4 订阅数: 12
PDF

Java网络编程与文件处理入门

### JavaServer Pages (JSPs) 技术详解 #### 1. 什么是 JSP JavaServer Pages(JSP)既是一种技术,也是通过该技术创建的软件实体。它于 1999 年末作为新的 Java API 引入,是 Servlet 技术的扩展。与 Servlet 一样,JSP 可生成带有动态内容的 HTML 页面,但 JSP 不是纯粹的 Java 程序,而是嵌入了通过 HTML 样式标签提供的 Java 代码的 HTML 文档。JSP 文件必须以 `.jsp` 为后缀,以便任何支持 JSP 的 Web 服务器能够识别。我们可以使用 Tomcat 来测试 JSP,就像测试 Servlet 一样。 #### 2. 引入 JSP 的原因 Servlet 需要 Java 程序员的专业知识,而创建复杂网站的网页通常是网页作者的工作,他们往往不具备这样的编程技能。JSP 技术的引入旨在将网页创作工作交还给相关人员,同时让 Java 程序员负责网页上使用的软件组件。使用 JSP 还避免了为 HTML 标签重复编写 `out.println` 的繁琐操作。 不过,最初的 JSP API 仍要求网页作者在 JSP 中提供小段 Java 代码。后来,人们开发了更多 HTML 样式的标签,以进一步减少 JSP 中所需的编程量。其中主要成果是 JavaServer Pages Standard Tag Library(JSTL),它由 JSR - 052 专家组开发。JSTL 支持迭代、条件判断、XML 文档处理、国际化和使用 SQL 进行数据库访问等功能。其核心是 Expression Language(EL),专为网页作者设计。增强版的 EL 已集成到 JSP 2.0 规范中,因此只有在使用 JSP 1.2 时才需要 JSTL。 需要注意的是,JSP 并不会使 Servlet 变得多余。Servlet 仍然可用于为网站的全部或部分提供整体控制。Servlet 接收 HTTP 请求,确定要执行的操作,进行必要的后台处理(如打开与远程数据库的连接),然后将控制权传递给 JSP 或普通 HTML 页面,以响应浏览器的初始请求。 #### 3. JSP 的编译和执行 JSP 文件与 HTML 文件存放在同一 Web 应用服务器文件夹中(对于 Tomcat 而言,即 Web 应用的根文件夹)。当 Web 服务器首次引用 JSP 时,它会被转换为 Servlet,然后进行编译,编译后的代码存储在服务器上供后续引用(在 Tomcat 中,编译后的代码存储在 `<CATALINA_HOME>\work` 中)。如果服务器的引用是响应浏览器对 JSP 的请求,那么编译后的代码将被执行。后续浏览器对该 JSP 的所有请求都会导致服务器执行编译后的代码,直到服务器关闭或 JSP 源代码发生更改(Web 服务器通过比较源文件和编译文件的日期来检测更改)。 为避免首次引用 JSP 时出现明显延迟,可以使用预编译的 JSP。一种创建预编译 JSP 的方法是网页开发者使用开发环境处理网站上的所有 JSP(执行转换 - 编译 - 执行周期),然后将生成的 `.class` 文件保存到生产版本网站的相应目录中。更便捷的方法是使用 JSP 规范中提供的特殊请求参数 `jsp_precompile`。使用该参数可避免执行相关 JSP,JSP 容器可利用它生成所需的 `.class` 文件。例如,预编译名为 `MyPage.jsp` 的 JSP 的格式如下: ```plaintext MyPage.jsp?jsp_precompile ``` `jsp_precompile` 是一个布尔参数,上述代码也可以写成 `jsp_precompile=true`,但由于其默认值为 `true`,因此不需要显式指定。 当浏览器调用网页时,Web 服务器执行编译后的 JSP 元素以生成 HTML 元素,将这些元素与页面的静态 HTML 元素合并,然后将完整的页面提供给浏览器。测试 JSP 与测试 Servlet 的一个重要区别是,修改 JSP 时无需停止和重新启动服务器。 #### 4. JSP 标签 除了标准 HTML 标签和普通文本外,JavaServer Page 上还可以使用一些 JSP 特定的标签,主要分为以下几类: - **指令(Directives)**: - **page**:用于通过多个关键字(如 `language`、`contentType` 和 `import`)定义网页的属性。 - **include**:指定要插入的外部文件。 - **taglib**:指定要使用的自定义标签库。 这些指令在 JSP 转换为 Servlet 时由 JSP 引擎处理,标签以 `<%@` 开头,以 `%>` 结尾,`%` 和 `@` 之间不能有空格。示例如下: ```jsp <%@ page language="java" contentType="text/html" import="java.util.*" %> <%@ include file="myFile.html" %> <%@ taglib uri="myTagLib" %> ``` - **声明(Declarations)**:用于声明变量,供后续在表达式或脚本中使用。标签以 `<%!` 开头,以 `%>` 结尾。示例如下: ```jsp <%! int visitCount; %> <%! Date today = new Date(); %> ``` - **表达式(Expressions)**:用于指定 Java 表达式,其值将被计算并插入到当前页面中。表达式可以是任何有效的字面量、变量、运算符和/或方法调用的组合,返回的值可显示在网页上。标签以 `<%=` 开头,以 `%>` 结尾,且表达式不能以分号结尾。示例如下: ```jsp <%= origPrice*(1+VAT) %> <%= today.getMonth() %> ``` - **脚本(Scriptlets)**:是在调用 JSP 时要执行的 Java 代码块。虽然可以通过这种方法包含大量代码,但不建议这样做,应尽量减少脚本代码的使用。脚本标签以 `<%` 开头,以 `%>` 结尾。示例如下: ```jsp <% //'total' and 'numArray' are pre-declared. total = 0; for (int i=0; i<numArray.length; i++) total+=numArray[i]; %> Total: <%= total %> ``` - **注释(Comments)**:类似于 HTML 注释,但在页面发送到浏览器之前会被移除。标签以 `<%--` 开头,以 `--%>` 结尾。单行注释示例: ```jsp <%-- Search algorithm --%> ``` 多行注释需要重复使用这些标签,示例如下: ```jsp <%-- Search algorithm --%> <%-- Implements Quicksort --%> ``` - **动作(Actions)**:执行各种扩展 JSP 标准功能的操作,例如使用 JavaBeans。打开标签指定库和动作名称,用冒号分隔,关闭 `>` 前有一个斜杠 `/`。示例如下: ```jsp <jsp:useBean id="manager" class="staff.Personnel" scope="session" /> ``` #### 5. 隐式 JSP 对象 支持 JSP 的 Web 服务器会自动提供一些对象,JSP 可以直接使用这些对象而无需显式声明。共有九个这样的隐式对象,如下表所示: | 变量 | 类型 | 用途 | | ---- | ---- | ---- | | request | HttpServletRequest | 最初发送到服务器的 HTTP 请求 | | response | HttpServletResponse | 对请求的 HTTP 响应 | | session | HttpSession | 与上述请求和响应关联的会话对象 | | application | ServletContext | 保存多个用户可以访问的其他对象的引用,如数据库链接 | | out | JspWriter | 写入响应输出流的对象 | | exception | Throwable | 包含有关运行时错误的信息,仅在错误页面上可用 | | pageContext | PageContext | 封装页面上下文 | | config | ServletConfig | 此 JSP 的 ServletConfig 对象 | | page | Object | 此 JSP 中的 `this` 对象引用 | 其中,隐式对象 `application` 是为 JSP 自动创建的 `ServletContext` 对象,允许程序员通过 `getAttribute` 和 `setAttribute` 方法检索和设置环境级属性。使用 `getAttribute` 时需要进行类型转换,因为它返回的是 `Object` 引用。示例如下: ```jsp String userName = (String)application.getAttribute("name"); Float balanceObject = (Float)application.ge ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

【仿真模型数字化转换】:从模拟到数字的精准与效率提升

![【仿真模型数字化转换】:从模拟到数字的精准与效率提升](https://img-blog.csdnimg.cn/42826d38e43b44bc906b69e92fa19d1b.png) # 摘要 本文全面介绍了仿真模型数字化转换的关键概念、理论基础、技术框架及其在实践中的应用流程。通过对数字化转换过程中的基本理论、关键技术、工具和平台的深入探讨,文章进一步阐述了在工程和科学研究领域中仿真模型的应用案例。此外,文中还提出了数字化转换过程中的性能优化策略,包括性能评估方法和优化策略与方法,并讨论了数字化转换面临的挑战、未来发展趋势和对行业的长远意义。本文旨在为专业人士提供一份关于仿真模型数

【C#数据绑定高级教程】:深入ListView数据源绑定,解锁数据处理新技能

![技术专有名词:ListView](https://androidknowledge.com/wp-content/uploads/2023/01/customlistthumb-1024x576.png) # 摘要 随着应用程序开发的复杂性增加,数据绑定技术在C#开发中扮演了关键角色,尤其在UI组件如ListView控件中。本文从基础到高级技巧,全面介绍了C#数据绑定的概念、原理及应用。首先概述了C#中数据绑定的基本概念和ListView控件的基础结构,然后深入探讨了数据源绑定的实战技巧,包括绑定简单和复杂数据源、数据源更新同步等。此外,文章还涉及了高级技巧,如数据模板自定义渲染、选中项

手机Modem协议在网络环境下的表现:分析与优化之道

![手机Modem协议开发快速上手.docx](https://img-blog.csdnimg.cn/0b64ecd8ef6b4f50a190aadb6e17f838.JPG?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATlVBQeiInOWTpQ==,size_20,color_FFFFFF,t_70,g_se,x_16) # 摘要 Modem协议在网络通信中扮演着至关重要的角色,它不仅定义了数据传输的基础结构,还涉及到信号调制、通信流程及错误检测与纠正机制。本文首先介

物联网技术:共享电动车连接与控制的未来趋势

![物联网技术:共享电动车连接与控制的未来趋势](https://read.nxtbook.com/ieee/potentials/january_february_2020/assets/4cf66356268e356a72e7e1d0d1ae0d88.jpg) # 摘要 本文综述了物联网技术在共享电动车领域的应用,探讨了核心的物联网连接技术、控制技术、安全机制、网络架构设计以及实践案例。文章首先介绍了物联网技术及其在共享电动车中的应用概况,接着深入分析了物联网通信协议的选择、安全机制、网络架构设计。第三章围绕共享电动车的控制技术,讨论了智能控制系统原理、远程控制技术以及自动调度与充电管理

【心电信号情绪识别用户界面设计的重要性】:用户体验决定识别系统的成败

![【心电信号情绪识别用户界面设计的重要性】:用户体验决定识别系统的成败](https://ecgwaves.com/wp-content/uploads/2023/06/ecg-leads-anatomical-planes-electrodes-1024x465.webp) # 摘要 情绪识别技术作为人机交互领域的一个重要分支,近年来得到了快速发展。本文首先概述了情绪识别技术及其用户界面的重要性,然后深入探讨了心电信号在情绪识别中的理论基础,包括信号特征的提取和情绪状态的生理基础。文章继而介绍了不同情绪识别算法及其性能评估,分析了用户界面设计对用户体验和系统交互效率的影响。此外,本文还提

地震波正演中的数值方法:权威推荐的算法及选择技巧

![地震波正演中的数值方法:权威推荐的算法及选择技巧](https://www.crewes.org/ResearchLinks/Full_Waveform_Inversion/Fig1.jpg) # 摘要 本文全面探讨了地震波正演的数值方法理论基础、常用算法详解、以及在实践应用中面临的挑战和优化策略。首先介绍了地震波正演的基础知识和数值方法的核心概念,随后详细分析了有限差分法、有限元法和有限体积法等常用数值算法的原理和应用,包括各自在地震波正演中的优势和局限性。进一步地,文中探讨了选择和优化数值算法的标准和策略,提出基于不同地质条件和计算资源约束下的算法选择考量。最后,文章指出了实践中的挑

虚拟助理引领智能服务:酒店行业的未来篇章

![虚拟助理引领智能服务:酒店行业的未来篇章](https://images.squarespace-cdn.com/content/v1/5936700d59cc68f898564990/1497444125228-M6OT9CELKKA9TKV7SU1H/image-asset.png) # 摘要 随着人工智能技术的发展,智能服务在酒店行业迅速崛起,其中虚拟助理技术在改善客户体验、优化运营效率等方面起到了关键作用。本文系统地阐述了虚拟助理的定义、功能、工作原理及其对酒店行业的影响。通过分析实践案例,探讨了虚拟助理在酒店行业的应用,包括智能客服、客房服务智能化和后勤管理自动化等方面。同时,

零信任架构的IoT应用:端到端安全认证技术详解

![零信任架构的IoT应用:端到端安全认证技术详解](https://img-blog.csdnimg.cn/20210321210025683.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzI4MjI4,size_16,color_FFFFFF,t_70) # 摘要 随着物联网(IoT)设备的广泛应用,其安全问题逐渐成为研究的焦点。本文旨在探讨零信任架构下的IoT安全认证问题,首先概述零信任架构的基本概念及其对Io

【多源数据整合王】:DayDreamInGIS_Geometry在不同GIS格式中的转换技巧,轻松转换

![【多源数据整合王】:DayDreamInGIS_Geometry在不同GIS格式中的转换技巧,轻松转换](https://community.esri.com/t5/image/serverpage/image-id/26124i748BE03C6A81111E?v=v2) # 摘要 本论文详细介绍了DayDreamInGIS_Geometry这一GIS数据处理工具,阐述了其核心功能以及与GIS数据格式转换相关的理论基础。通过分析不同的GIS数据格式,并提供详尽的转换技巧和实践应用案例,本文旨在指导用户高效地进行数据格式转换,并解决转换过程中遇到的问题。文中还探讨了转换过程中的高级技巧、

FPGA高精度波形生成:DDS技术的顶尖实践指南

![FPGA高精度波形生成:DDS技术的顶尖实践指南](https://d3i71xaburhd42.cloudfront.net/22eb917a14c76085a5ffb29fbc263dd49109b6e2/2-Figure1-1.png) # 摘要 本文深入探讨了现场可编程门阵列(FPGA)与直接数字合成(DDS)技术的集成与应用。首先,本文介绍了DDS的技术基础和理论框架,包括其核心组件及优化策略。随后,详细阐述了FPGA中DDS的设计实践,包括硬件架构、参数编程与控制以及性能测试与验证。文章进一步分析了实现高精度波形生成的技术挑战,并讨论了高频率分辨率与高动态范围波形的生成方法。