都知道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把整个页面和动态的数据一行一行的写回浏览器了。

  

  

  

最新文章

  1. 数据库如何生成sql语句
  2. Mysql学习笔记(三)对表数据的增删改查。
  3. Python3基础 isinstance 判断一个变量是否为指定的类型
  4. 一个PHP日历程序
  5. oracle 根据字段分组后,将组内的数据根据字段排序
  6. 如何解决ORA-12547: TNS:lost contact错
  7. CCNA网络工程师学习进程(9)GNS3的安装与配置
  8. CSS浮动专题!
  9. 浅谈Notepad++选中行操作+快捷键+使用技巧【超详解】
  10. Linux下C的线程同步机制
  11. 主机管理+堡垒机系统开发:strace命令及日志解析(五)
  12. 从运维的角度理解Iaas、Paas、Saas云计算
  13. VS 2015 Android 环境设置
  14. 关于编码:Unicode/UTF-8/UTF-16/UTF-32
  15. Go匿名函数
  16. Executor简析
  17. 解决spring的java.lang.IllegalArgumentException异常
  18. 血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息
  19. MyBatis 本是apache的一个开源项目iBatis
  20. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

热门文章

  1. Spring源码分析之IOC的三种常见用法及源码实现(一)
  2. 【LeetCode刷题】——两数之和.1
  3. Python之网络编程Socket
  4. vue3.0 + ueditor
  5. 元素定位之css选择器(2)
  6. 21.Linux系统服务之大坑
  7. 程序员修神之路--为什么有了SOA,我们还用微服务?
  8. 我遇到的一些Git问题汇编
  9. .NET Core 3.0 构建和部署
  10. CPU爆满后的无助感