6.1 什么是 JSP
跟 html 长的 一样,就多了 一些 java 的代码。
JSP:Java Server Pages (Java 服务器端页面,也和 Servlet 一样,用于 开发 动态 Web 技术!)
知道为什么 JSP 会诞生吗?我们学习 Servlet 的时候,难道 没感觉到一个问题吗?哈哈 ~
虽然 确实 根据 Servlet 的各种特性 和 功能,实现了 所谓的 动态开发网web。但是 使用 Servlet 去写 一个 网页 页面是 极其困难的。
看一下。。这是在 干嘛。。。
所以 JSP 就出现了。
特点:
- 写 JSP 就像在 写 HTML
- 区别:
- HTML 只给 用户提供静态的数据。
- JSP 页面中 可以 嵌入 Java 的代码,为 用户提供动态的数据。
6.2 JSP 原理
思路:
首先 JSP 是如何 执行的 ?
代码层面没有任何问题(我们根本看不出来啥!)
服务器内部工作(一下子就能看出来猫腻)
tomcat 中有一个 work 目录;IDEA 在使用 Tomcat的时候 也会在 IDEA的 tomcat 中生成一个 work 目录。
- 寻找 work 目录,准备揭秘!
比如说 我们找到 session 的 work 在其下面 一直 点击,会有一个 jsp 的文件夹,在这个文件夹下面,会发现 没有 jsp 文件!!!而对应的却是 java 的可执行文件!!
可以看到 里面 继承了一个 类,这个类 我们看一下 是啥。
直接 在 代码那里 输入 HttpJspBase,然后 ALT+回车
选择 add maven 就可以自动的添加 一下 这个 包。
你会惊奇的 发现 这个 类,居然 继承了 servlet。难道说 我们的jsp 变成了 java 程序?而且 还是 基于 servlet 的 java 程序吗?
-
再次 观察 java 文件
石锤了!确实 是 把 jsp 文件的内容 翻译 成了 servlet java 程序 的代码。 -
记录一下 核心的 方法
//初始化部分
public void _jspInit() {
}
//销毁部分
public void _jspDestroy() {
}
//JSPService
public void _jspService(final jakarta.servlet.http.HttpServletRequest request, final jakarta.servlet.http.HttpServletResponse response)
throws java.io.IOException, jakarta.servlet.ServletException {
if (!jakarta.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {}
- 判断请求是什么方式
if (!jakarta.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
}
- 内置一些 需要用到的 对象
final jakarta.servlet.jsp.PageContext pageContext;//页面上下文
jakarta.servlet.http.HttpSession session = null;//session
final jakarta.servlet.ServletContext application;// applicationContext
final jakarta.servlet.ServletConfig config;//config
jakarta.servlet.jsp.JspWriter out = null;//out
final java.lang.Object page = this;// page 当前页面
jakarta.servlet.jsp.JspWriter _jspx_out = null;
jakarta.servlet.jsp.PageContext _jspx_page_context = null;
application 其实就是 servlet 的 ServletContext。
- 输出页面需要增加的代码
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("<html>\n");
out.write("<body>\n");
out.write("<h2>Hello World!</h2>\n");
out.write("</body>\n");
out.write("</html>\n");
- 探索 当页面动态生成的时候,work 目录是否会自动的生成 java 文件?
当我们运行 程序的时候,你会发现 work 文件夹 会被干掉!然后 好像再 重新 生成。
又出现了。。
当我们 去访问 hello.jsp 的时候 又会发生变化。
所以所谓的 动态生成,原来就是 访问 请求的时候,生成对应的 java 文件呀!哈哈。挺简单的吗。
- JSP 整体的流程
6. 简单的测试一下 jsp 代码
<%--
Created by IntelliJ IDEA.
User: muqua
Date: 2021/8/13
Time: 9:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String name = "哞哞";
%>
name:<%=name%>
</body>
</html>
JSP 为什么会被淘汰?
答:耦合性太强了,现如今的 前后端分离 已经不再 对 JSP 有太大的 好感。