前文

JSP 中有一个关键的知识点:​​指令​​;

JSP 指令是为JSP 引擎(比如 Tomcat)而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理 JSP 页面中的其余部分。

而JSP 引擎会根据 JSP 的指令信息来编译 JSP,生成 Java 文件。在生成的 Java 文件中,指令就不存在了。

一般都会把 JSP 指令放到 JSP 文件的最上方,但这不是必须的。

指令通常以​​<%@​​标记开始,以​​%>​​标记结束,它的具体语法如下:

<%@ 指令名称 属性1="属性值1" 属性2="属性值2" ... 属性n="属性值n" %>


JSP 中三大指令,它们分别是 page、include 和 taglib,下表是对它们的简要说明。

JSP 三大指令

指 明

说 明

page

​page 指令​​用于定义 JSP 页面的各种属性。page 是最复杂的一个指令,它的属性很多,常用的属性有 import、language、pageEncoding 等。

include

静态包含指令,用于引入其它 JSP 文件。使用 ​​include 指令​​引入的其它 JSP 文件,JSP 引擎将把这两个 JSP 文件翻译成一个 servlet,所以将 include 称为静态包含。

taglib

用于在 JSP 页面中导入标签库(JSP 标准标签库、第三方标签库、自定义标签库)。

Page 指令

page 指令是页面指令,可以定义在整个 JSP 页面范围有效的属性和相关的功能。利用 page 指令,可以指定脚本语言,导入需要的类,指明输出内容的类型,指定处理异常的错误页面,以及指定页面输出缓存的大小,还可以一次设置多个属性。

Page 指令的作用对 JSP 页面全局有效,与其书写位置无关,习惯性放置 JSP 页面最前面。

PS:在 JSP 编译时,自动调整至最前面。

page 指令的属性如下:

<%@ page
[language="java"]
[contentType="mimeType[ ;charset=CHARSET ]"]
[import="{package.class|package.*},..."]
[info="text"]
[extends="package.class"]
[session="true|false"]
[errorPage="relativeURL"]
[isThreadSafe="true|false"]
[buffer="none|8kb|size kb"]
[autoFlush="true|false"]
[isThreadSafe="true|false"]
[isELIgnored="true|false"]
[page Encoding="CHARSET"]
%>


提示:

  1. 语法格式说明中的“[”和“]”符号括起来的内容表示可选项。
  2. 可以在一个页面上使用多个 page 指令,其中的属性只能使用一次(import 属性除外)。

JSP page 指令将使用这些属性的默认值来设置 JSP 页面,下面介绍 page 指令的 13 个属性。

(1) language 属性:设置当前页面中编写 JSP 脚本所使用的语言,默认值为 java。

例如:

<%@ page language="java" %>


目前只可以使用 Java 语言。

(2) contenType 属性:设置发送到客户端文档响应报头的 MIME(Multipurpose Internet MailExtention)类型和字符编码,多个值之间用“;”分开。contenType 的用法如下:

<%@ page contenType="MIME 类型; charset=字符编码" %>


MIME 类型被设置为 text/html,如果该属性设置不正确,如设置为 text/css,则客户端浏览器显示 HTML 样式时,不能对 HTML 标识进行解释,而直接显示 HTML 代码。

在 JSP 页面中,默认情况下设置的字符编码为 ISO-8859-1,

即 ​​contentType="text/html;charset=ISO-8859-1"​​。但一般情况下,应该将该属性设置为

contentType="text/html;charset=utf-8"


此处设置 MIME 类型为 text/html,网页所用字符集为 ​​utf-8​​。

(3) import 属性:用来导入程序中要用到的包或类,可以有多个值,无论是 Java 核心包中自带的类还是用户自行编写的类,都要在 import 中引入。import 属性的用法如下:

<%@ page import="包名.类名" %>


如果想要导入包里的全部类,可以这样使用:

<%@ page import="包名.*" %>


在 JSP page 指令中,可多次使用该属性来导入多个类。例如:

<%@ page import="包名.类1" %> <%@ page import="包名.类2" %>


或者通过逗号间隔来导入多个类:

<%@ page import="包名.类1,包名.类2" %>


在 JSP 中,已经默认导入了以下包:

java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*


所以,即使没有用 import 属性进行导入,在 JSP 页面中也可以调用上述包中的类。

【例1】显示欢迎信息和用户登录的日期时间。

本例通过导入 java.util.Date 类来显示当前的日期时间。具体步骤如下。

① 使用 page 指令的 import 属性将 java.util.Date 类导入,然后向用户显示欢迎信息,并把当前日期时间显示出来。具体代码如下:

<%@ page import="java.util.Date" language="java" contentType="text/html;charset=utf-8"%><html><body>您好,欢迎光临C语言中文网!<br/>您登录的时间是<%=new Date()  %></body></html>


② 运行该页面,结果如图 1 所示。

JSP | 指令详解以及实例_java

