原作者为 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 所示。

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

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

提示:

为了确译当页面出错时跳转到 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>

JSP | 指令详解以及实例的更多相关文章

  1. XML参考 :XmlReader 详解、实例

    XML参考 :XmlReader 详解.实例-- 详解 转:http://www.cnblogs.com/Dlonghow/archive/2008/07/28/1252191.html XML参考 ...

  2. httpd配置文件详解及实例

    httpd配置文件详解及实例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.http协议的组成 http协议是C/S架构:我们可以把浏览器(如:IE,Firefox,Safar ...

  3. nginx.conf中关于nginx-rtmp-module配置指令详解

    译序:截至 Jul 8th,2013 官方公布的最新 Nginx RTMP 模块 nginx-rtmp-module 指令详解.指令Corertmp语法:rtmp { ... }上下文:根描述:保存所 ...

  4. Nginx RTMP 模块 nginx-rtmp-module 指令详解

    译序:截至 Jul 8th,2013 官方公布的最新 Nginx RTMP 模块 nginx-rtmp-module 指令详解.指令Corertmp语法:rtmp { ... }上下文:根描述:保存所 ...

  5. (转)nginx日志配置指令详解

    这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下日志对于统计排错来说非常有利的.本文总结了nginx日 ...

  6. nginx日志配置指令详解

    这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下日志对于统计排错来说非常有利的.本文总结了nginx日 ...

  7. nginx-rtmp-module 指令详解

    译序:截至 Jul 8th,2013 官方公布的最新 Nginx RTMP 模块 nginx-rtmp-module 指令详解. Core rtmp 语法:rtmp { ... } 上下文:根 描述: ...

  8. GCC 指令详解及动态库、静态库的使用

    GCC 指令详解及动态库.静态库的使用 一.GCC 1.1 GCC 介绍 GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc.g++ 等编 ...

  9. [转]JVM指令详解(上)

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码    助记符      ...

  10. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

随机推荐

  1. js做四则运算时,精度丢失问题及解决方法

    一.前言:这个问题可以说是程序员必踩的坑,因此网上针对该问题的分析有很多也很详细,解决方法也比较统一,写法也是大同小异,本以为预期效果真能如他们所说是完美的,然而效果却是差强人意. 二.问题:首先,先 ...

  2. 对session.setAttribute()和session.getAttribute()的理解

    B/S架构中,客户端与服务器连接,在服务端就会自动创建一个session对象. session.setAttribute("username",username);是将userna ...

  3. GitHub Desktop安装与使用教程

    一.安装 1.下载 下载地址 2.安装 下载之后GitHub Desktop是没有安装步骤的,而是开始安装之后,稍等片刻就安装成功了. 然后登陆个人GitHub账号就可以进行一下操作了. 二.新建仓库 ...

  4. python3使用pandas备份mysql数据表

    操作系统 :CentOS 7.6_x64 Python版本:3.9.12 MySQL版本:5.7.38 日常开发过程中,会遇到mysql数据表的备份需求,需要针对单独的数据表进行备份并定时清理数据. ...

  5. ASP.NET Core 8 在 Windows 上各种部署模型的性能测试

    ASP.NET Core 8 在 Windows 上各种部署模型的性能测试 我们知道 Asp.net Core 在 windows 服务器上部署的方案有 4 种之多.这些部署方案对性能的影响一直以来都 ...

  6. ELT安装

    前言: ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程, 目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据, ETL是BI(商业智能)项目重要的一个 ...

  7. [GDOIpj221B] 数列游戏

    第二题 数列游戏 提交文件: sequence.cpp 输入文件: sequence.in 输出文件: sequence.out 时间空间限制: 1 秒, 256 MB 有一个长度为 \(n\) 的序 ...

  8. 16、Flutter Wrap组件 实现流布局

    Wrap可以实现流布局,单行的Wrap跟Row表现几乎一致,单列的Wrap则跟Column表现几乎一致.但 Row与Column都是单行单列的,Wrap则突破了这个限制,mainAxis上空间不足时, ...

  9. 输入的查询SQL语句,是如何执行的?

    摘要:输入一条语句,返回一个结果,却不知道这条语句在 MySQL 内部的执行过程. 本文分享自华为云社区<一条查询SQL是如何执行的>,作者: 共饮一杯无 . 执行如下SQL,我们看到的只 ...

  10. 想提高运维效率,那就把MySQL数据库部署到Kubernetes 集群中

    摘要:Kubernetes 很多看起来比较"繁琐"的设计的主要目的,都是希望为开发者提供更多的"可扩展性",给使用者带来更多的"稳定性"和& ...