- Java EE 程序設計
- 郝玉龍編著
- 1825字
- 2019-07-01 10:16:10
4.4 指令
JSP指令是從JSP向Web容器發送的消息,它用來設置頁面的全局屬性,如輸出內容類型等。指令不向客戶端輸出任何具體內容。指令的作用范圍僅限于包含指令本身的JSP頁面。
JSP的指令格式為:
<%@ 指令名 屬性="屬性值"%>。
指令名有page、include和taglib三種。taglib指令允許頁面使用擴展標記。本節主要講述page指令和include指令。
4.4.1 page指令
page指令用來定義整個JSP頁面的全局屬性。合法的page屬性有import、contentType、isThreadSafe、session、buffer、autoflush、extends、info、errorPage、isErrorPage和language等。下面重點介紹一些最常用的屬性。
1.language屬性
language屬性用來指明JSP頁面腳本使用的編程語言。目前JSP頁面中language屬性的合法值只有一個,那就是"java"。
用法示例:
<%@ page language="java" %>
2.import屬性
import屬性用來向JSP頁面載入包。
用法示例:
<%@ page import="java.util.*" %>
注意:包名要用引號引起。如用一個import載入多個包,則用逗號隔開。如:
<%@ page import="java.util.*, java.lang.*" %>。
3.session屬性
session屬性指定JSP頁面是否支持會話。默認情況下session的值為true。
用法示例:
<%@ page session="true or false" %>。
下面通過一個例子來說明session屬性的作用。向Web應用JspBasic中添加頁面jspSession.jsp。完整代碼如程序4-8所示。
程序4-8:jspSession.jsp
<%@ page language="java" %> <%@ page session="false"%> <% if(session.getAttribute("name")==null) session.setAttribute("name", "hyl"); %> <% out.println(session.getAttribute("name")); %>
在“項目”視圖中選中文件jspSession.jsp,右擊,在彈出的快捷菜單中選中“編譯文件”命令,在NetBeans底部的輸出窗口中將顯示編譯錯誤信息,提示變量session找不到,這是因為<%@ page session="false"%>指明頁面不支持會話,當編譯語句<% out.println (session.getValue("name")); %>時必然會提示出錯信息。將<%@ page session="false"%>改為<%@ page session="true"%>,則程序編譯通過。
4.errorPage屬性
當JSP頁面程序發生錯誤時,由頁面的errorPage屬性指定的程序來處理。首先生成錯誤信息處理頁面error.jsp。完整代碼如程序4-9所示。
程序4-9:error.jsp
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>出錯啦!! </h1> </body> </html>
下面通過向Web應用JspBasic中添加頁面testError.jsp來說明errorPage屬性的作用。完整的代碼如程序4-10所示。
程序4-10:testError.jsp
<%@ page language="java" %> <%@ page contentType="text/html; charset=GB2312" %> <%@ page errorPage="error.jsp" %> <! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>頁面錯誤屬性測試</title> </head> <body bgcolor="#FFFFFF"> <%! int[] a={1,2,3}; %> <%=a[3]%> </body> </html>
程序說明:頁面的errorPage屬性指定如果當前頁面發生錯誤時,將導向頁面error.jsp。在后面的代碼中,發生數組索引越界,將程序導向errorPage屬性指定的錯誤頁面。
保存程序并重新發布Web應用,打開IE瀏覽器,在地址欄中輸入http://localhost:8080/JspBasic/testError.jsp,得到如圖4-9所示的運行結果頁面。

圖4-9 errorPage屬性測試運行結果
5.contentType屬性
contentType屬性指定了MIME的類型和JSP文件的字符編碼方式,它們都是最先傳送給客戶端,使得客戶端可以決定采用什么方式來展現頁面內容。MIME類型有text/plain、text/html(默認類型)、image/gif和image/jpeg等。JSP默認的字符編碼方式是ISO 8859-1。
6.isThreadSafe屬性
isThreadSafe屬性設置JSP文件是否能多線程使用,屬性值有true和false兩種,默認值是true,也就是說,JSP能夠同時處理多個用戶的請求,如果設置為false,一個JSP只能一次處理一個請求。下面通過向JspBasic應用中添加頁面safe.jsp來說明isThreadSafe屬性在保證頁面線程安全上的作用。完整的代碼如程序4-11所示。
程序4-11:safe.jsp
<%@ page contentType="text/html; charset=GB2312" %> <HTML> <BODY> <%! int number=0; void countPeople() { int i =0; double sum = 0.0; while (i++ < 200000000) { sum += i; } number++; } %> <% countPeople(); //在程序片段中調用方法 %> <P>您是第 <%=number%>個訪問本站的客戶。 </BODY> </HTML>
保存程序并重新發布Web應用,打開IE瀏覽器,在地址欄中輸入http://localhost:8080/JspBasic/safe.jsp,得到如圖4-10所示的運行結果頁面。

