都知道jsp就是在HTML文件中写java代码,以实现动态页面的效果,但是这种动态是如何实现的呢?今天就在研究一下。

  首先,我写了一个简单的jsp文件:

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>First JSP File</title>
</head>
<body>
<%
Date date = new Date();
%>
<h1>现在的时间是:<%=date %></h1>
</body>
</html>

  页面的显示效果如下:

  每点一次刷新,时间也会随之刷新,这是静态的HTML页面不能完成的。那么这种动态的效果究竟是如何实现的呢?在具体介绍之前,还是来研究一下一个servlet请求从浏览器到服务器整个过程中都发生了哪些事情。

  比如http://localhost:8080/Web_Jsp/LoginServlet.java这个请求,当浏览器把请求发送给服务器后,服务器首先会在工作空间服务器对应的项目目录下找相应的静态资源,显然是找不到的,因为这不是一个HTML页面,然后在Tomcat容器中找LoginServlet对象,如果找到,就拿来用,如果没有找到。会根据servlet-mapping中的<url-pattern>标签中用对应的<servler-name>标签区XML文件中找对应的<servlet>标签中对应的<servlet-name>标签,然后根据<servlet-class>实例化一个对象用于处理用户请求。当下一次相同的请求到达服务器时,就不会再次创建此对象了,而是直接拿来使用。

  现在回到jsp,从表面上来看,虽然JSP文件包含了java代码,但显然并不是可执行的java文件,那么它是如何像servlet一样处理用户请求的呢?其原理如下:

  当我们的用户请求达到服务器后,如果是第一次请求到此jsp资源,Tomcat会根据JSP文件的内容创建一个Servlet,这个文件就保存在wtpwebapps同级目录的work目录中:

  D:\STSworkSpace_review\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\Web_Jsp\org\apache\jsp这是我电脑的存放位置。

  

  打开文件后,会发现,这其实就是一个java类,但并不是你写的,而是Tomcat帮你写的。并且继承自HttpJspBase类,而这个类又是Httpservlet的实现类,所以这个由服务器生成的java类也是一个Servlet,说道这也就明白为什么jsp文件能处理用户请求了。

  

  但是还没完,处理完用户请求,总要给客户端返回回去吧,JSP又是怎么实现的呢?还是上面这个类,下面会有这样一段:

  也就是说,这个生成的servlet把整个页面和动态的数据一行一行的写回浏览器了。

  

  

  

JSP——底层原理的更多相关文章

  1. JavaWeb(二)jsp运行原理,九大内置对象

    JSP运行原理: 每个JSP页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ...

  2. 深入源码分析SpringMVC底层原理(二)

    原文链接:深入源码分析SpringMVC底层原理(二) 文章目录 深入分析SpringMVC请求处理过程 1. DispatcherServlet处理请求 1.1 寻找Handler 1.2 没有找到 ...

  3. 【Servlet】(1)Servlet简介、Servlet底层原理、Servlet实现方式、Servlet生命周期

    一.Servlet简介 1.Servlet定义: Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交 ...

  4. jsp学习--JSP运行原理,九大隐式对象和JSP常用标签

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  5. Neo4j图数据库简介和底层原理

    现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...

  6. JSP JSP工作原理 JSP语法 JSP声明 JSP注释 JSP指令 jsp九大隐式/内置对象

    1 什么是JSP   1)为什么说,Servlet是一个动态Web开发技术呢?     Servlet是基于服务端的一种动态交互技术,     HttpServletRequest表示客户端到服务端的 ...

  7. 【T-SQL进阶】02.理解SQL查询的底层原理

    本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...

  8. spring框架的IOC的底层原理

    1.IOC概念:spring容器创建对象并管理 2.IOC的底层原理的具体实现: 1)所使用的技术: (1). dom4j解析xml配置文件 (2).工厂设计模式(解耦合) (3).反射 第一步:配置 ...

  9. 深入研究Sphinx的底层原理和高级使用

    深入研究Sphinx的底层原理和高级使用

随机推荐

  1. ui自动化测试

    一.梳理 1.根据要求需要自动添加很多条数据 2.这就涉及到ui方面的知识.元素定位的方法(这个就能遇到很多坑,要完全掌握元素定位才能避免进坑).循环等(代码基础要掌握好) 二.操作 选择进行自动化操 ...

  2. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理四 (二十二)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  3. 基于STM32F429和HAL库的CAN收发例程

    1.CAN协议介绍 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议.在当前的汽车产业中,出于对安全性.舒适性.方便性.低公 ...

  4. 单元测试实践(SpringCloud+Junit5+Mockito+DataMocker)

    网上看过一句话,单元测试就像早睡早起,每个人都说好,但是很少有人做到.从这么多年的项目经历亲身证明,是真的. 这次借着项目内实施单元测试的机会,记录实施的过程和一些总结经验. 项目情况 首先是背景,项 ...

  5. Spring Security 入门 (二)

    我们在篇(一)中已经谈到了默认的登录页面以及默认的登录账号和密码. 在这一篇中我们将自己定义登录页面及账号密码. 我们先从简单的开始吧:设置自定义的账号和密码(并非从数据库读取),虽然意义不大. 上一 ...

  6. main(argc, char *argv[])

    #include<stdio.h> int main(int argc, char *argv[]) { int i; ;i<argc;i++) { printf("arg ...

  7. MySQL make_set()的用法

    MAKE_SET(bits,str1,str2,…)返回一个设定值(含子字符串分隔字符串","字符),在设置位的相应位的字符串.str1对应于位0,str2到第1位,依此类推.在s ...

  8. PMP(第六版)中的控制账户、规划包、工作包

    PMP(第六版)中的控制账户.规划包.工作包 控制账户是一个管理控制点,在该控制点上,把范围.预算和进度加以整合,并与挣值比较,以测量绩效.控制账户拥有2个或以上的工作包,但每个工作包只与一个控制账户 ...

  9. MySQL的远程连接问题 错误1130

    解决办法:将localhost改成%. 在远程主机上--> 登陆mysql服务执行如下代码: mysql -u root -p mysql>use mysql; mysql>upda ...

  10. Grid实现table表格布局

    HTML <div class="table"> <div class="th"> <div>日期</div> ...