官术网_书友最值得收藏!

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指令導入頁面

主站蜘蛛池模板: 嘉禾县| 丹阳市| 曲靖市| 白沙| 南汇区| 雷州市| 唐山市| 呼伦贝尔市| 开封县| 龙里县| 潜江市| 宁波市| 兴城市| 城步| 广河县| 定结县| 龙山县| 上高县| 明水县| 酒泉市| 宜宾县| 临夏市| 金门县| 梁河县| 泉州市| 香河县| 四会市| 加查县| 望都县| 罗定市| 盘山县| 武隆县| 黑龙江省| 米易县| 景东| 新兴县| 鸡西市| 新安县| 乐昌市| 昭觉县| 上思县|