JSP起源

在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。

如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。

对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。

为了弥补Servlet的缺陷,SUN公司在Servlet的基础上推出了JSP(Java Server Pages)技术作为解决方案。

JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。

建立对JSP的直观认识

JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp。

在JSP页面中编写的Java代码需要嵌套在<%和%>中,嵌套在<%和%>之间的Java代码被称之为脚本片段(Scriptlets),没有嵌套在<%和%>之间的内容被称之为JSP的模版元素。

JSP中的Java代码可以使用out.println语句将其他Java程序代码产生的结果字符串输出给客户端,也可以使用System.out.println语句将它们打印到命令行窗口。

JSP文件就像普通的HTML文件一样,它们可以放置在WEB应用程序中的除了WEB-INF及其子目录外的其他任何目录中,JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样。

JSP

JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态内容,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

Jsp快速入门:在jsp页面中输出当前时间。

不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。

其原因为,程序的数据通常要美化后再输出:

让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。

让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。

因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

JSP的运行原理

WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。

每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

Tomcat 5.x把为JSP页面创建的Servlet源文件和class类文件放置在“<TOMCAT_HOME>\work\Catalina\<主机名>\<应用程序名>\”目录中,Tomcat将JSP页面翻译成的Servlet的包名为org.apache.jsp.<JSP页面在WEB应用程序内的目录名> 。

JSP规范也没有明确要求JSP中的脚本程序代码必须采用Java语言,JSP中的脚本程序代码可以采用Java语言之外的其他脚本语言来编写,但是,JSP页面最终必须转换成Java Servlet程序。

可以在WEB应用程序正式发布之前,将其中的所有JSP页面预先编译成Servlet程序。

分析JSP所生成的Servlet代码

JSP页面翻译成的Servlet继承了org.apache.jasper.runtime.HttpJspBase类,HttpJspBase类是HttpServlet的一个子类,因此JSP页面翻译成的Servlet是HttpServlet的一个孙子类。HttpJspBase类实现了javax.servlet.jsp.HttpJspPage接口中的部分方法,因此,HttpJspBase类是抽象的。

SUN公司为JSP的WEB容器开发商和JSP页面开发人员提供了一套专门应用于开发JSP程序的Java类,这套Java类被称为JSP API。HttpJspPage接口和JspPage接口属于JSP API,在HttpJspPage接口中只定义了一个_jspService方法,但它继承了JspPage接口,JspPage接口中定义了两个方法:jspInit()和jspDestroy()。

HttpJspBase的init方法调用了jspInit和_jspInit方法,destroy方法内部调用了jspDestroy和_jspDestroy方法,service方法内部调用了_jspService方法。在HttpJspBase中实现的init、service和destroy方法都被声明成了final类型。

JSP页面中的位于<% %>外面的每行和紧临<%%>两边的每段文本被转换成以这些文本作为参数的一条条out.write语句,JSP脚本片断(位于<%%>内的一段java代码)中的java代码被原封不动地搬移进了_jspService方法中的相应位置处,JSP表达式(位于<%=和%>之中的内容)则是被转换成以其中的变量或表达式作为参数的out.print语句。

JSP的执行过程

JSP的执行过程主要可以分为以下几点:

客户端发出请求。

Web容器将JSP转译成Servlet源代码。

Web容器将产生的源代码进行编译。

Web容器加载编译后的代码并执行。

把执行结果响应至客户端。

过程介绍

客户端发出请求,请求为JSP,web容器就会找出相应的servlet进行处理

将servlet转成字节码文件

将字节码文件加载到web容器里

这时会在web容器里建立实例

进行初始化

通过service接受请求

然后web容器会自动产生两个对象servlet和service最后进行销毁

