Jsp规范_JSP语法概念、运行机制和隐含对象

  • 什么是Jsp

  可以理解为最初目的就是为分离视图和处理程序,jsp也可以部署,但一般而言不需要,容器会自动识别!

  • JSP的在容器中的生命周期

  转化阶段:当有一个jsp请求到来时,容器会检查该jsp的编写是否符合语法规范,然后使用容器内部逻辑转换成对应的Servlet文件并保存在指定的文件目录下,最后容器执行编  译工作。注意的是:jsp检查出错的话会把错误信息发送给客户端,这和servlet很不同,servlet只会500告知内部错误。

  执行阶段:容器加载转换并编译成功后的servlet文件,执行servlet中的相关方法即达到了动态页面的效果。而且容器第一次会解析jsp为servlet并编译,但是客户再次请求时容器  会先判断是否有对应的servlet,因为jsp的编译对程序员是透明的,因此当程序员修改jsp后容器在转化会检查jsp有否更新!

  编译后的servlet一般会xx.jsp名更改为xx_jsp的servlet,该类实现的是org.apache.jasper.runtime.HttpJspBase。jsp转换的代码主要在对应的servlet的void_jspService方法中,类  似于原生servlet的service方法。该方法体内声明了九个内置对象,PageContext/HttpSession/ServletContext/ServletConfig/JspWriter/Page,基本与servlet中依赖的对象对应,不  同的是servlet可以由程序员部署。其实使用jsp很多方面是比servlet方便的。不在赘述,后面隐含对象中总结。

  其生命周期是jspInit()---void_jspService()---jspDestroy(),初始化其实也可以在描述符中部署。

  • jsp语法概念

  jsp由元素和模版数据组成,模版数据即html代码,元素则是由容器处理的部分,即指令元素、脚本元素、动作元素。

  1. 指令元素

  为整个jsp的转换阶段提供相关信息,如import了那些类,声明使用的脚本语言(默认当然是java)等。一般的指令有page,即<%@ page  import=“”%>,该指令由15个属性构成  完整定义;include,<%@include file=""%>用来包含页面中的静态资源,可以是jsp,css,html等;taglib,如<%@ taglib uri="xx.tld/xx.tag" prefix=“yy”%>用来定位某个标签文件或  标签库。

  2.脚本元素

声明

  用来声明在其他脚本元素中可以使用的变量方法,从根本上说就是jsp解析遇到该声明时,就会把其内容放到对应servlet的成员变量位置,或者是编写为该servlet类的一个过程被  void_jspService()使用。规范中这样写:<%!  int state = 1; %>/ <%! public void method(){....}%>,记住元素中的代码会照搬,不要忘记“;”。当然也是可以把一些变量放在脚  本段的。

  • 脚本段

  用来产生输出或者是为表达式做准备,因为脚本段中的java代码可以out.write(),该脚本元素中的java代码会原封不动地复制到对应的servlet的void_jspService()方法体中。而  夹杂在其中的html代码也会依照出现顺序使用print(好像是)方法原样输出。所以本质上就是容器自动输出页面中的模版数据进响应缓冲中。规范中这样写:<% if(){}..%>

  • 表达式

  表达式是把该脚本元素中的变量或方法返回值(表达式)原样复制并作为print()方法的参数,换句话说就是调用servlet的输出把变量放进响应体缓冲中。规范写法                <%=  bean.attribute%>

  3.动作元素

  动作元素可以看作一系列的java代码,也看作以上标签的综合化,规范定义了20个动作,以后用到再去查,不会影响到对jsp的整体认识。只要记住<jsp:useBean>,                  <jsp:setProperty>,<jsp:getProperty>简化了数据模型的注入、传递和访问。

  • 注释

  分为html注释和jsp注释 java注释,jsp注释还可以分为输出和不输出注释,输出注释不会在浏览器渲染,但是响应体中会有注释的内容。

  • 隐含对象

  上面已经说过,void_jspService()方法中有九个对象的声明,比如session、config/context还有重要的req/res,其实他们都和servlet组件可以通过容器获取到的相关对象对   应,比如out对应于writer。这里只需要牢记,九个内置对象被放进service方法中,而jsp中对内置对象的使用当然会被支持,因此他们可以直接被复制到对应的servlet的          void_jspService方法中。jsp的本质和servlet是类似的。只不过是提供了另一种定义完好的所谓jsp语法形式的外衣。

  

原文地址:https://www.cnblogs.com/10000miles/p/9315226.html