JavaServerPages(JSPs)技术详解
发布时间: 2025-08-17 02:29:10 阅读量: 1 订阅数: 5 

### 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
```
0
0
相关推荐