(4) info 属性:设置 JSP 页面的相关信息,如当前页面的作者、编写时间等。此值可设置为任意字符串,由 ​​Servlet​​.getServletInfo() 方法来获取所设置的值。

【例2】设置并显示 JSP 页面的作者等相关信息。

本例通过 page 指令的 info 属性来设置页面的相关信息,通过 Servlet.getServletInfo() 方法来获取所设置的值,具体步骤如下。

① 使用 page 指令的 info 属性设置页面的作者、版本以及编写时间等。具体代码如下:

<%@ page import="java.util.Date" language="java" contentType="text/html;charset=utf-8"%>
<%@ page info="作者:c.biancheng.net <br/> 版本: v1.0 <br/> 编写时间:2018年11月21 星期三 <br/> 敬请关注, 谢谢!"%><html><body><%String str=this.getServletInfo();out.print (str) ;%></body><html>


② 运行该页面,结果如图 2 所示。

JSP | 指令详解以及实例_当前页_02

(5)extends 属性:指定将 JSP 页面转换为 Servlet 后继承的类。在 JSP 中,通常不会设置该属性,JSP 容器会提供继承的父类。并且,如果设置了该属性,一些改动会影响 JSP 的编译能力。

(6) session 属性:表示当前页面是否支持 session,如果为 false,则在 JSP 页面中不能使用 session 对象以及 scope=session 的 JavaBean 或 EJB。该属性的默认值为 true。

(7) errorPage 属性:用于指定JSP文件的相对路径,在页面出错时,将转到这个 JSP 文件来进行处理。与此相适应,需要将这个 JSP 文件的 isErrorPage 属性设为 true。

设置 errorPage 属性后,JSP 网页中的异常仍然会产生,只不过此时捕捉到的异常将不由当前网页进行处理,而是由 errorPage 属性所指定的网页进行处理。如果该属性值设置为以“/”开头的路径,则错误处理页面在当前应用程序的根目录下;否则在当前页面所在的目录下。

(8) isErrorPage 属性:指示一个页面是否为错误处理页面。设置为 true 时,在这个 JSP 页面中的内置对象 exception 将被定义,其值将被设定为调用此页面的 JSP 页面的错误对象,以处理该页面所产生的错误。

isErrorPage 属性的默认值为 false,此时不能使用内置对象 exception 来处理异常,否则将产生编译错误。

例如,在发生异常的页面上有如下用法:

<%@ page errorPage="error.jsp" %>


用上面的代码,就可以指明当该 JSP 页面出现异常时,跳转到 error.jsp 去处理异常。而在 error.jsp 中,需要使用下面的语句来说明可以进行错误处理:

<%@ page isErrorPage="true" %>


【例3】页面出现异常的处理。

本例通过 page 指令的 errorPage 和 isErrorPage 两个属性来演示当页面出现异常时应如何处理。具体步骤如下。

① 创建 2-18.jsp 页面,使用 page 指令的 errorPage 属性指定页面出现异常时所转向的页面。具体代码如下:

<%@ page contentType="text/html; charset=utf-8" errorPage="2-18error.jsp" %><html><body><%//此页面如果发生异常,将向2-18error.jsp抛出异常,并令其进行处理int x1=5;int x2=0;int x3=x1/x2;out .print (x3);%></body></html>


该程序执行的是除法运算,如果除数为 0,将会拋出一个数学运算异常,从 errorPage="2-18error.jsp" 可以看出,程序指定 2-18error.jsp 为其处理异常。

② 创建 2-18error.jsp 页面,使用 page 指令的 isErrorPage 属性指定为出错页面,此页面可以使用 exception 异常对象处理错误信息。具体代码如下:

<%@ page contentType="text/html; charset=utf-8" isErrorPage="true" %><html><body>出现错误,错误如下:<br/><hr><%=exception.getMessage() %></body></html>


③ 运行 2-18.jsp 页面,结果如图 3 所示。

JSP | 指令详解以及实例_html_03

提示:

为了确译当页面出错时跳转到 errorPage 所指的页面,需要打开 IE 浏览器,选择“工具”→“Internet 选项”菜单命令,在弹出的对话框中选择“高级”选项卡,取消选中“显示友好 HTTP 错误信息”复选框。

(9) buffer 属性:内置输出流对象 out 负责将服务器的某些信息或运行结果发送到客户端显示,buffer 属性用来指定 out 缓冲区的大小。其值可以是 none、8KB 或是给定的 KB 值。

值为 none 表示没有缓存,直接输出至客户端的浏览器中;如果将该属性指定为数值,则输出缓冲区的大小不应小于该值,默认为 8KB(因不同的服务器而不同,但大多数情况下都为 8KB)。

(10) autoFlush 属性:当缓冲区满时,设置是否自动刷新缓冲区。默认值为 true,表示当缓冲区满时,自动将其中的内容输出到客户端;如果设为 false,则当缓冲区满时会出现 JSP Buffer overflow 溢出异常。

