• 沒有找到結果。

4-4 Directives Elements(1)

在文檔中 JSP 2.0技术手册 (頁 59-69)

执行的结果如图 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>

在文檔中 JSP 2.0技术手册 (頁 59-69)