jsp中的所有东西都可分为两大类:
elements 和
template data。elements 是jsp的动态部分,他们按照jsp规范作为自定义操作,标签,以及之间的允许内容,jsp容器会解释elements ,当产生response的时候elements 定义的操作会运行(dynamic)。template data是静态文本部分,他们被任意放在jsp页面上直接发送给客户端(not change)。
elements 又可分为三类:scripting elements, directives, and actions 。
scripting elements :有三种类型:
1 Scriptlets即常见到的<%.... %>,
注意scriptlet 的内容不会发送给客户端,只有scriptlet 的结果会发送,这表明scriptlet 被容器解释,scriptlet 的代码默认情况下不会被访问者分享。 代码编译成servlet后在jspService() 内。这里面写的java代码最后结果以out.print(…);输出
2 Expressions:
<%=...=>: 发送字符串给客户端,表达式可以是任意有toString方法的对象,或者是primitive。代码编译成servlet后在jspService() 内。不要在后面加分号,否则会以out.print(...;); 形式输出,引起编译错误
3 Declarations:<!=...=>: declaration 就像scriptlet一样用来向jsp嵌入代码,这些声明编译成servlet后都是在jspService() 方法外面的,所以声明里可用来定义新方法(可以被scriptlet调用)或全局类变量,但声明里代码不是线程安全的,必须自己控制。 directives 并不用来向客户端输出,用来定义页面属性,包括定制标签库和包含其他页面,语法 :
<%@ directive {attribute="value"}* %>
三种不同的jsp directives :
page,
taglib, and
include。
<%@ page %>给jsp容器提供页面的相关信息
<%@ include %> is used to include text and/or code at translation time of a JSP,语法<%@ include file="relativeURL" %>,这个文件必须是web 应用的一部分,由于在转换阶段被包括,相当于在编译之前把文件源代码直接放进来,所以不影响runtime阶段的性能。<jsp:include /> 在runtime阶段触发,虽然效能没前面translation time include好,但保证被包括文件的实时性。
<%@ taglib %> 自定义标签库,语法<%@ taglib uri="uri" prefix="prefixOfTag" %> Actions 可以方便的把动态代码链入简单的jsp页面,功能类似scripting elements ,但是把和jsp打交道的java代码抽象出来了,有两种:standard and custom 语法
<prefix:element {attribute="value"}* />
jsp中有implicit objects,就像在Servlets中的对象,在scripting elements中可以使用:config,request,response,session(默认jsp持有一个session,在scripting elements 用这个对象,就像调用HttpServletRequest getSession() 一样),application(javax.servlet.ServletContext 对象实例,就像调用ServletConfig getServletContext() 一样) 还有一些没有直接和Servlet 对应的,但是隐含的对象:
pageContext(含有一个jsp的许多对象资源信息,在定制标签的时候用得较多),
page,
out, and
exception