JSP起源、JSP的运行原理、JSP的执行过程相关推荐

  1. SSL/TLS协议的运行原理浅析—https通信过程及CA证书诠释

    互联网是开放环境,通信双方都是未知身份,这为协议的设计带来了很大的难度.而且,协议还必须能够经受所有匪夷所思的攻击,这使得SSL TLS协议变得异常复杂.理清https原理与CA证书体系 互联网的通信 ...

  2. 【Servlet】JSP学习-概念和运行原理

    为什么需要JSP? 与HTML相比:根据后台的业务,可以动态输出HTML,网页内容是可以改变的. 与原生Servlet相比:不需要自己写输出语句resp.getWriter().write(" ...

  3. 深入思考编译原理之 理解执行过程和编译过程

    在深入编译器原理细节之前,很多学习者并没有真正从宏观上理解一个编译器都做了些什么,这其实是非常遗憾的. 从计算机执行过程角度思考,函数调用的尤为重要,面向过程的语言更是将函数调用作为最基本的要素.面向 ...

  4. 什么是JSP,JSP的运行原理是什么?

    在动态Web项目的开发中,经常需要动态生成HTML.内容(如系统中的当前在线人数需要动态生成).如果使用Servlet实现HTML页面数据的统计,则需要使用大量的输出语句.同时,如果静态内容和动态内容 ...

  5. Linux X Window System运行原理和启动过程

    本文主要说明X Window System的基本运行原理,其启动过程,及常见的跨网络运行X Window System. 一) 基本运行原理 X Window System采用C/S结构,但和我们常见 ...

  6. 9.JSP运行原理与JSP页面的基本结构

    JSP运行原理与JSP页面的基本结构 HTML页面的基本构成 .代码中出现的几种标签 •单标签     某些标签只需单独使用就能完整地表达意思,控制网页 效果,这类标签的语法是: <标签> ...

  7. 【JSP】JSP的运行原理

    初次访问JSP页面 JSP同Servlet一样,都运行在Servlet容器中.当用户第一次访问JSP页面时,JSP页面的执行过程可分为五个步骤,各步骤含义如下: 客户向服务器发送JSP页面请求(req ...

  8. JSP运行原理 九大内置对象 四大作用域

    Jsp的简介 jsp的全称是java server pages 意思为java的服务页面 jsp必须运行在服务器,不能脱离服务器单独运行 jsp是可以写java代码的html jsp的本质就是一个se ...

  9. JSP运行原理及运行过程

    学习J2EE时,初步了解了JSP,写过一篇小的总结:J2EE-JSP,当时还不是很了解它的运行机制. 学习DRP时,再次接触了JSP,在原来基础上有了更深的了解,了解了它的执行原理 1,JSP的运行原 ...

最新文章

  1. php mysql zend linux_在Linux系统中安装Apache+MySQL+php+phpMyAdmin+Zend
  2. 关于JS客户端对服务器控件赋值,Post后不能保留值的解决办法
  3. ORACLE告警日志文件
  4. 如何设置'REUSE_ALV_GRID_DISPLAY'的单个单元格的颜色
  5. 做一名真正的软件工程师
  6. java开发高端说法_关于Java代码的设计和开发注意事项,下列哪些说法符合《集合开发规约》:...
  7. topcoder srm 305 div1
  8. 该文件夹包含名称过长且无法放入回收站的项目_微软复活20年前生产力工具PowerToys,填补Win10缺失功能,开源且免费...
  9. hbase-1.3.2安装
  10. Flutter Row和 Column 布局、线性布局概述
  11. poj 3181 Dollar Dayz (整数划分问题---递归+DP)
  12. java amount_java.time.Period.plus(TemporalAmount amountToAdd)方法
  13. 使用pymongo连接mongodb时报错:pymongo.errors.OperationFailure: not authorized
  14. Linux内核写入s3c2440,Linux空板的系统写入
  15. Http协议简易分析
  16. 猿创征文|网络安全的十大经典工具介绍
  17. C语言如何生成随机数
  18. 数字电路逻辑设计_第三版_微课版_第五章思考题与练习题(附答案)
  19. 【端口扫描工具】nmap核心使用方法
  20. cesium is not defined

热门文章

  1. 【Transformer】继续学习:Attention,Self-Attention,Multi-head Attention。
  2. 如何做一个优秀的团队成员
  3. Codefoeces 581B Luxurious Houses
  4. 还在付费使用 XShell?我选择这款超牛逼的 SSH 客户端,完全免费!
  5. 生成HTML表格的后台模板代码
  6. 破解网页禁用鼠标右键方法
  7. 华东交通大学计算机调剂,【通知】华东交通大学2020年硕士研究生调剂通知
  8. Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类
  9. GitHub 下载神器强势回归!
  10. svn 怎么提交代码