JSP 原理与运行过程

简介: JSP 原理与运行过程

什么是 JSP?

JSP(全称JavaServer Pages)是由 Sun Microsystems 公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML、XML 或其他格式文档的 Web 网页,然后返回给请求者。

JSP 主要作用

  • 代替 Servlet 程序回传 HTML 页面的数据。

接下来我们通过本质去理解 JSP 是如何实现代替 Servlet 的。

JSP 在本质上就是一个 Servlet 程序?

如果我们访问一个 Servlet 程序,让它返回给我们一个前端页面,那么就需要在 JavaWEB 项目下编写一个 HelloServlet 程序:

packagecom.example.demo;
importjava.io.*;
importjavax.servlet.http.*;
importjavax.servlet.annotation.*;
@WebServlet("/hello-servlet")
publicclassHelloServletextendsHttpServlet {
publicvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse) throwsIOException {
response.setContentType("text/html;charset=utf8");
// HelloWorld 页面PrintWriterout=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 时,浏览器会回传显示一个简单的页面

image.png

按 F12 进入开发者模式,可以看到 Servlet 程序响应回传了我们在Servlet 程序中拼接的 html 代码05b971fc3c4bada1466117566af5f383.png

那么到这里还不能让我们明白 JSP 就是一个 Servlet,再往下看。

我们创建一个JSP 文件 index.jsp,这样启动项目时,自动弹出的首页就是我们的 index.jsp 页面。

<%@pagecontentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><title>JSP-HelloWorld</title></head><body><h1><%="Hello World!"%></h1></body></html>

我们启动项目

0d82c90b02b8f4e22480cf94fbfd0730.png

从控制台找到项目部署路径

C:\Users\Jie\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\38d57dfc-4429-4e47-8912-74706f5fff5a

我们直接访问此路径,可以看到目录下存在的文件。

125b98d70929605c4c943fec7a324f4f.png

进入work\Catalina\localhost\ROOT\org\apache\jsp 目录,可以看到存在的两个文件【index_jsp.java】和【index_jsp.class】

997e4d0d9a51dec61d6dee4aae6b7955.png

接着我们将这两个文件删除,同时在浏览器进行刷新页面,可以看到目录下新增了我们刚删除的两个文件【index_jsp.java】和【index_jsp.class】

image.gif

接着,我们使用 Notepad++ 打开【index_jsp.java】文件,查看编译之后的 Java 文件代码。

image.png

可以看到 index.jsp 中 HTML 部分的代码被嵌入在 java 代码中,这和我们一开始在 HelloServlet 中拼接的 HTML 代码一摸一样。

packageorg.apache.jsp;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjavax.servlet.jsp.*;
publicfinalclassindex_jspextendsorg.apache.jasper.runtime.HttpJspBaseimplementsorg.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
/*something*/}

查看源码我们可以看见 index_jsp 继承了 org.apache.jasper.runtime.HttpJspBase 类,

packageorg.apache.jasper.runtime;
importjava.io.IOException;
importjavax.servlet.ServletConfig;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.jsp.HttpJspPage;
importorg.apache.jasper.Constants;
importorg.apache.jasper.compiler.Localizer;
/*** This is the super class of all JSP-generated servlets.** @author Anil K. Vijendran*/publicabstractclassHttpJspBaseextendsHttpServletimplementsHttpJspPage {
/*something*/}

我们继续查看 org.apache.jasper.runtime.HttpJspBase 类的源码,可以发现,HttpJspBase 类直接继承了 HttpServlet类。也就是说,JSP 翻译出来的 index_jsp.java 类,它间接了继承 HttpServlet 类,这和我们直接编写 Servlet 程序继承 HttpServlet 类 是一样的。


因此 JSP 本质就是一个 Servlet 程序。它可以省掉不少我们在 Servlet 中拼接 HTML 代码的时间。不过随着前后端分离的出现,JSP 也逐渐被淘汰。

JSP的执行过程

b2e23483c7804189f31d51e2b29bc92b.png

当我们第一次访问 JSP 页面的时候,Tomcat 服务器主要会帮我们完成:

  1. 把 JSP 页面翻译成为一个 .java 源文件
  2. 对 .java 源文件编译成为 .class 字节码文件
  3. 执行 .class 字节码文件返回结果

当我们第二次访问 JSP 页面的时候,如果未做更改,则使用上次编译的 .class 文件;若修改过,则重新编译。


目录
相关文章
|
Java
18JavaWeb基础 - 图解JSP输出缓冲区原理
18JavaWeb基础 - 图解JSP输出缓冲区原理
49 0
|
XML Java 数据库连接
jsp访问原理和跳转流程
jsp访问原理和跳转流程
98 0
|
5月前
|
缓存 小程序 前端开发
Java服务器端技术探秘:Servlet与JSP的核心原理
【6月更文挑战第23天】Java Web开发中的Servlet和JSP详解:Servlet是服务器端的Java小程序,处理HTTP请求并响应。生命周期含初始化、服务和销毁。创建Servlet示例代码展示了`doGet()`方法的覆盖。JSP则侧重视图,动态HTML生成,通过JSP脚本元素、声明和表达式嵌入Java代码。Servlet常作为控制器,JSP处理视图,遵循MVC模式。优化策略涉及缓存、分页和安全措施。这些技术是Java服务器端开发的基础。
61 9
|
5月前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
62 7
|
6月前
|
存储 Java 应用服务中间件
JSP的运行原理是什么?JSP的作用域有哪些?
JSP四大作用域分别为:page、request、session、application。
101 11
|
6月前
|
前端开发 Java 数据库
【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解
【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解
|
6月前
|
前端开发 JavaScript Java
基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】
基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】
190 0
|
6月前
|
存储 Java
JSP原理以及基本语法
JSP原理以及基本语法
|
前端开发 Java 关系型数据库
欢迎来到Jsp编程课时十三——分解原理:构建自己的思路,目标更好的理解对数据的增伤改查的原理和过程。
欢迎来到Jsp编程课时十三——分解原理:构建自己的思路,目标更好的理解对数据的增伤改查的原理和过程。
103 0
|
Java 应用服务中间件
DreamWeaver CS5 搭建Tomcat服务器 运行Jsp文件
DreamWeaver CS5 搭建Tomcat服务器 运行Jsp文件
349 0
DreamWeaver CS5 搭建Tomcat服务器 运行Jsp文件