JSP | 指令详解以及实例

原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处。

本篇学习自:C语言中文网,部分内容转载仅供学习使用。

前文

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

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

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

关于生成的 Java 文件在 Tomcat 文件夹中的 work 子文件夹中查看了。

相关博客:Tomcat 的文件结构

一般都会把 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 所示。

图1 显示欢迎信息和用户登录的日期时间

(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 所示。

图2 设置并显示JSP页面的作者相关信息

(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 所示。

图3 页面出现异常处理

提示:

为了确译当页面出错时跳转到 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>
posted @ 2021-10-08 20:40  RioTian  阅读(847)  评论(0编辑  收藏  举报