JSP

2/22/2022

JSP大纲

# 简介

JSP(Java Server Pages)是一种动态网页开发技术。JSP 文件就是在传统的 HTML 文件中插入 Java 代码和 JSP 标签,后缀名为.jsp

JSP 使用 JSP 标签在 HTML 网页中插入 Java 代码,标签通常以<%开头,以%>结束。

JSP 是 Servlet 的扩展,我们可以在 JSP 中使用 Servlet 的所有功能。另外,JSP 还提供了一些其他功能,例如 EL 表达式、自定义标签等。

JSP 依赖于 Servlet,用户访问 JSP 页面时,JSP 代码会被翻译成 Servlet 代码,最终,以字符串的形式向外输出 HTML 代码。所以,JSP 只是在 Servlet 的基础上做了进一步封装。

# JSP历史

1997 年,Sun 公司推出了 Servlet。

由于当时的 Java Web 层体系结构中只有 Servlet,所以接收用户请求、处理业务逻辑、生成 HTML 代码等都在 Servlet 中完成。Servlet 不能像 PHP、ASP 等语言镶嵌 HTML 代码,因此输出 HTML 比较困难,且部署过程复杂。

为了克服 Servlet 的这些弱点,1999 年初,Sun 公司推出了 JSP。在生成 HTML 代码方面 JSP 比 Servlet 方便许多,而且不需要特殊部署,只需要复制到服务器下面即可运行。简而言之,JSP 就是为了简化 Servlet 工作而出现的替代品。

JSP 包括很多技术,包括 Java Bean、自定义标签(Custom Tags)、EL 表达式(Expression Language)、JSTL 标准标签类库(Java Standard Tag Library)等。这些强大成熟的技术使得 JSP 在视图层(View)具有很大的优势。

# Servlet与JSP异同点

相同点:与 Servlet 一样,JSP 也用于生成动态网页。

不同点如下:

序号 Servlet JSP
1 Servlet 在 Java 内添加 HTML 代码 JSP 在 HTML 内添加 Java 代码
2 Servlet 是一个 Java 程序,支持 HTML 标签 JSP 是一种 HTML 代码,支持 Java 语句
3 Servlet 一般用于开发程序的业务层(做一些复杂的逻辑处理) JSP 一般用于开发程序的表示层(显示数据)
4 Servlet 由 Java 开发人员创建和维护 JSP 常用于页面设计,由 Web 开发人员使用

# JSP相对于Servlet的优点

  1. 易于维护

    相对于 Servlet 来说,JSP 更易于管理。在 JSP 中,我们可以轻松地将业务逻辑与网页设计分开,而在 Servlet 技术中,它们是混合在一起的。

  2. 快速开发:无需重新编译和部署

    JSP 页面被修改后,不需要重新编译和部署项目。而 Servlet 被修改后,需要重新编译和部署。

  3. 代码简洁

    在 JSP 中,我们可以使用 EL、JSTL、自定义标签、隐式对象等,能够有效的减少代码。

# JSP生命周期

JSP 生命周期定义了 JSP 从创建到销毁的整个过程。这类似于 Servlet 生命周期,不同的是,JSP 需要先被编译成 Servlet。

JSP 生命周期阶段如下:

  1. 编译
  2. 初始化(容器调用 jspInit() 方法)
  3. 执行(容器调用 _jspService() 方法)
  4. 销毁(容器调用 jspDestroy() 方法)

# 编译

当浏览器请求 JSP 时,JSP 容器会首先检查是否需要编译页面。如果该页面从未被编译过,或者自上次编译以来对其进行了修改,则编译该页面。

JSP 本质是 Servlet,因此 JSP 容器就是 Servlet 容器 (opens new window)

编译过程包括 3 个步骤:

  • 解析 JSP:JSP 容器解析 JSP 文件,查看是否有语法错误
  • 翻译 JSP:JSP 容器把 JSP 文件翻译为 Servlet 类
  • 编译 Servlet

# 初始化

当容器加载 JSP 时,它将在处理任何请求之前调用 jspInit() 方法。如果您需要自定义 JSP 的初始化内容,可以重写 jspInit() 方法。

public void jspInit(){
   // ...
}
1
2
3

一般情况下,程序只初始化一次。与 Servlet init 方法一样,我们通常在 jspInit() 方法中初始化数据库连接、打开文件。

# 执行

此阶段表示了 JSP 生命周期中所有与请求相关的交互行为,直到被销毁。

JSP 页面完成初始化后,JSP 将会调用 _jspService() 方法。

_jspService() 以 HttpServletRequest 对象和 HttpServletResponse 对象作为方法参数,如下所示:

void _jspService(HttpServletRequest request, HttpServletResponse response) {
   // ...
}
1
2
3

JSP 的 _jspService() 方法根据 request 来生成相应的 response,并且它还负责生成对 HTTP 方法的响应,即 GET、POST、DELETE 等。

# 销毁

JSP 生命周期的销毁阶段表示从容器中删除 JSP。

jspDestroy() 方法等效于 Servlet 中的 destroy() 方法。如果您需要自定义 JSP 的销毁内容,可以重写 jspDestroy() 方法。

jspDestroy() 方法具有以下形式。

public void jspDestroy() {
   ...
}
1
2
3

通常我们在 jspDestroy() 方法中释放数据库连接、关闭打开的文件。

# JSP基础语法

# JSP脚本

# JSP声明语句

# JSP表达式

# JSP注释

# JSP指令

# page指令

# include指令

# JSP动作

# include动作

# forward动作

# param动作

# useBean动作

# setPropertry和getProperty动作

# JSP九大内置对象

# request对象

# response对象

# out对象

# session对象

# application对象

# config对象

# pageContext对象

# page对象

# exception对象

# JSP的Cookie

# EL表达式

# JSTL标签

# 参考资料

Last Updated: 11/21/2022, 10:03:43 PM