天天看点

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

前言:虽然就目前来看,JSP已是一种过时的技术,但是其设计思想有必要了解一下,毕竟曾经也有过辉煌阶段,那它也必然包含着精妙的设计思想,因此目前仍不妨碍我们秉持取其精华,去其糟粕的态度去学习其中的设计思想。(注:本文”服务器内部工作“这部分内容,学习自B站UP主:遇见狂神说,深有收获,于是写下本文,作为记录)

文章目录

  • ​​一、简介​​
  • ​​二、JSP分析+原理​​
  • ​​1.语法​​
  • ​​2.服务器内部工作​​
  • ​​(1)tomcat就是这样被配置进IDEA中的​​
  • ​​(2)JSP生成的Java文件​​
  • ​​(3)xxx_jsp.java文件​​
  • ​​(4)JSP原理剖析​​
  • ​​(5)Servlet+JSP原理图​​
  • ​​三、当今如何看待JSP​​

一、简介

Java Server Pages:Java服务器端页面,与Servlet一样,用于动态Web技术方向,JSP可用于生成页面中的动态数据,实现动态页面。

二、JSP分析+原理

1.语法

可简单理解为HTML中嵌入Java代码与许多JSP标签库

2.服务器内部工作

(1)tomcat就是这样被配置进IDEA中的

Tomcat中有一个work目录

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

逐步进入work的子目录(接下来会发现,本地应用数据文件夹中的IDEA中配置了Tomcat服务器的项目,也会生成一个个这样的jsp文件夹,见下文)

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

之后去另一个目录(也就是IDEA的应用数据目录)下分析,IDEA中使用Tomcat的项目会在本地应用数据文件夹中生成一个包含在IDEA目录下的tomcat的数据文件

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

进入tomcat文件夹,这些都是临时的文件夹,每次重启配置了tomcat服务器的项目时,都会重新构建各自对应的文件夹,文件夹中的具体内容见下下图

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP
【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

tomcat就是这样被配置进IDEA中的

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

(2)JSP生成的Java文件

打开上图这个java文件,里面确实有jsp的应用

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

因此,浏览器向JavaWeb服务器端发送请求时,不管访问什么资源,其实都是在访问Servlet。(JSP最终也会转换为一个Java类)

接下来,再次分析tomcat的work目录下的子孙目录jsp中的java文件,index_jsp类继承自HttpJspBase

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

而HttpJspBase又继承自HttpServlet

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

因此,本质上,JSP就是一个Servlet,(后文会做进一步的推证)

(3)xxx_jsp.java文件

index_jsp类中动态生成的HTML正好和我们webapp项目中index.jsp页面相同(我目前想不通这两个地方有什么联系,或者本来就仅仅相同而已)

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

index_jsp类中的三个方法:

初始化-------------------------------
public void _jspInit() {
  }
销毁-------------------------------
public void _jspDestroy() {
}
JSPService-------------------------------
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
    throws java.io.IOException, javax.servlet.ServletException {      

重点分析_jspService()方法

参数,请求和响应

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

方法体中,首先判断请求类型

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

内置对象

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

初始操作

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

(4)JSP原理剖析

编写hello.jsp做测试,

启动tomcat服务器,

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

未访问hello.jsp前,IDEA中的tomcat文件夹中,目前只有一个java文件

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

访问hello.jsp后

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

生成了hello.jsp对应的java文件

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

打开查看,与index_jsp.java文件内容结构相同

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

因此,本质上,JSP就是一个Servlet

或者说是,一个如下图结构的java文件

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

JSP原理图:

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

在JSP页面中,只要是Java代码,就会正常输出到xxx_jsp.java中,如果是HTML代码,就会先转换为out.write("<html>\r\n")这类格式

虽然Servlet和JSP都可以写Java代码,而且JSP本质是Servlet,但是为了易于维护和控制,Servlet专注于处理请求,以及控制视图跳转,JSP专注于显示数据。

(5)Servlet+JSP原理图

Servlet+JSP协同实现JavaWeb应用,原理图:(该图:学习自B站UP主:遇见狂神说)

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

后来出现了MVC三层架构,更加合理清晰:

【图文详解】Java Server Pages(JSP)底层原理+源码分析+当今如何看待JSP

三、当今如何看待JSP

JSP已存在很多年,在JavaWeb服务器中无处不在(也许位置比较隐蔽,例如tomcat的work的子孙目录下就有相关文件),同时JSP也有很多缺陷,JSP最明显的问题在于它看起来很像HTML或XML,大多数JSP模板都是采用HTML的形式,但又掺杂了许多JSP标签库的标签,外加许多Java代码,使其非常混乱,因此,这就使我们难以维持一个格式良好的文档。