提示:

当 buffer 属性的值设置为 none 时,autoFush 属性的值不能设置为 false。

(11) isThreadSafe 属性:设置 JSP 页面是否可以多线程访问。默认值为 true,表示当前 JSP 页面被转换为 Servlet 后,会以多线程的方式处理来自多个用户的请求;如果设置为 false,则转换后的 Servlet 会实现 SingleThreadMode 接口,并且将以单线程的方式来处理用户请求。

(12) pageEncoding 属性:设置 JSP 页面字符的编码,常见的编码类型有 ISO-8859-1、gb2312、utf-8 和 GBK 等。默认值为 ISO-8859-1。其用法如下:

<%@ page pageEncoding="字符编码" %>


例如:

<%@ page pageEncoding="utf-8" %>


这表示网页使用了 utf-8 编码,与 contentType 属性中的字符编码设置作用相同。

PS:一般 JSP 页面显示内容的编码格式由 contentType 决定,而当页面保存时调用 PageEncoding 的编码保存。

(13) isELIgnored 属性:其值可设置为 true 或 false,表示是否在此 JSP 网页中执行或忽略表达式语言 ${}。设置为 true 时,JSP 容器将忽略表达式语言。

Include 指令

include 指令用于通知 JSP 引擎在翻译当前 JSP 页面时,将其他文件中的内容合并进当前 JSP 页面转换成的 Servlet 源文件中,这种在源文件级别进行引入的方式,称为静态引入,当前 JSP 页面与静态引入的文件紧密结合为一个 Servlet。这些文件可以是 JSP 页面、HTML 页面、文本文件或是一段 Java 代码。其语法格式如下:

<%@ include file="relativeURL|absoluteURL" %>


说明如下:

(1) file 属性指定被包含的文件,不支持任何表达式,例如下面是错误的用法:

<% String f="top.html"; %>
<%@ include file="<%=f %>" %>


(2) 不可以在 file 所指定的文件后接任何参数,如下用法也是错误的:

<%@ include file="top.jsp?name=zyf" %>


(3)如果 file 属性值以“/”开头,将在当前应用程序的根目录下查找文件;如果是以文件名或文件夹名开头,将在当前页面所在的目录下查找文件。

提示:

使用 include 指令是以静态方式包含文件,也就是说,被包含文件将原封不动地插入 JSI 文件中,因此,在所包含的文件中不能使用 、 标记,否则会因为与原有的 JSP 文件有相同标记而产生错误。另外,因为原文件和被包含文件可以相互访问彼此定义的变量和方法,所以要避免变量和方法在命名上产生冲突。

【例1】使用 include 指令标记静态插入一个文本文件 Hello.txt,并在当前页面同一个 Web 服务目录中显示“很高兴认识你!Nice to meet you.”,具体操作步骤如下。

① Hello.txt 文本文件的代码如下:

<%@ page contentType="text/html;charset=utf-8" %>
很高兴认识你!
Nice to meet you.


② 创建 2-19.jsp 页面,具体代码如下:

<%@ page contentType="text/html;charset=utf-8" %>
<html><body bgcolor=cyan>
<H3><% include file="Hello.txt" %>
</H3>
</body>
</html>


JSP指令应用实例

编写三个 ​​JSP​​ 页面:first.jsp、second.jsp 和 third.jsp。另外,要求用“记事本”编写一个 hello.txt 文件。

hello.txt 中的每行都有若干个英文单词,这些单词之间用空格分隔,每行之间用

分隔,如下所示:

package apple void back public<br>private throw class hello welcome


实训步骤

(1) first.jsp 的具体要求。

first.jsp 使用 page 指令设置 contentType 属性的值为 text/plain,使用 include 指令静态插入 hello.txt 文件。first.jsp 的代码如下:

<%@ page contentType="text/plain" %>
<html>
<body>
<font Size=4 color=blue>
<%@ include file="Hello.txt" %>
</body>
</html>


(2) second.jsp 的具体要求。

second.jsp 使用 page 指令设置 contentType 属性的值为 application/vn.ms-powerpoint,使用 include 指令静态插入 hello.txt 文件。second.jsp 的代码如下:

<%@  page contentType="application/vnd.ms-powerpoint" %>
<html>
<body>
<font Size=2 color=blue>
<%@include file="Hello.txt"%>
</font>
</body>
</html>


(3) third.jsp 的具体要求。

third.jsp 使用 page 指令设置 contentType 属性的值为 application/msword,使用 include 指令静态插入 hello.txt 文件。third.jsp 的代码如下:

<%@page contentType="application/msword" %>
<html>
<body>
<font Size=4 color=blue>
<%@include file="Hello.txt"%>
</font>
</body>
</html>


The desire of his soul is the prophecy of his fate

你灵魂的欲望,是你命运的先知。