前言:虽然就目前来看,JSP已是一种过时的技术,但是其设计思想有必要了解一下,毕竟曾经也有过辉煌阶段,那它也必然包含着精妙的设计思想,因此目前仍不妨碍我们秉持取其精华,去其糟粕的态度去学习其中的设计思想。(注:本文”服务器内部工作“这部分内容,学习自B站UP主:遇见狂神说,深有收获,于是写下本文,作为记录)
文章目录
一、简介
Java Server Pages:Java服务器端页面,与Servlet一样,用于动态Web技术方向,JSP可用于生成页面中的动态数据,实现动态页面。
二、JSP分析+原理
1.语法
可简单理解为HTML中嵌入Java代码与许多JSP标签库
2.服务器内部工作
(1)tomcat就是这样被配置进IDEA中的
Tomcat中有一个work目录
逐步进入work的子目录(接下来会发现,本地应用数据文件夹中的IDEA中配置了Tomcat服务器的项目,也会生成一个个这样的jsp文件夹,见下文)
之后去另一个目录(也就是IDEA的应用数据目录)下分析,IDEA中使用Tomcat的项目会在本地应用数据文件夹中生成一个包含在IDEA目录下的tomcat的数据文件
进入tomcat文件夹,这些都是临时的文件夹,每次重启配置了tomcat服务器的项目时,都会重新构建各自对应的文件夹,文件夹中的具体内容见下下图
tomcat就是这样被配置进IDEA中的
(2)JSP生成的Java文件
打开上图这个java文件,里面确实有jsp的应用
因此,浏览器向JavaWeb服务器端发送请求时,不管访问什么资源,其实都是在访问Servlet。(JSP最终也会转换为一个Java类)
接下来,再次分析tomcat的work目录下的子孙目录jsp中的java文件,index_jsp类继承自HttpJspBase
而HttpJspBase又继承自HttpServlet
因此,本质上,JSP就是一个Servlet,(后文会做进一步的推证)
(3)xxx_jsp.java文件
index_jsp类中动态生成的HTML正好和我们webapp项目中index.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()方法
参数,请求和响应
方法体中,首先判断请求类型
内置对象
初始操作
(4)JSP原理剖析
编写hello.jsp做测试,
启动tomcat服务器,
未访问hello.jsp前,IDEA中的tomcat文件夹中,目前只有一个java文件
访问hello.jsp后
生成了hello.jsp对应的java文件
打开查看,与index_jsp.java文件内容结构相同
因此,本质上,JSP就是一个Servlet
或者说是,一个如下图结构的java文件
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主:遇见狂神说)
后来出现了MVC三层架构,更加合理清晰:
三、当今如何看待JSP
JSP已存在很多年,在JavaWeb服务器中无处不在(也许位置比较隐蔽,例如tomcat的work的子孙目录下就有相关文件),同时JSP也有很多缺陷,JSP最明显的问题在于它看起来很像HTML或XML,大多数JSP模板都是采用HTML的形式,但又掺杂了许多JSP标签库的标签,外加许多Java代码,使其非常混乱,因此,这就使我们难以维持一个格式良好的文档。
同时,JSP规范是与Servlet规范紧密耦合的,这意味着它只能用在基于Servlet的Web应用中,也不能用于非Servlet的应用中,JSP因此也不能作为通用模板。
但其设计思想有必要了解一下,毕竟曾经也有过辉煌阶段,那它也必然包含着精妙的设计思想,因此我们要取其精华,去其糟粕。