JSP概述与运行原理
这篇文章犹豫了很久,还是觉得提起笔来,好好地来讲解下JSP。
相信大家也都有所听闻,不管是视频上、博客中、公司里,都有着这么一个声音:这都21世纪二十年代,JSP这种技术还有什么学习的价值。诚然,这句话是有一定的道理的,随着技术的不断创新和软件设计思想的变革,首先是Velocity、Freemarker、Thymeleaf等模板引擎的出现来挤压JSP的空间,而前后端分离的架构彻底的让JSP失去了生存的土壤。于是一代传奇,早期Web开发中的旗手,慢慢的淡出了开发人员的视野。
但是,回过头来,我们再来看JSP是否还需要学这个问题。首先一点就是,当你点开这篇文章,那么JSP对你就是有用的,那么在这里来猜测下你的身份。
可能一:学生、Web开发小白,在初学时进行简单的项目开发时,往往所有的工作都是一个人完成的,如果采用前后端分离,那么json、ajax、jQuery、Vue、Rest等等技术,都是你可能需要直面的问题,那么可能真的要走一条从入门到放弃的道路了,而JSP则可以帮我们将上述工作进行简化,所有的事全包在JSP身上了,让你可以把更多的精力专于一点,而不是被繁杂的技术吓到。
可能二:开发人员、在维护一个老项目,JSP与ASP在上世纪90年代末与本世纪前十年,一直程序员进行Web开发的首选,并且其宿主语言Java最后还干死了C#,所以许多早期的项目都是使用JSP开发的,并且看不到重构的希望,那么你也只能继续使用JSP来继续进行功能的开发或者bug修复了。
可能三:吃瓜群众。
闲话聊完了,下面我们就来学下JSP的相关知识。
1.什么是JSP
在Web开发中,当我们访问Servlet,不可避免的要对用户的请求进行响应,在前面我们知道,可以通过response向前端输出html页面,但是这样,需要写许多的输出语句,并且许多静态内容会和动态内容糅杂在一起,导致Servlet程序变得非常臃肿。为此,Sun公司在Servlet的基础上,推出了JSP技术。
那JSP到底是啥呢?JSP的全称为Java服务端页面,英文全称为Java Server Pages,是一种以Servlet为基础的动态网页开发技术。在JSP文件,HTML代码嵌入Java代码,网页中的静态内容主要由Html代码来完成,Java代码用来实现网页中的动态内容的显示。
JSP技术其宿主语言是Java,因此其可以自动的继承Java的特征,主要如下:
- 跨平台:使用JSP的Web应用,也是可以跨平台的,只要操作系统中安装了JDK和Web服务器即可,JSP可以和Java同样的实现,一次编译多处运行;
- **预编译:**预编译就是在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译。编译好的代码将被保存,在用户下一次访问时,会直接执行编译好的代码;
- **组件重用:**JSP中可以引用Java代码,即可以在JSP中直接引用我们写的Service层的方法等等,不过这里不建议如此操作。
2.一个JSP页面包含的内容
创建一个JSP页面很简单,我们这里就不在赘述了。那一个JSP页面,应该包含哪些内容呢?
- JSP指令:比如页面第一行的page指令,其可以对本JSP页面上的某些特性进行描述,如指明语言、页面编码方式、MIME类型等,当然还可以指定页面的其他属性;
- HTML:JSP页面中完全兼容HTML,包括js文件、css文件的引入,script标签等;
- Java脚本:也称为JSP脚本,即在JSP页面中嵌入Java代码,主要有三种形式,
<% ... %>、<%! ... %>、<%= ... %>
; - JS脚本:这本身也是HTML中的用法,这里提出来就是为了和上面的Java脚本做一个区别,JSP页面中的许多交互,比如点击事件、alert等操作,仍然是有JS来完成的;
- 九大内置对象:也称之为隐式对象,在JSP页面中,我们可以很方便的使用一些对象,如out、request、session等。
3.JSP运行原理
我们在之前的一篇文章中,讲到缺省的urlPattern时,不知道还记得Tomcat中conf目录下web.xml中的一段代码么?
<servlet><servlet-name>jsp</servlet-name><servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class><init-param><param-name>fork</param-name><param-value>false</param-value></init-param><init-param><param-name>xpoweredBy</param-name><param-value>false</param-value></init-param><load-on-startup>3</load-on-startup>
</servlet>
<!-- ..... -->
<servlet-mapping><servlet-name>jsp</servlet-name><url-pattern>*.jsp</url-pattern><url-pattern>*.jspx</url-pattern>
</servlet-mapping>
我们可以看到,jsp页面是有指定的Servlet来进行处理的,JspServlet可以理解为JSP引擎(容器),其可以将一个JSP文件转换成一个Servlet,我们可以理解为比较特殊的"编译"。
通过上图,我们来对JSP的运行过程做更具体的描述:
- 客户端发出请求,访问JSP页面资源;
- 如果页面是第一次被访问,JSP容器会将JSP文件转换成一个Java文件,即一个Java Servlet程序,如果转换过程发生异常,则终止,并抛出异常;
- 如果转换成功,则由Servlet容器将其加载至内存(执行init方法),并根据urlPattern来进行调用(调用service方法),处理用户对JSP页面的请求;
- 如果JSP页面在项目运行过程中被修改了,则服务器会根据设置决定是否进行重新编译(默认重新编译),如果需要重新编译,则将新生成的Servlet加载入内存,这也是为什么我们在eclipse中开发时,JSP文件修改后不需要重启项目(idea中需要自行设置);
- 当用户的JSP请求被对应JSP的Servlet处理完成后,响应由对应的JSP容器进行接收,并将HTML格式的响应信息发送回客户端。
下面我们通过一个例子来讲解下上面的流程,首先我们启动项目,我们可以先行查看下Tomcat安装目录/work/Catalina/localhost/FirstProject/org/apache/jsp文件夹下,其中为空,没有任何文件,当我们在浏览器中访问jspDemo.jsp后,我们可以看到,此目录中多了如下两个文件:
其中的jspDemo_jsp.java即为JSP容器将jspDemo.jsp转换得到的,其中的部分代码如下:
public final class jspDemo_jsp extends org.apache.jasper.runtime.HttpJspBaseimplements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {//...public void _jspInit() {}public void _jspDestroy() {}public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)throws java.io.IOException, javax.servlet.ServletException {//...//部分内置对象final javax.servlet.jsp.PageContext pageContext;javax.servlet.http.HttpSession session = null;final javax.servlet.ServletContext application;final javax.servlet.ServletConfig config;javax.servlet.jsp.JspWriter out = null;final java.lang.Object page = this;javax.servlet.jsp.JspWriter _jspx_out = null;javax.servlet.jsp.PageContext _jspx_page_context = null;try {response.setContentType("text/html; charset=UTF-8");pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);_jspx_page_context = pageContext;application = pageContext.getServletContext();config = pageContext.getServletConfig();session = pageContext.getSession();out = pageContext.getOut();_jspx_out = out;//将jsp中的html进行输出out.write("\n");out.write("<!DOCTYPE html>\n");out.write("<html>\n");out.write("<head>\n");out.write("<meta charset=\"UTF-8\">\n");out.write("<title>Insert title here</title>\n");out.write("<script src=\"./js/jquery-3.2.1.min.js\"></script>\n");out.write("</head>\n");out.write("<body>\n");out.write("\t<h1>这是HTML标签</h1>\n");out.write("\t");//java语句直接嵌入out.print("<h1>这是Java输出的标签</h1>");//注释if(true){out.print("<h1>还可嵌入Java语句</h1>");}out.write("\n");out.write("\t\n");out.write("\t<script type=\"text/javascript\">\n");out.write("\t\t$(document).ready(function(){\n");out.write("\t\t\tconsole.log(\"页面中同样可以嵌入JS脚本\");\n");out.write("\t\t})\n");out.write("\t</script>\n");out.write("</body>\n");out.write("</html>");} catch (java.lang.Throwable t) {//...} finally {_jspxFactory.releasePageContext(_jspx_page_context);}}
}
从上面编译后得到的jspDemo_jsp.java可以看到,我们为何能直接在jsp页面中使用out对象,就是因为JSP会帮我们定义这些内置对象。
对于jspDemo_jsp继承的org.apache.jasper.runtime.HttpJspBase,我们来看下其声明(Jasper Runtime jar包中),可以看到,其实HttpServlet的一个子类,也证实了JSP页面会被JSP引擎转换成一个Servlet。
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage{//...
}
4.小结
JSP虽然在慢慢的退出Web开发的舞台,但是其留下的风景还是非常让人迷醉的,而且其更适合新手学习,所以在短期内,Java Web的学习中,JSP仍然是很重要的一块。本文仅是简单的介绍了JSP的概念,和JSP页面中可以包含的内容,后续我们会对JSP进行详细的讲解。
又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正。
Java web这一专栏会是一个系列博客,喜欢的话可以持续关注,如果本文对你有所帮助,还请还请点赞、评论加关注。
有任何疑问,可以评论区留言。
JSP概述与运行原理相关推荐
- SpringBoot原理-SpringBoot核心运行原理
导语 Spring Boot最为核心的功能就是自动配置,所有功能的实现都是基于"约定优于配置"的原则,但是Spring Boot是如何实现自动配置的功能的,下面就通过源码学习S ...
- web开发总结-Servlet与JSP(运行原理)
文章结构:(1)剖析Servlet:(2)剖析JSP: 一.剖析Servlet: (1)概述: Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的web页面.它担当Web ...
- 9.JSP运行原理与JSP页面的基本结构
JSP运行原理与JSP页面的基本结构 HTML页面的基本构成 .代码中出现的几种标签 •单标签 某些标签只需单独使用就能完整地表达意思,控制网页 效果,这类标签的语法是: <标签> ...
- 【JSP】JSP的运行原理
初次访问JSP页面 JSP同Servlet一样,都运行在Servlet容器中.当用户第一次访问JSP页面时,JSP页面的执行过程可分为五个步骤,各步骤含义如下: 客户向服务器发送JSP页面请求(req ...
- 什么是JSP,JSP的运行原理是什么?
在动态Web项目的开发中,经常需要动态生成HTML.内容(如系统中的当前在线人数需要动态生成).如果使用Servlet实现HTML页面数据的统计,则需要使用大量的输出语句.同时,如果静态内容和动态内容 ...
- JSP起源、JSP的运行原理、JSP的执行过程
JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...
- JSP运行原理 九大内置对象 四大作用域
Jsp的简介 jsp的全称是java server pages 意思为java的服务页面 jsp必须运行在服务器,不能脱离服务器单独运行 jsp是可以写java代码的html jsp的本质就是一个se ...
- JSP运行原理及运行过程
学习J2EE时,初步了解了JSP,写过一篇小的总结:J2EE-JSP,当时还不是很了解它的运行机制. 学习DRP时,再次接触了JSP,在原来基础上有了更深的了解,了解了它的执行原理 1,JSP的运行原 ...
- jsp是什么以及jsp运行原理
jsp是什么以及jsp运行原理 一.JSP的简单介绍 1. JSP(Java Server Pages)是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动态网页技术标准.JSP ...
- 23.多线程(进程的概述和多进程的意义,线程的概述和多线程的意义,JVM运行原理以及JVM启动的线程探讨,实现多线程 线程调度,线程控制,Lock锁,死锁现象)
1.进程概述及多进程的意义 1.线程和进程 要想说线程,首先必须得聊聊进程,因为线程是依赖于进程存在的. 2.进程概述 什么是进程呢?通过任务管理器我们就可以看到进程的存在. ...
最新文章
- C# using 语法说明
- Tomcat管理平台
- Docker 初级教程
- Sql Server中Case函数的使用(上篇)----转载
- MySql Socket 完成数据库的增查Demo
- A的大小是多少c语言中,C/C+中字符(A)的大小
- worth,worthy,worthwhile的区别(一)
- pypinyin 获取多音字的拼音组合
- scanf( )函数的返回值
- MYSQL教程之 concat
- 调用远程摄像头进行人脸识别_工地安全:AI如何实现安全帽检测与人脸识别?...
- mysql盲注ascii_[翻译]关于通过对8bit的ascii做右位移提高mysql盲注效率
- 相机标定—了解相机模型
- 编辑距离及编辑距离算法 1
- 深度学习算法面试问题整理
- 如何申请免费的ssl证书
- 基本初等函数求导公式
- 形容计算机专业的人词语,形容一个人很专业很厉害的成语有哪些
- 手游测试(测试内容、测试流程、测试用例)
- 20210725个人周复盘