执行的结果如图 4-3 所示:
图 4-3 Quoting2.jsp 的执行结果
4-4 Directives Elements(1)
指令(Directives)主要用来提供整个 JSP 网页相关的信息,并且用来设定 JSP 网页的相关属性,
例如:网页的编码方式、语法、信息等。
起始符号为: <%@
终止符号为: %>
内文部分就是一些指令和一连串的属性设定,如下所示:
<%@ directive { attribute ="value" } * %>
什么叫做一连串的属性设定?举例来说,当我们设定两个属性时,可以将之合二为一,如下:
<%@ directive attribute1 = "value1" %>
<%@ directive attribute2 = "value2" %>
亦可以写成:
在 JSP 1.2 的规范中,有三种指令:page、include 和 taglib,每一种指令都有各自的属性。
接下来,我们会依序为各位读者介绍这三种指令。
JSP 2.0 新增 Tag File 的功能,Tag File 是以 .tag 作为扩展名的。在 Tag File 中,因为它 并不是 JSP 网页,所以不能使用 page 指令,但是它可以使用 include 和 taglib 指令。除此之外,
Tag File 还有自己本身的指令可以使用,如:tag、attribute 和 variable。
有关 Tag File 的指令,笔者在“第十六章:Simple Tag 与 Tag File”中再做详细介绍,本章 先暂时不谈论它。
4-4-1 page 指令
page 指令是最复杂的 JSP 指令,它的主要功能为设定整个 JSP 网页的属性和相关功能。page 指 令的基本语法如下:
<%@ page attribute1="value1" attribute2= "value2" attribute3=…%>
page 指令是以<%@ page 起始,以%>结束。像所有 JSP 标签元素一样,page 指令也支持以 XML 为基础的语法,如下所示:
<jsp:directive.page attribute1="value1" attribute2= "value2" />
page 指令有 11 个属性,如表 4-1 所示:
extends = "className" 主要定义此 JSP 网页产生的 Servlet 是继承哪个父类 import = "importList" 主要定义此 JSP 网页可以使用哪些 Java API
session = "true | false" 决定此 JSP 网页是否可以使用 session 对象。默认值为 true
buffer = "none | size in kb"
决定输出流 (output stream)是否有缓冲区。默认值为 8KB 的缓冲区
autoFlush = "true | false"
决定输出流的缓冲区是否要自动清除,缓冲区满了会产生 异常 (Exception)。默认值为 true
isThreadSafe = "true | 主要是告诉 JSP Container,此 JSP 网页能处理超过一个
false" 以上的请求。默认值为 true,如果此值设为 false,
SingleThreadModel 将会被使用。SingleThreadModel 在 Servlet 2.4 中已经声明不赞成使用(deprecate) info = "text" 主要表示此 JSP 网页的相关信息
errorPage = "error_url" 表示如果发生异常错误时,网页会被重新指向那一个 URL isErrorPage = "true |
false"
表示此 JSP Page 是否为处理异常错误的网页
contentType = "ctinfo" 表示 MIME 类型和 JSP 网页的编码方式 pageEncoding = "ctinfo" 表示 JSP 网页的编码方式
isELIgnored = "true | false"
表示是否在此 JSP 网页中执行或忽略 EL 表达式。如果为 true 时,JSP Container 将忽略 EL 表达式;反之为 false 时,EL 表达式将会被执行
下面的范例都合乎语法规则:
<%@ page info = "this is a jsp page"%>
<%@ page language = "java" import = "java.net.* " %>
<%@ page import = "java.net.*,java.util.List " %>
下面的范例也是 page 指令,不过并不合乎语法规则,因为 session 属性重复设定两次:
<%@ page language = "java" import = "java.net.* " session = "false" buffer = "16kb"
autoFlush = "false" session = "false" %>
注意:只有 import 这个属性可以重复设定,其他则否。
<%@ page import = "java.net.* " %>
<%@ page import = "java.util.List " %>
另外再举个较常见的错误例子:
<%@ page language="java" contentType="text/html";charset ="Big5" %>
应该改为:
通常我们都以为只要把 charset 设为 Big5 的编码方式,就能够顺利显示出所需要的中文,不过 有时候在显示一些特别的中文字时,例如:碁,会变成乱码。如下范例:
Big5.jsp
<%@ page contentType="text/html;charset=Big5" %>
<html>
<head>
<title>CH4 - Big5.jsp</title>
</head>
<body>
<h2>使用 Big5 編碼,無法正確顯示某些中文字</h2>
<%
out.println("宏?砦 q 脑公司");
%>
</body>
</html>
Big5.jsp 的执行结果如图 4-4 所示:
图 4-4 Big5.jsp 的执行结果
那么我们应该如何解决这个问题?很简单,只要把之前的 charset = Big5 改为 charset = MS950 的编码方式就能够解决这个问题,我们看下面这个范例:MS950.jsp。
MS950.jsp
<%@ page contentType="text/html;charset=MS950" %>
<html>
<head>
<title>CH4 - MS950.jsp</title>
</head>
<body>
<h2>使用 MS950 編碼,能正確顯示"碁"</h2>
<%
out.println("宏碁電腦公司");
%>
</body>
</html>
MS950.jsp 的执行结果如图 4-5:
图 4-5 MS950.jsp 的执行结果 使用最基本的 page 指令的范例程序 (二):Date.jsp
Date.jsp
<%@ page contentType="text/html;charset=GB2312 " %>
<%@ page import="java.util.Date" %>
<html>
<head>
<title>CH4 - Date.jsp</title>
</head>
<body>
<h2>使用 java.util.Date 显示目前时间</h2>
<%
Date date = new Date();
out.println("现在时间:"+date);
%>
</body>
</html>
因为 Date.jsp 要显示出现在的时间,所以要先导入(import) java.util 这个套件,才可以使 用 Date( )类。执行结果如图 4-6 所示:
图 4-6 Date.jsp 的执行结果 如果在一个 JSP 网页同时须要导入很多套件时:
<%@ page import="java.util.Date" %>
<%@ page import="java.text.*" %>
亦可以写为:
<%@ page import="java.util.Date, java.text.*" %>
直接使用逗号“,”分开,然后就可以一直串接下去。
include 指令表示:在 JSP 编译时插入一个包含文本或代码的文件,这个包含的过程是静态的,
而包含的文件可以是 JSP 网页、HTML 网页、文本文件,或是一段 Java 程序。
注意
包含文件中要避免使用<html>、</html>、<body>、</body>,因为这将会影响在原来 JSP 网 页中同样的标签,这样做有时会导致错误。
include 指令的语法如下:
<%@ include file = "relativeURLspec" %>
include 指令只有一个属性,那就是 file,而 relativeURLspec 表示此 file 的路径。像所有 JSP 标签元素一样,include 指令也支持以 XML 为基础的语法,如下所示:
<jsp:directive.include file = "relativeURLspec" />
注意
<%@ include %>指令是静态包含其他的文件。所谓的静态是指 file 不能为一变量 URL,例 如:
<% String URL="JSP.html" ; %>
<%@ include file = "<%= URL %>" %>
也不可以在 file 所指定的文件后接任何参数,如下:
<%@ include file = "javaworld.jsp?name=browser" %>
同时,file 所指的路径必须是相对于此 JSP 网页的路径。
笔者写了一个 Include.jsp 范例程序,它 include 一份 HTML 的网页,网页文件名叫做 Hello.html,
看看执行之后,会有什么结果产生。
Include.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
<title>CH4 - Include_Html.jsp</title>
</head>
<body>
<h2>include 指令</h2>
<%@ include file="Hello.html" %>
<%
out.println("欢迎大家进入 JSP 的世界");
%>
</body>
</html>
Hello.html
JSP 2.0 Tech Reference<br>
执行结果如图 4-7。
注意
Hello.html 网页内容中有中文时,Tomcat 5.0.16 执行 Include.jsp 时,无法正确显示 Hello.html 网页的中文,会产生乱码。但是笔者使用 Resin 来执行时,却可以顺利显示中 文。
图 4-7 Include.jsp 的执行结果 4-4-3 taglib 指令
taglib 指令是 JSP 1.1 新增进来的功能,能够让用户自定义新的标签。这里只是先做一个简单 介绍,在第十五章再为各位读者详细介绍。
taglib 指令的语法如下:
<%@ taglib uri = "tagLibraryURI" prefix="tagPrefix" %>
像所有 JSP 标签元素一样,taglib 指令也支持以 XML 为基础的语法,如下所示(见表 4-2):
<jsp:directive.taglib uri = "tagLibraryURI" prefix="tagPrefix" />
表 4-2
属 性 定 义
uri = "tagLibraryURI" 主要是说明 taglibrary 的存放位置
prefix="tagPrefix" 主要用来区分多个自定义标签
范例:
<%@ taglib uri ="/supertags/" prefix="super" %>
……….
<super:doMagic>
……..
……..
</super:doMagic>