jsp 笔记
1、什么是 jsp,它有什么用?
jsp(全称 Java Server Pages)是由 Sun 公司专门为了解决动态生成 HTML 文档的技术。
jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据。 因为 Servlet 程序回传 html 页面数据是一件非常繁锁的事情。开发成本和维护成本都极高。
这就是 jsp 页面的文件结构:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>这是一个 jap 页面</h2>
</body>
</html>
2、jsp 的本质是什么?
jsp 页面本质上是一个 Servlet 程序。
当我们第一次访问 jsp 页面的时候。Tomcat 服务器会帮我们把 jsp 页面翻译成为一个 java 源文件。并且对它进行编译成为.class 字节码文件。
所以,jsp 页面的访问千万不能像 HTML 页面一样。托到浏览器中。只能通过浏览器访问 Tomcat 服务器再访问 jsp 页面。
下图就是 jsp页面对应的 java 源文件:
跟踪源码发现,HttpJspBase 类继承了 HttpServlet 类。也就是说 jsp 翻译出来的 java 类,间接的 继承了 HttpServlet 类,所以说 jsp 的本质就是一个 Servlet 程序。
3、jsp 的语法
3.1、jsp 文件头部声明介绍(page 指令介绍)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
这是 jsp 文件的头声明。表示这是 jsp 页面。
jsp 的 page 指令可以修改 jsp 页面中一些重要的属性,或者行为。
属性 | 作用 |
---|---|
language | 表示 jsp 翻译后是什么语言文件。暂时只支持 java。 |
contentType | 表示 jsp 返回的数据类型是什么。也是源码中 response.setContentType()参数值 |
pageEncoding | 设置当前 jsp 页面的编码 |
import | 给当前 jsp 页面导入需要使用的类 |
autoFlush | 设置是否自动刷新 out 缓冲区。默认为 true |
buffer | 设置 out 的缓冲区大小。默认为 8KB |
errorPage | 设置当前 jsp 发生错误后,需要跳转到哪个页面去显示错误信息 |
isErrorPage | 设置当前 jsp 页面是否是错误页面。是的话,就可以使用 exception 异常对象 |
session | 设置当前 jsp 页面是否获取 session 对象。默认为 true |
extends | 给服务器厂商预留的 jsp 默认翻译的 servlet 继承于哪个类 |
3.2、jsp 中的三种脚本
a)声明脚本(极少使用)
声明脚本的格式是: <%! java 代码 %>
作用:
- 定义全局变量。
- 定义 static 静态代码块
- 定义方法
- 定义内部类
几乎可以写在类的内部写的代码,都可以通过声明脚本来实现。
b)表达式脚本(常用)
表达式脚本的格式是:<%=表达式%>
表达式脚本 用于向页面输出内容。
表达式脚本的特点:
- 所有的表达式脚本都会被翻译到
_jspService()
方法中 - 表达式脚本都会被翻译成为 out.print()输出到页面上
- 由于表达式脚本翻译的内容都在
_jspService()
方法中,所以_jspService()
方法中的对象都可以直接使用。
注意:表达式不要以分号结尾,否则会报错
c)代码脚本(常用)
代码脚本如下: <% java 代码 %>
代码脚本里可以书写任意的 java 语句。
代码脚本的特点是:
- 代码脚本翻译之后都在
_jspService()
方法中 - 代码脚本由于翻译到
_jspService()
方法中,所以在_jspService()
方法中的现有对象都可以直接使用。 - 还可以由多个代码脚本块组合完成一个完整的 java 语句。
- 代码脚本还可以和表达式脚本一起组合使用,在 jsp页面上输出数据
4、jsp 中的三种注释
a)html 注释
<!-- 注释内容 -->
html 注释会被翻译到 java 源代码中。在_jspService()
方法里,以 out.writer 输出到客户端。
b)java 注释
// 单行注释
/* 多行注释 */
java 注释会被翻译到 java 源代码中。
c)jsp 注释
<%-- 注释内容 --%>
就是单纯的注释,不会对注释内容做任何处理。
5、jsp 九大内置对象
jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后,内部提供的九大对象,叫内置对象。
- request 对象 请求对象,可以获取请求信息
- response 对象 响应对象。可以设置响应信息
- pageContext 对象 当前页面上下文对象。可以在当前上下文保存属性信息
- session 对象 会话对象。可以获取会话信息
- application 对象 ServletContext 对象实例,可以获取整个工程的一些信息
- config 对象 ServletConfig 对象实例,可以获取 Servlet 的配置信息
- out 对象 jsp 输出流对象
- page 对象 表示当前 Servlet 对象实例(无用,用它不如使用 this 对象)
- exception 对象 异常对象只有在 jsp 页面的 page 指令中设置 isErrorPage="true" 的时候 才会存在
我们可以发现上图中并没有 exception 对象,那是因为我们翻译的这个 jsp 页面没有设置 isErrorPage="true" 。
九大内置对象,都是我们可以在【代码脚本】中或【表达式脚本】中直接使用的对象
5.1、四大域对象
四个域对象分别是:
- pageContext (PageContextImpl 类) 当前 jsp 页面范围内有效
- request (HttpServletRequest 类)、 一次请求内有效
- session (HttpSession 类)、 一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
- application (ServletContext 类) 整个 web 工程范围内都有效(只要 web 工程不停止,数据都在)
域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序:
pageContext > request > session > application
6、jsp 中 out 输出流和 response.getwriter() 输出流的区别
当 jsp 页面中所有代码执行完成后会做以下两个操作:
- 执行 out.flush() 操作,会把 out 缓冲区中的数据追加写入到 response 缓冲区末尾
- 执行 response 的刷新操作,把全部数据写给客户端。
所以,客户端显示是数据顺序是和代码顺序不同。
7、jsp 的常用标签
7.1、静态包含
<%@ include file="" %>
file
属性指定要包含的 jsp 页面的路径。
静态包含的特点:
- 静态包含不会将包含的 jsp 页面翻译成 java 源码
- 静态包含其实是把被包含的 jsp 页面的代码拷贝到包含的位置进行输出。
7.2、动态包含
<jsp:include page=""></jsp:include>
page
属性指定要包含的 jsp 页面的路径。
动态包含的特点:
-
动态包含会将包含的 jsp 页面也翻译成 java 源码
-
动态包含的两个 jsp 页面使用同一个 request、response、out 对象
-
动态包含可以传递参数
<jsp:include page="/include/footer.jsp"> <jsp:param name="username" value="bbj"/> <jsp:param name="password" value="root"/> </jsp:include
传递的参数会放到 request 域中。
7.3、页面转发
<jsp:forward page=""></jsp:forward>
page
属性指定要转发的 jsp 页面的路径。
此标签功能相当于 request.getRequestDispatcher("/xxxx.jsp").forward(request, response)
功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?