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代码,元素则是由容器处理的部分,即指令元素、脚本元素、动作元素。
- 指令元素
为整个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语法形式的外衣。