第二篇 JSP 2.0开发篇
第3章 JSP指令元素
本章将详细介绍JSP的指令元素,包括page指令、include指令及taglib指令。将介绍如何通过 page 指令来声明所使用的脚本语言种类、指定导入的Java 包等。还将介绍如何通过include指令来包含各类文件。
通过本章的学习,读者应该能够完成如下几个目标。
· 熟练使用page指令及各属性的配置。
· 熟练使用include指令来包含各种文件。
· 了解使用taglib指令来引入标签库,并定义其前缀。
3.1 page指令
page指令主要用来设定JSP页面的全局属性,该配置将作用于整个JSP页面,甚至包括静态包含的文件。其语法格式如下。
<%@ page属性1 = “属性值1”属性2 = “属性值2”%>
page指令包含13个属性,如表3-1所示。
表3-1 page指令包含的属性及属性的配置作用
下面将通过示例来介绍各属性的配置及作用。
3.1.1 language属性
language属性主要用来声明所使用的脚本语言种类,目前暂时只能使用Java语言。不过不排除以后可以使用如C、C++或其他语言的可能。language属性的默认值也是java。其属性配置语法格式如下。
<%@ page language="java">
【范例3-1】示例代码3-1是一个简单的language属性配置示例。
示例代码3-1 TestLanguage.jsp
01 <%@ page language="java"%> 02 <html> 03 <head> 04 <title>TestLanguage</title> 05 </head> 06 <body> 07 <% 08 out.println("Test Language!"); //输出Test Language!语句 09 %> 10 </body> 11 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/TestLanguage.jsp,打开页面如图3-1所示。
图3-1 TestLanguage.jsp执行结果
【代码解析】示例代码第1行通过“<%@ page language="java"%>”声明该JSP使用的语言为Java语言。
3.1.2 extends属性
extends属性用来指定该JSP页面生成的Servlet继承于
哪个父类,设定时必须指定该类的全名,即包名加类名。一般很少使用,而且必须慎重使用,否则可能限制JSP的编译能力。其属性配置语法格式如下。
<%@ page extends="继承的父类"%>
3.1.3 import属性
import属性用来指定导入的Java包,和Java语言基础中的import语句作用类似。不过有些包在JSP编译时就已经导入了,可以不用再导入,默认导入的包如下。
java.lang.*; javax.servlet.*; javax.servlet.jsp.*; javax.servlet.http.*;
import属性的配置语法格式如下。
<%@ page import="导入的包名" %>
【范例3-2】示例代码3-2是一个简单的import属性配置示例。
示例代码3-2 TestImport.jsp
01 <%@ page language="java" import="java.util.*"%> 02 <html> 03 <head> 04 <title>TestImport</title> 05 </head> 06 <body> 07 <% 08 Date now = new Date(); //声明一个Date实例化对象 09 out.println(now); //输出当前时间 10 %> 11 </body> 12 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/TestImport.jsp,打开页面如图3-2所示。
图3-2 TestImport.jsp执行结果
【代码解析】示例代码第1行通过使用page指令的import属性导入“java.util.*”包。第8行通过“Date now = new Date();”创建了一个Date实例对象now,第9行通过“out.println(now);”对now进行输出,这时将会在网页上打印输出当前的日期及时间信息。
3.1.4 session属性
session属性用来指定该JSP页面中是否可以使用session对象。如果设置为true,则表示该JSP页面中可以使用session对象;如果设置为false,则表示该JSP页面中不可以使用session对象。session属性的默认值为true。其属性配置语法格式如下。
<%@ page session="true | false "%>
3.1.5 buffer属性
buffer属性用来指定输出流是否具有缓冲区,并设置缓冲区大小。如果设置为none,则表示输出流不具有缓冲功能;如设置为具体的数据,如“40KB”,则表示设置的缓冲区大小为40KB。其默认值为8KB。其属性配置语法格式如下。
<%@ page buffer="none | 40KB"%>
3.1.6 autoFlush属性
autoFlush属性用来指定缓冲区是否自动进行强制输出。如果设置为true,那么当缓冲区满的时候仍然能够输出正常;如果设置为false,那么当缓冲区满的时候,将会产生异常。如果buffer属性设置为none,那么就不能将autoFlush属性设置为false。autoFlush属性的默认值为true。其属性配置语法格式如下。
<%@ page autoFlush="true | false"%>
3.1.7 isThreadSafe属性
isThreadSafe属性用来指定该JSP文件是否支持多线程使用。如果设置为true,则表示该JSP文件支持多线程的使用,也就是表示该JSP文件能够同时处理多个用户的请求;如果设置为false,则表示该JSP文件不支持多线程的使用,也就是表示该JSP文件只能一次处理一个用户的请求。isThreadSafe属性的默认值为true。其属性配置语法格式如下。
<%@ page isThreadSafe="true | false"%>
3.1.8 info属性
info属性用来设置该JSP文件的相关信息,可以是任何的信息字符串,并通过Servlet.getServletInfo方法来取得该信息。其属性配置语法格式如下。
<%@ page info="JSP文件相关信息%>
【范例3-3】示例代码3-3是一个简单的info属性配置示例。
示例代码3-3 TestInfo.jsp
01 <%@ page info="this is jsp"%> 02 <html> 03 <head> 04 <title>TestInfo</title> 05 </head> 06 <body> 07 <% 08 String str = getServletInfo(); //声明字符串str 09 out.println(str); //输出str值 10 %> 11 </body> 12 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/TestInfo.jsp,打开页面如图3-3所示。
图3-3 TestInfo.jsp执行结果
【代码解析】示例代码第1行通过使用page指令的info属性设置该JSP的相关信息为“this is jsp”。第8行通过“String str =getServletInfo();”获得该JSP的相关信息并赋值给str字符串。第9行通过“out.println(str);”对str字符串进行输出,这时将会在网页上打印输出str字符串内容。
3.1.9 errorPage属性
errorPage属性用来设置在当前JSP文件发生异常错误时,网页重新跳转到能够处理异常的JSP文件。其属性配置语法格式如下。
<%@ page errorPage="错误处理页面"%>
3.1.10 isErrorPage属性
isErrorPage属性用来指定该JSP文件是否为能够处理异常的JSP文件,其默认值为false。其属性配置语法格式如下。
<%@ page errorPage="true | false"%>
3.1.11 contentType属性
contentType属性用来指定该JSP文件的MIME格式,以及网页编码格式。其属性配置语法格式如下。
<%@ page contentType="text/html;charset=ISO-8859-1"%>
【范例3-4】示例代码3-4是一个简单的contentType属性配置示例。
示例代码3-4 TestContentType.jsp
01 <html> 02 <head> 03 <title>TestContentType</title> 04 </head> 05 <body> 06 <% 07 String str = "你好!JSP"; //声明字符串str 08 out.println(str); //输出字符串str值 09 %> 10 </body> 11 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/TestContentType.jsp,打开页面如图3-4所示。
图3-4 TestContentType.jsp执行结果
【代码解析】示例代码第7行通过“String str = "你好!JSP";”声明了一个字符串str,其值为“你好!JSP”。第8行通过“out.println(str);”对str字符串进行输出,这时将会在网页上打印输出str字符串内容。这时候发现网页上显示的中文为乱码,这是因为JSP使用的默认编码格式为“ISO-8859-1”。这时只需要通 过设定page 指令的contentType属性为“text/html;charset=gb2312”,就可以正常地显示中文,显示效果如图3-5所示。
图3-5 TestContentType.jsp执行结果
3.1.12 pageEncoding属性
pageEncoding属性用来指定网页的编码格式。其属性配置语法格式如下。
<%@ page pageEncoding=" ISO-8859-1"%>
【范例3-5】示例代码3-5是一个简单的pageEncoding属性配置示例。
示例代码3-5 TestPageEncoding.jsp
01 <%@ page pageEncoding="gb2312"%> 02 <html> 03 <head> 04 <title>TestPageEncoding</title> 05 </head> 06 <body> 07 <% 08 String str = "欢迎大家来到JSP王国!"; //声明字符串str 09 out.println(str); //输出字符串str值 10 %> 11 </body> 12 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/TestPageEncoding.jsp,打开页面如图3-6所示。
图3-6 TestPageEncoding.jsp执行结果
【代码解析】示例代码第1行通过“<%@ page pageEncoding="gb2312"%>”来设定网页的编码格式为“gb2312”。第8行通过“String str = "欢迎大家来到JSP王国!";”声明了一个字符串str,其值为“欢迎大家来到JSP王国!”。第9行通过“out.println(str);”对str字符串进行输出,这时将会在网页上打印输出str字符串内容,并且不会出现中文乱码的情况。
3.1.13 isELIgnored属性
isELIgnored属性用来指定该JSP文件是否支持EL表达式。如果设置为true,则表示JSP文件将忽略EL表达式,也就是EL表达式不会被执行;如果设置为false,则表示EL表达式不会被忽略,该EL表达式将会被执行。其属性配置语法格式如下。
<%@ page isELIgnored="true | false"%>
3.2 include指令
include 指令用于在JSP文件中插入一个包含文本或代码的文件。包含的文件可以是一个HTML文件,或者是一个文本文件,当然也可以是一个JSP文件。
使用include指令包含文件,将会被包含的文件所执行的结果插入到JSP文件放置include指令的位置。只有当被包含的文件执行完成后,该JSP文件才会恢复执行。
include指令的语法格式如下。
<%@ include file="被包含文件地址"%>
其中include指令只有一个属性值,也就是file,其属性值为被包含文件的URL地址。
3.2.1 包含文本文件
使用include指令包含文本文件非常简单,只需通过file属性指定被包含的文本文件的URL地址即可。
【范例 3-6】范例3-6是一个简单的包含文本文件示例。其包含两个文件,一个是用来包含文本文件的IncludeTXT.jsp,代码为示例代码3-6(A);一个是被包含的文本文件,代码为示例代码3-6(B)。
示例代码3-6(A) IncludeTXT.jsp
01 <%@ page language="java" contentType="text/html;charset=gb2312"%> 02 <html> 03 <head> 04 <title>包含文本文件</title> 05 </head> 06 <body> 07 包含文本文件,文件内容如下。<br> 08 <%@ include file="content.txt"%> 09 </body> 10 </html>
示例代码3-6(B) context.txt
hello World
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/IncludeTXT.jsp,打开页面如图3-7所示。
图3-7 IncludeTXT.jsp执行结果
【代码解析】示例代码IncludeTXT.jsp第8行通过使用include指令包含content.txt文本文件。当JSP执行到第8行时就会将content.txt文本文件的内容进行输出,并最终显示在页面上。
修改其中被包含的文本文件content.txt的代码如下。
JSP世界欢迎你
这时候再运行IncludeTXT.jsp,页面如图3-8所示。
图3-8 显示中文乱码
这时候发现页面显示出现了中文乱码问题,要解决该问题,只需在该文本文件的第一行加入如下代码。
<%@ page contentType="text/html;charset=gb2312"%>
这时候再运行IncludeTXT.jsp,就能正常地显示中文,页面如图3-9所示。
图3-9中文正常显示
【范例 3-7】示例代码3-7是一个包含三个文本文件的示例。其包含四个文件,一个是用来包含文本文件的IncludeTXT2.jsp,代码为示例代码3-7(A);其他三个是被包含的文本文件,代码为示例代码3-7(B)、3-7(C)及3-7(D)。
示例代码3-7(A) IncludeTXT2.jsp
01 <%@ page language="java" contentType="text/html;charset=gb2312"%> 02 <html> 03 <head> 04 <title>包含文本文件</title> 05 </head> 06 <body> 07 包含文本文件content1,文件内容如下。<br> 08 <%@ include file="content1.txt"%><br> 09 包含文本文件content2,文件内容如下。<br> 10 <%@ include file="content2.txt"%><br> 11 包含文本文件content3,文件内容如下。<br> 12 <%@ include file="content3.txt"%> 13 </body> 14 </html>
示例代码3-7(B) content1.txt
01 <%@ page contentType="text/html;charset=gb2312"%> 02 这是文本文件1
示例代码3-7(C) content2.txt
01 <%@ page contentType="text/html;charset=gb2312"%> 02 这是文本文件2
示例代码3-7(D) content3.txt
01 <%@ page contentType="text/html;charset=gb2312"%> 02 这是文本文件3
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/IncludeTXT2.jsp,打开页面如图3-10所示。
图3-10 IncludeTXT2.jsp执行结果
【代码解析】示例代码IncludeTXT2.jsp第8行、第10行及第12行,分别通过使用include指令包含content1.txt、content2.txt和content3.txt三个文本文件。当JSP执行到第8行、第10行及第12行时就会将content1.txt、content2.txt和content3.txt三个文本文件的内容分别进行输出,并最终显示在页面上。
3.2.2 包含HTML文件
使用include指令包含HTML文件非常简单,只需通过file属性指定被包含的HTML文件的URL地址即可。
【范例3-8】范例3-8是一个包含HTML文件的示例。其包含两个文件,一个是用来包含HTML的IncludeHTML.jsp,代码为示例代码3-8(A);一个是被包含的HTML文件,代码为示例代码3-8(B)。
示例代码3-8(A) IncludeHTML.jsp
01 <%@ page language="java" contentType="text/html;charset=gb2312"%> 02 <html> 03 <head> 04 <title>包含HTML文件</title> 05 </head> 06 <body> 07 包含HTML文件,文件内容如下。<br> 08 <%@ include file="content.html"%> 09 </body> 10 </html>
示例代码3-8(B) content.html
<h1>Hello,World</h1>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/IncludeHTML.jsp,打开页面如图3-11所示。
图3-11 IncludeHTML.jsp执行结果
【代码解析】示例代码第8行通过使用include指令包含content.html文件。当JSP执行到第8行时就会将content.html文件的内容进行输出,并最终显示在页面上。
3.2.3 包含JSP文件
使用include指令包含JSP文件非常简单,只需通过file属性指定被包含的JSP文件的URL地址即可。
【范例3-9】范例3-9是一个包含JSP文件的示例。其包含两个文件,一个是用来包含JSP的IncludeJSP.jsp,代码为示例代码3-9(A);一个是被包含的JSP文件,代码为示例代码3-9(B)。
示例代码3-9(A) IncludeJSP.jsp
01 <%@ page language="java" contentType="text/html;charset=gb2312"%> 02 <html> 03 <head> 04 <title>包含JSP文件</title> 05 </head> 06 <body> 07 包含JSP文件,文件内容如下。<br> 08 <%@ include file="content.jsp"%> 09 </body> 10 </html>
示例代码3-9(B) content.jsp
<%@ page import="java.util.*"%> <%=new Date()%>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/IncludeJSP.jsp,打开页面如图3-12所示。
图3-12 IncludeJSP.jsp执行结果
【代码解析】示例代码第8行通过使用include指令包含content.jsp文件。当JSP执行到第8行时就会执行content.jsp文件的内容,并最终显示在页面上。
3.3 taglib指令
taglib指令用来声明此JSP文件使用了自定义标签,同时引用所指定的标签库并设置标签库的前缀。其语法格式如下。
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix"%>
taglib指令包含两个属性,分别为uri和prefix。
其中uri属性用来指定标签库的存放位置,prefix属性用来指定该标签库使用的前缀。
【范例3-10】示例代码3-10是一个taglib指令使用示例。
示例代码3-10 TestTaglib.jsp
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <%--声明页面中将要引用的标签库--%> 03 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 04 <html> 05 <head> 06 <title>taglib指令使用示例</title> 07 </head> 08 <body> 09 <%--使用JSTL标签输出字符串--%> 10 <c:out value="Hello, World!" /> 11 </body> 12 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/TestTaglib.jsp,打开页面如图3-13所示。
图3-13 TestTaglib.jsp执行结果
【代码解析】示例代码第3行使用taglib指令,表示在该JSP文件中将使用JSTL的核心标签库,同时指定该标签库的前缀为c。第10行通过使用JSTL核心标签库的<c:out>标签输出“Hello, World!”。
3.4 综合练习
1.在同一个JSP文件中使用include指令分别来包含一个文本文件、一个HTML文件及一个JSP文件。
01 <%@ page language="java" contentType="text/html;charset=gb2312"%> 02 <html> 03 <head> 04 <title>包含混合文件</title> 05 </head> 06 <body> 07 包含文本文件,文件内容如下。<br> 08 <%@ include file="content.txt"%><br> 09 包含HTML文件,文件内容如下。<br> 10 <%@ include file="content.html"%><br> 11 包含JSP文件,文件内容如下。<br> 12 <%@ include file="content.jsp"%> 13 </body> 14 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/Practice.jsp,打开页面如图3-14所示。
图3-14 Practice.jsp执行结果
2.在JSP文件中使用page指令的import属性导入“java.util.*”包,构造一个ArrayList实例对象并添加元素。最后通过使用JSP表达式分别输出ArrayList实例对象中的元素。
01 <%@ page language="java" import="java.util.*" contentType="text/html; charset=gb2312"%> 02 <html> 03 <head> 04 <title>导入Java包</title> 05 </head> 06 <body> 07 <% 08 ArrayList<String>arr=new ArrayList<String>(); //构造一个ArrayList 实例对象 09 arr.add("C语言"); //添加元素 10 arr.add("C++语言"); //添加元素 11 arr.add("Java语言"); //添加元素 12 %> 13 <%--取出第一个元素,并输出 --%> 14 <%=arr.get(0) %><br> 15 <%--取出第二个元素,并输出 --%> 16 <%=arr.get(1) %><br> 17 <%--取出第三个元素,并输出 --%> 18 <%=arr.get(2) %> 19 </body> 20 </html>
【运行结果】打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/Prj_test/ch03/Practice2.jsp,打开页面如图3-15所示。
图3-15 Practice2.jsp执行结果
3.5 小结
JSP指令元素的内容相比前面的基础内容略微复杂一些,尤其是page指令包含了许多的属性,读者可能会觉得无从记忆,这里建议大家不要死记硬背,而是要基于理解来记忆。对于每一个属性配置,本章都给出了实际的示例,读者可以对照这些示例来自行动手编写代码。
3.6 习题
一、填空题
1.language属性主要用来___________,目前暂时只能使用___________。
2.import属性用来___________。
3.contentType属性用来___________,以及___________。
4.使用include指令包含文件时,只需指定其___________属性为文件的URL地址。
二、选择题
1.不属于page指令的是___________。
A.extends
B.include
C.info
D.import
2.使用include指定的___________属性来指定被包含文件。
A.info
B.file
C.url
D.fileURL
3.通过taglib指令引入标签库,需要指定___________属性和___________属性。
A.uri
B.url
C.prefix
D.head
三、简答题
1.page指令一共包含多少个属性?这些属性分别是哪些?各有什么作用?
2.如何使用include指令来包含文件?其包含文件的原理是什么?
3.如何使用taglib指令来声明使用的标签库及前缀?为什么要使用前缀?
四、编程题
1.编写一个JSP程序,使用page指令的import属性导入“java.util.*”包,通过构造一个LinkedList实例对象并添加元素,最后在页面上显示LinkedList实例对象中的元素值。
2.改写综合练习中的第一个示例,使用循环输出ArrayList实例对象中的元素值。