什么是 JSP?
JSP(全称JavaServer Pages)是由 Sun Microsystems 公司主导创建的一种==动态==网页技术标准 。JSP部署于网络服务器上,可以响应客户端发送的请求 , 并根据请求内容动态地生成 HTML、XML 或其他格式文档的 Web 网页,然后返回给请求者 。JSP 主要作用
- 代替 Servlet 程序回传 HTML 页面的数据 。
JSP 在本质上就是一个 Servlet 程序?
如果我们访问一个 Servlet 程序,让它返回给我们一个前端页面,那么就需要在 JavaWEB 项目下编写一个 HelloServlet 程序:package com.example.demo;import java.io.*;import javax.servlet.http.*;import javax.servlet.annotation.*;@WebServlet("/hello-servlet")public class HelloServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html;charset=utf8");// HelloWorld 页面PrintWriter out = response.getWriter();out.println("<!DOCTYPE html>");out.println("<html lang='en'>");out.println("<head>");out.println("<meta charset='UTF-8'>");out.println("<title>Title</title>");out.println("</head>");out.println("<body>");out.println("<h1>Hello World!</h1>");out.println("</body>");out.println("</html>");}}
当我们启动程序,在浏览器访问http://localhost:8080/hello-servlet 时,浏览器会回传显示一个简单的页面
按 F12 进入开发者模式 , 可以看到 Servlet 程序响应回传了我们在Servlet 程序中拼接的 html 代码 。
那么到这里还不能让我们明白 JSP 就是一个 Servlet,再往下看 。
我们创建一个JSP 文件 index.jsp,这样启动项目时,自动弹出的首页就是我们的 index.jsp 页面 。
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><!DOCTYPE html><html><head><title>JSP - Hello World</title></head><body><h1><%= "Hello World!" %></h1></body></html>
我们启动项目【深入了解 JSP 的运行过程 如何打开jsp文件】
从控制台找到项目部署路径
C:\Users\Jie\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\38d57dfc-4429-4e47-8912-74706f5fff5a
我们直接访问此路径,可以看到目录下存在的文件 。进入work\Catalina\localhost\ROOT\org\apache\jsp 目录,可以看到存在的两个文件【index_jsp.java】和【index_jsp.class】
接着我们将这两个文件删除,同时在浏览器进行刷新页面,可以看到目录下新增了我们刚删除的两个文件【index_jsp.java】和【index_jsp.class】
接着,我们使用 Notepad++ 打开【index_jsp.java】文件,查看编译之后的 Java 文件代码 。
可以看到 index.jsp 中 HTML 部分的代码被嵌入在 java 代码中,这和我们一开始在 HelloServlet 中拼接的 HTML 代码一摸一样 。
package org.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class index_jsp extends org.apache.jasper.runtime.HttpJspBaseimplements org.apache.jasper.runtime.JspSourceDependent,org.apache.jasper.runtime.JspSourceImports {/*something*/}
查看源码我们可以看见 index_jsp 继承了 org.apache.jasper.runtime.HttpJspBase 类,
package org.apache.jasper.runtime;import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.HttpJspPage;import org.apache.jasper.Constants;import org.apache.jasper.compiler.Localizer;/** * This is the super class of all JSP-generated servlets. * * @author Anil K. Vijendran */public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {/*something*/}
我们继续查看 org.apache.jasper.runtime.HttpJspBase 类的源码,可以发现,HttpJspBase 类直接继承了 HttpServlet类 。也就是说 , JSP 翻译出来的 index_jsp.java 类,它间接了继承 HttpServlet 类,这和我们直接编写 Servlet 程序继承 HttpServlet 类 是一样的 。
因此 JSP 本质就是一个 Servlet 程序 。它可以省掉不少我们在 Servlet 中拼接 HTML 代码的时间 。不过随着前后端分离的出现,JSP 也逐渐被淘汰 。
JSP的执行过程
当我们第一次访问 JSP 页面的时候 , Tomcat 服务器主要会帮我们完成:
- 把 JSP 页面翻译成为一个 .java 源文件
- 对 .java 源文件编译成为 .class 字节码文件
- 执行 .class 字节码文件返回结果