返回介绍

D.4 指令

发布于 2025-04-22 20:10:07 字数 4046 浏览 0 评论 0 收藏

指令是 JSP 语法元素的第一种类型。它们指示 JSP 转换器如何把 JSP 页面转换为 Servlet。JSP 2.3 定义了多个指令,但只有 page 和 include 是最重要的,本节会详细讨论。

D.4.1 page 指令

可以使用 page 指令来控制 JSP 转换器转换当前 JSP 页面的某些方面。例如,可以告诉 JSP 用于转换隐式对象 out 的缓冲器的大小、内容类型,以及需要导入的 Java 类型,等等。

page 指令的语法如下:

< %@ page attribute1="value1" attribute2="value2" ... %>

@和 page 间的空格不是必需的,attribute1、attribute2 等是 page 指令的属性。如下是 page 指令属性的列表。

  • import:定义一个或多个本页面中将被导入和使用的 java 类型。例如:import="java.util.List"将导入 List 接口。可以使用通配符“*”来引入整个包,类似 import="java.util.*"。可以通过在两个类型间加入“,”分隔符来导入多个类型,如 import="java.util.ArrayList, java.util.Calendar, java.io.PrintWriter"。此外,JSP 默认导入如下包:java.lang、javax.servlet、javax.servlet.http、javax.servlet.jsp。

  • session:值为 True,本页面加入会话管理;值为 False 则相反。默认值为 True,访问该页面时,若当前不存在 javax.servlet.http.HttpSession 实例,则会创建一个。

  • buffer:以 kB 为单位,定义隐式对象 out 的缓冲大小。必须以 kB 后缀结尾。默认大小为 8kB 或更大(取决于 JSP 容器)。该值可以为 none,这意味着没有缓冲,所有数据将直接写入 PrintWriter。

  • autoFlush:默认值为 True。若值为 True,则当输出缓冲满时会自写入输出流。而值为 False,则仅当调用隐式对象的 flush 方法时,才会写入输出流。因此,若缓冲溢出,则会抛出异常。

  • isThreadSafe:定义该页面的线程安全级别。不推荐使用 JSP 参数,因为使用该参数后,会生成一些 Servlet 容器已过期的代码。

  • info:指定生成的 Servlet 类的 getServletInfo 方法的返回值。

  • errorPage:定义当出错时用来处理错误的页面。

  • isErrorPage:标识本页是一个错误处理页面。

  • contentType:定义本页面隐式对象 response 的内容类型,默认是 text/html。

  • pageEncoding:定义本页面的字符编码,默认是 ISO-8859-1。

  • isELIgnored:配置是否忽略 EL 表达式。EL 是 Expression Language 的缩写。

  • language:定义本页面的脚本语言类型,默认是 Java,这在 JSP 2.2 中是唯一的合法值。

  • extends:定义 JSP 实现类要继承的父类。这个属性较少使用,仅在非常特殊理由下使用。

  • deferredSyntaxAllowedAsLiteral:定义是否解析字符串中出现“#{”符号,默认是 False。“{# ”是一个表达式语言的起始符号,因而很重要。

  • trimDirectiveWhitespaces:定义是否不输出多余的空格/空行,默认是 False。

大部分 page 指令可以出现在页面的任何位置,但当 page 指令包含 contentType 或 pageEncoding 属性时,其必须出现在 Java 代码发送任何内容之前。这是因为内容类型和字符编码必须在发送任何内容前设定。

page 指令也可以出现多次,但出现多次的指令属性必须具有相同的值。不过,import 属性例外,多个包含 import 属性的 page 指令的结果是累加的。例如,以下 page 指令将同时导入 java.util.ArrayList 和 java.util.Date 类型。

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.Date"%>

如下写法的效果一样:

<%@page import="java.util.ArrayList, java.util.Date"%>

一个 page 指令可以同时有多个属性。下面的代码设定了 session 属性和 buffer 属性。

<%@page session="false" buffer="16kb"%>

D.4.2 include 指令

可以使用 include 指令将其他文件中的内容包含到当前 JSP 页面。一个页面中可以有多个 include 指令。若存在一个内容会在多个不同页面中使用或一个页面不同位置使用的情况,则将该内容模块化到一个 include 文件会非常有用。

include 指令的语法如下:

< %@ include file="url"%>

其中,@和 include 间的空格不是必需的,URL 为被包含文件的相对路径,若 URL 以一个斜杠(/)开始,则该 URL 为文件在服务器上的绝对路径,否则为当前 JSP 页面的相对路径。

JSP 转换器处理 include 指令时,将指令替换为指令所包含文件的内容。换句话说,若存在清单 D.4 的 copyright.jspf 文件,以及主文件清单 D.5 的 main.jsp 页面:

清单 D.4 copyright.jspf 包含文件

<hr/>
&copy;2015 Brainy Software Inc.
<hr/>

清单 D.5 main.jsp 页面

< !DOCTYPE html>
< html>
< head>< title>Including a file< /title>< /head>
< body>
This is the included content: < hr/>
< %@ include file="copyright.jspf"%> < /body> < /html>

则在 main.jsp 页面中应用 include 指令和编写如下页面的效果是一样的:

< !DOCTYPE html>
< html>
< head>< title>Including a file< /title>< /head>
< body>
This is the included content: < hr/>
< hr/> ©2015 Brainy Software Inc. < hr/> < /body> < /html>

如上示例中,为保证 include 指令能正常工作,copyright.jspf 文件必须同 main.jsp 位于相同的目录。按照惯例,以 JSPF 为扩展名的文件代表 JSP fragement。虽然 JSP fragement 现在被称为 JSP segment,但为保证一致性,JSPF 后缀名依然被保留。

注意,include 指令也可以包含静态 HTML 文件。

此外,include 动作(类似于 include 指令)会在 D.6 一节讨论。理解两者之间的区别非常重要,具体细微的差别参见 D.6 节的解释。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。