圖4-10 JSP線程安全屬性測試運行結果
打開一個新的瀏覽器對話框,在地址欄中輸入http://localhost:8080/JSPBasic/safe.jsp,按照程序邏輯設計,頁面應該顯示“您是第2個訪問本站的客戶”,但卻得到與圖4-10相同的結果。為什么會產生錯誤呢?因為在頁面中聲明的變量number是JSP頁面轉化成的Servlet實例所擁有,它為Servlet的所有的線程共享。頁面第一次訪問后,由于服務器延遲,還沒有來得及更新這個變量的值,這時,服務器接收到一個對此Servlet的新請求,Servlet產生一個新的線程,這個線程來訪問變量number。正是由于線程之間的不同步,造成了上述錯誤。
如果在程序第二行加入代碼<%@ page isThreadSafe="true" %>,則保證了頁面以單線程執行,就從根本上避免了由于線程同步錯誤的發生。可以在修改頁面后重新發布Web應用驗證上面的錯誤是否還會發生。
最后,對于page指令,需要說明的是:
(1)<%@ page %>指令作用于整個JSP頁面,同樣包括靜態的包含文件。但是<%@page %>指令不能作用于動態的包含文件,比如<jsp:include>。
(2)可以在一個頁面中引用多個<%@ page %>指令,但是其中的屬性只能用一次,不過也有例外,那就是import屬性。因為import屬性和Java中的import語句類似(參照Java語言,import語句引入的是Java語言中的類),所以此屬性就能多用幾次。
(3)無論把<%@ page %>指令放在JSP的文件的哪個地方,它的作用范圍都是整個JSP頁面。不過,為了JSP程序的可讀性及良好的編程習慣,最好還是把它放在JSP文件的頂部。
4.4.2 include指令
include指令向JSP頁面內某處嵌入一個文件。這個文件可以是HTML文件、JSP文件或其他文本文件。需要著重說明的是,通過include指令包含的文件是由JSP分析的,并且這部分分析工作是在轉換階段(JSP文件被編譯為Servlet時)進行的。
用法示例:
<%@include file="relative url"%>
版權保護信息頁面是許多網頁經常需要包含的,下面通過include指令向JSP頁面嵌入版權信息頁面來演示include指令的使用。首先向JspBasic應用中添加使用include指令的頁面include.jsp,完整的代碼如程序4-12所示。
程序4-12:include.jsp
<%@ page contentType="text/html; charset=GB2312" %> <html> <BODY > <h1>include示例</h1> <H3> <%@ include file="copyright.html" %> </H3> </BODY> </HTML>
下面生成版權保護信息頁面copyright.html。完整的代碼如程序4-13所示。
程序4-13:copyright.html
<! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title> </title> </head> <body bgcolor="#FFFFFF"> <HR> <h3>All the rights are reserved</h3> </body> </html>
保存程序并重新發布Web應用,打開IE瀏覽器,在地址欄輸入http://localhost:8080/JspBasic/include.jsp,得到如圖4-11所示的運行結果頁面,可以看到版權信息已被include指令導入。

圖4-11 通過include指令導入頁面
- Python編程自學手冊
- Visual Basic程序開發(學習筆記)
- 造個小程序:與微信一起干件正經事兒
- Java程序設計與實踐教程(第2版)
- Eclipse Plug-in Development:Beginner's Guide(Second Edition)
- 深度學習:算法入門與Keras編程實踐
- C++ 從入門到項目實踐(超值版)
- C語言程序設計案例精粹
- Learning OpenStack Networking(Neutron)(Second Edition)
- Java程序設計案例教程
- Canvas Cookbook
- uni-app跨平臺開發與應用從入門到實踐
- Android編程權威指南(第4版)
- 深入理解Kafka:核心設計與實踐原理
- 3D Printing Designs:Design an SD Card Holder