发展历程
1.2版本
JSP1.2不支持EL,但可以使用外部的JSTL标签以便使用EL。
2.版本
JSP 2.的一个主要特点是它支持表达语言(expression language)。JSTL表达式语言可以使用标记格式方便地访问JSP的隐含对象和JavaBeans组件,JSTL的核心标记提供了流程和循环控制功能。自制标记也有自定义函数的功能,因此基本上所有scriptlet能实现的功能都可以由JSTL替代。在JSP 2.中,建议尽量使用EL而使JSP的格式更一致。
SimpleTag
JSP 2.中加入了新的创建自制标记的API,javax.servlet.jsp.tagext.SimpleTag定义了用来实现简单标记的接口。和 JSP 1.2中的已有接口不同的是,SimpleTag接口不使用doStartTag和doEndTag方法,而提供了一个简单的doTag方法。这个方法在调用该标记时只被使用一次。而需要在一个自制标记中实现的所有逻辑过程、循环和对标记体的评估等都在这个方法中实现。从这个方面来讲, SimpleTag和IterationTag可以达到同等的作用。但SimpleTag的方法和处理周期要简单得多。在SimpleTag中还有用来设置JSP内容的setJspBody和getJspBody方法。Web容器会使用setJspBody方法定义一个代表JSP内容的 JspFragment对象。实现SimpleTag标记的程序可以在doTag方法中根据需要多次调用getJspBody.invoke方法以处理JSP内容。
重要功能
JSP2.中的一个主要功能是JSP fragment,它的基本特点是可以使处理JSP的容器推迟评估JSP标记属性。我们知道一般JSP是首先评估JSP标记的属性,然后在处理JSP标记时使用这些属性,而JSP fragment提供了动态的属性。也就是说,这些属性在JSP处理其标记体时是可以被改变的。JSP需要将这样的属性定义为 javax.servlet.jsp.tagext.JspFragment类型。当JSP标记设置成这种形式时,这种标记属性实际上的处理方法类似于标记体。在实现标记的程序中,标记属性可以被反复评估多次。这种用法称为JSP fragment。JSP fragment还可以定义在一个SimpleTag处理程序中使用的自制标记动作。像前面例子说明的,getJspBody返回一个 JspFragment对象并可以在doTag方法中多次使用。需要注意的是,使用JSP fragment的JSP只能有一般的文本和JSP action,不能有scriptlet和scriptlet表达式。
语言标准
句法
一个JSP页面可以被分为以下几部份:
》 静态数据,如HTML
》 JSP指令,如include指令
》 JSP脚本元素和变量
》 JSP动作
》 用户自定义标签
静态数据
静态数据在输入文件中的内容和输出给HTTP响应的内容完全一致。此时,该JSP输入文件会是一个没有内嵌JAVA或动作的HTML页面。而且,客户端每次请求都会得到相同的响应内容。
JSP指令
JSP指令控制JSP编译器如何去生成servlet,以下是可用的指令:
》 包含指令include –包含指令通知JSP编译器把另外一个文件完全包含入当前文件中。效果就好像被包含文件的内容直接被粘贴到当前文件中一样。这个功能和C预处理器所提供的很类似。被包含文件的扩展名一般都是jspf(即JSPFragment,JSP碎片):
》 页面指令page –页面指令有以下几个选项:
//example import导入样例 //example contentType页面类型样例 //example for non error page无错页面样例 //example for a thread safe JSP安全线程JSP样例
注意:在同一个JSP文件中只有import导入页面指令可以被多次使用。
》 标签库指令taglib –标签库指令描述了要使用的JSP标签库。该指令需要指定一个前缀prefix(和C++的命名空间很类似)和标签库的描述URI:
JSP脚本
标准脚本变量
以下是永远可用的脚本变量:
》 out – JSPWriter用来写入响应流的数据
》 page – servlet自身
》 pageContext –一个PageContext实例包括和整个页面相联系的数据,一个给定的HTML页面可以在多个JSP之间传递。
》 request –HTTP request对象
》 response –HTTP response对象
》 session –
脚本元素
有三个基本的脚本元素,作用是使JAVA代码可以直接插入servlet.
》 一种是声明标签,在JAVA SERVLET的类体中放入一个变量的定义。静态的数据成员也可以如此定义。
》
》 一种是脚本标签,在JAVA SERVLET的类的_jspService()方法中放入所包含的语句。
》
》 一种是表达式标签,在JAVA SERVLET的类中放入待赋值的表达式,表达式注意不能以分号结尾。
》
JSP动作
JSP动作是一系列可以调用内建于网络服务器中的功能的XML标签。JSP提供了以下动作:
jsp:include
和子过程类似,JAVA SERVLET暂时接管对其它指定的JSP页的请求和响应。当处理完该JSP页后就马上把控制权交还当前JSP页。这样JSP代码就可以在多个JSP页中共享而不用复制。
jsp:param
可以在jsp:include...展开