深入了解 JSP 的运行过程

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

JSP 主要作用

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

接下来我们去看看 JSP 是如何实现代替 Servlet 的。

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

当我们启动程序,在浏览器访问http://localhost:8080/hello-servlet 时,浏览器会回传显示一个简单的页面

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

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

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

我们启动项目

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

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

进入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 代码一摸一样。

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

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

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

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

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

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

SpringBoot找不到JSP异常处理记录

一、问题描述

有一个SpringBoot项目,采用的是内置的Tomcat服务,项目使用的是JSP,在项目发布到服务器以后,一切正常,偶尔会发生找不到某个JSP的异常,异常信息如下:

以上错误信息是偶发性的,并不能一直存在。

二、问题分析

在Tomcat中,JSP会被编译成以_jsp结尾的servlet文件,SpringBoot默认的Tomcat会将编译后的_JSP文件放在/tmp目录下,而该目录在Linux下是作为临时目录存在,会根据系统的运行对其/tmp下的文件进行清理,导致编译后的_jsp文件被清理,从而找不到该_jsp文件,当在某次访问找不到某个_jsp文件时,会先报一次异常,下次再访问时,Tomcat会重新编译,又会恢复正常。

三、解决方法

在application.properties文件增加Tomcat的工作目录配置,使其指向一个固定目录即可,这样配置以后有可以在更新了jsp文以后不会重新编译,此时只需要删除Tomcat工作目录下的文件即可,这里配置的Tomcat工作目录为/opt/tomcat_loacl

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。