1.5、JSP 基本语法【重点】
1.5.1、JSP 脚本元素
JSP 脚本元素是指嵌套在 <% 和 %> 之中的一条或多条 Java 程序代码。通过 JSP 脚本元素可以将Java 代码嵌入 HTML 页面中,所有可执行的 Java 代码,都可以通过 JSP 脚本来执行。
JSP Scriptlets 是一段代码段。当需要使用 Java 实现一些复杂操作或控制时,可以使用它。 JSPScriptlets的语法格式如下所示:
1.5.2、JSP 注释
JSP 有其独有的注释
JSP 注释、Java 注释、HTML 注释对比:
建议 JSP 文件上尽量使用 JSP 注释
1.6、JSP 指令
为了设置 JSP 页面中的一些信息, Sun 公司提供了 JSP 指令。 JSP 2.0 中共定义了 page 、include 和 taglib三种指令,每种指令都定义了各自的属性。接下来,本节将针对 page 和 include 指令进行详细的讲解。
1.6.1、page 指令
在 JSP 页面中,经常需要对页面的某些特性进行描述,例如,页面的编码方式,JSP 页面采用的语言等,这时,可以通过 page 指令来实现。page 指令的具体语法格式如下所示:
在上面的语法格式中,page 用于声明指令名称,属性用来指定 JSP 页面的某些特性。page 指令提供了一系列与 JSP 页面相关的属性,如表 1-1 所示。
表 1-1 中列举了 page 指令的常见属性,其中,除了 import 属性外,其他的属性都只能出现一次,否则会编译失败。需要注意的是,page 指令的属性名称都是区分大小写的。
下面列举两个使用 page 指令的示例:
上面代码中使用了 page 指令的 language 、 contentType 、 pageEncoding 和 import 属性。需要注意的是, page 指令对整个页面都有效,而与其书写的位置无关,但是习惯上把 page 指令写在JSP 页面的最前面。
建议:page 指令写在 JSP 最前面
1.6.2、include 指令
实际开发中,经常涉及到一个 JSP 引入另一个 JSP 的代码。
这时我们就需要使用 include 指令
地址:/xx.jsp
即:WebContent 下的 xx.jsp
1.6.3、taglib 指令
该指令 用于引入标签库
1.7、JSP 九大内置对象
1.7.1、简述
在 JSP 页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web 应用程序的开发, JSP2.0 规范中提供了 9 个隐式(内置)对象,它们是 JSP 默认创建的,可以直接在JSP 页面中使用。这 9 个隐式对象的名称、类型和描述如表 1-2 所示。
在表 1-2 中,列举了 JSP 的 9 个隐式对象及它们各自对应的类型。其中,由于 request 、response 、 config 、session 和 application 所属的类及其用法在前面的章节都已经讲解过,而 page 对象在 JSP 页面中很少被用到。因此,在下面几个小节中,将针对 out 和 pageContext 对象进行详细的讲解。
1.7.2、pageContext 对象
在 JSP 页面中,使用 pageContext 对象可以获取 JSP 的其他 8 个隐式对象。 pageContext 对象是javax.servlet.jsp.PageContext 类的实例对象,它代表当前 JSP 页面的运行环境,并提供了一系列用于获取其他隐式对象的方法。 pageContext 对象获取隐式对象的方法如表 1-3 所示。
表 1-3 中列举了 pageContext 获取其他隐式对象的方法,这样,当传递一个 pageContext 对象后,就可以通过这些方法轻松地获取到其他 8 个隐式对象了。
pageContext 对象不仅提供了获取隐式对象的方法,还提供了存储数据的功能。 pageContext 对象存储数据是通过操作属性来实现的,表 1-4 列举了 pageContext 操作属性的一系列方法,具体如下:
表 1-4 列举了 pageContext 对象操作属性的相关方法,其中,参数 name 指定的是属性名称,参数 scope 指
定的是属性的作用范围。 pageContext 对象的作用范围有 4 个值,具体如下:
PageContext.PAGE_SCOPE :表示页面范围
PageContext.REQUEST_SCOPE :表示请求范围
PageContext.SESSION_SCOPE :表示会话范围
PageContext.APPLICATION_SCOPE :表示 Web 应用程序范围
需要注意的是,当使用 findAttribute() 方法查找名称为 name 的属性时,会按照 page 、 request 、session 和application 的顺序依次进行查找,如果找到,则返回属性的名称,否则返回 null 。接下来,通过一个案例来演示 pageContext 对象的使用。
在 day12 项目的 WebContent 目录下创建一个名称为 pageContext.jsp 的页面,编辑后如文件 1-7
在上述代码中,首先使用 pageContext 获取了 request 对象,并设置 page 范围内属性;然后使用获取的request 对象设置了 request 范围内属性,接下来使用 pageContext 对象获得 page 和 request 范围内的相应属性,最后使用 JSP 表达式输出数据。
启动 Tomcat 服务器,在浏览器的地址栏中输入地址“ http://localhost:8080/day17/pageContext.jsp ”
访问pageContext.jsp 页面,浏览器显示的结果如图 1-13 所示。
从图 1-13 的显示结果可以看出,通过 pageContext 对象可以获取到 request 对象,并且还可以获取不同范围内的属性。
1.7.3、out 对象(了解)
在 JSP 页面中,经常需要向客户端发送文本内容,这时,可以使用 out 对象来实现。 out 对象是javax.servlet.jsp.JspWriter 类的实例对象,它的作用与 ServletResponse.getWriter() 方法返回的PrintWriter 对象非常相似,都是用来向客户端发送文本形式的实体内容。不同的是, out 对象的类型为JspWriter ,它相当于一种带缓存功能的 PrintWriter 。接下来,通过一张图来描述 JSP 页面的 out 对象与 Servlet 引擎提供的缓冲区之间的工作关系,具体如图 1-11 所示。
从图 1-11 可以看出,在 JSP 页面中,通过 out 隐式对象写入数据相当于将数据插入到 JspWriter对象的缓冲区中,只有调用了 ServletResponse.getWriter() 方法,缓冲区中的数据才能真正写入到Servlet 引擎所提供的缓冲区中。为了验证上述说法是否正确,接下来,通过一个具体的案例来演示 out 对象的使用。
在 day12 项目的 WebContent 目录下创建一个名称为 out 的 JSP 页面,如文件 1-5 所示。
启动 Tomcat 服务器,在浏览器地址栏中访问“http://localhost:8080/day12/out.jsp”,浏览器的显示结果如图
1-12 所示。
从图 1-12 中可以看出,尽管 out.println 语句位于 response.getWriter().println 语句之前,但它的输出内容却在后面。由此可以说明, out 对象通过 print 语句写入数据后,直到整个 JSP 页面结束, out 对象中输入缓冲区的数据(即: first line )才真正写入到 Serlvet 引擎提供的缓冲区中,而response.getWriter().println 语句则是直接把内容(即: second line )写入 Servlet 引擎提供的缓冲区中, Servlet 引擎按照缓冲区中的数据存放顺序输出内容。
1.8、JSP 四大作用域总结
page:表示当前页,通常没用。jsp 标签底层使用。
request :表示一次请求。通常一次请求就一个页面,但如果使用请求转发,可以涉及多个页面。session :表示一次会话。可以在多次请求之间共享数据。application :表示 一个 web 应用 ( 项目 ) 。可以整个 web 项目共享,多次会话共享数据。