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的优点
易于维护
相对于 Servlet 来说,JSP 更易于管理。在 JSP 中,我们可以轻松地将业务逻辑与网页设计分开,而在 Servlet 技术中,它们是混合在一起的。
快速开发:无需重新编译和部署
JSP 页面被修改后,不需要重新编译和部署项目。而 Servlet 被修改后,需要重新编译和部署。
代码简洁
在 JSP 中,我们可以使用 EL、JSTL、自定义标签、隐式对象等,能够有效的减少代码。
# JSP生命周期
JSP 生命周期定义了 JSP 从创建到销毁的整个过程。这类似于 Servlet 生命周期,不同的是,JSP 需要先被编译成 Servlet。
JSP 生命周期阶段如下:
- 编译
- 初始化(容器调用 jspInit() 方法)
- 执行(容器调用 _jspService() 方法)
- 销毁(容器调用 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(){
// ...
}
2
3
一般情况下,程序只初始化一次。与 Servlet init 方法一样,我们通常在 jspInit() 方法中初始化数据库连接、打开文件。
# 执行
此阶段表示了 JSP 生命周期中所有与请求相关的交互行为,直到被销毁。
JSP 页面完成初始化后,JSP 将会调用 _jspService() 方法。
_jspService() 以 HttpServletRequest 对象和 HttpServletResponse 对象作为方法参数,如下所示:
void _jspService(HttpServletRequest request, HttpServletResponse response) {
// ...
}
2
3
JSP 的 _jspService() 方法根据 request 来生成相应的 response,并且它还负责生成对 HTTP 方法的响应,即 GET、POST、DELETE 等。
# 销毁
JSP 生命周期的销毁阶段表示从容器中删除 JSP。
jspDestroy() 方法等效于 Servlet 中的 destroy() 方法。如果您需要自定义 JSP 的销毁内容,可以重写 jspDestroy() 方法。
jspDestroy() 方法具有以下形式。
public void jspDestroy() {
...
}
2
3
通常我们在 jspDestroy() 方法中释放数据库连接、关闭打开的文件。