1、JSP指令概念與分類
(1)概念
JSP指令相當于在編譯期間的命令,用來設置與整個JSP頁面相關的屬性,它并不直接產生任何可見的輸出,用來設置全局變量、聲明類、要實現的方法和輸出內容的類型等。在JSP文件被解析為Java文件時,Web容器會將它們翻譯為對應的Java代碼,在JSP頁面轉Servlet類過程中起作用,影響由JSP頁面生成的Servlet類的整體結構。例如,通過page指令可以設置JSP的腳本語言、設置JSP的編碼格式、在JSP中引入其他的Java類或者Java包,通過include指令引入其他的Java代碼段等
(2)分類
JSP中主要包含3種指令,分別為page指令、include指令和taglib指令,如圖所示。
JSP 指令的語法如下。
寫法一:
<%@ 指令名稱 屬性1=“屬性值1” 屬性2=“屬性值2” … 屬性n=“屬性值n”%>
寫法二:
<%@ 指令名稱 屬性1=“屬性值1”%> <%@ 指令名稱 屬性2=“屬性值2”%><%@ 指令名稱 屬性n=“屬性值n”%>
說明:屬性值兩邊的雙引號可以替換為單引號,但引號標記不能完全省略。如果要在屬性值中使用引號,則要在它們之前添加反斜杠,即“\”符號。
2、page指令
(1)page指令概念
page指令即頁面指令,用來定義整個JSP頁面的一些屬性和這些屬性的值。page指令的屬性可以定義MIME類型、定義需要導入的包、錯誤頁的指定、頁面編碼、腳本語言等。page指令格式如下。
用一個page指令指定多個屬性的值。
<%@ page 屬性1= “屬性1的值” 屬性2= “屬性2的值” ……%>
用多個page指令為每個屬性指定值。
<%@ page 屬性1= “屬性1的值” %>
<%@ page 屬性2= “屬性2的值” %>
……
<%@ page 屬性n= “屬性n的值” %>
page指令的作用對整個JSP頁面有效,與其書寫位置無關,可以放在文檔中的任何地方,但通常把page指令寫在JSP頁面的最前面。
page 指令中除import屬性外,其他屬性只能在指令中出現一次。page指令有如下屬性(大小寫敏感),每個屬性完成的功能不同。
按照使用的頻率列出:import、contentType、pageEncoding、session、isELIgnored(只限JSP 2.0)、buffer、autoFlush、info、errorPage、isErrorPage、isThreadSafe、language 和 extends。
page指令每個屬性的作用和默認取值如圖所示。
屬性名 | 作用 | 舉例說明 | 默認值 |
---|---|---|---|
import | 該屬性的作用是為 JSP 頁面引入 Java 核心包中的類,可以為該屬性指定多個值,值以逗號分隔,就像在通常的 Java 代碼中所使用的 import 語句 | <%@ page import="java.util.*, cn.foooldfat.*" %> | 無 |
contentType | 定義 JSP 的字符編碼方式和 JSP 頁面響應的 MIME 類型 | <%@ page contentType="application/vnd.ms-excel" %> | text/html;charset=iso-8859-1 |
pageEncoding | JSP 頁面的字符編碼 | <%@ page pageEncoding="GBK" %> | "iso-8859-1" |
session | 控制頁面是否參與 HTTP 會話 | <%@ page session="true" %> | "true" |
isELIgnored | 忽略(true)JSP 2.0 表達式語言(EL),還是進行正常的求值(false) | <%@ page isELIgnored="true" %> | true 或 false(依賴于 Web 應用的 web.xml 版本) |
buffer | 指定 out 變量(類型為 JspWriter)使用的緩沖區的大小 | <%@ page buffer="none" %> | "8KB" |
autoFlush | 設置頁面緩存滿時是否自動刷新緩存(默認 true;false 時拋異常) | <%@ page autoFlush="true" %> | "true" |
info | 定義可在 servlet 中通過 getServletInfo 方法獲取的字符串 | <%@ page info="Some Message" %> | 無 |
errorPage | 指定處理當前頁面未捕獲異常的 JSP 頁面(異常類型為 Throwable) | <%@ page errorPage="Relative URL" %> | 無 |
isErrorPage | 表示當前頁是否可作為其他 JSP 頁面的錯誤頁面 | <%@ page isErrorPage="false" %> | false |
isThreadSafe | 控制 JSP 生成的 servlet 是并行訪問(默認)還是單線程訪問 | <%@ page isThreadSafe="true" %> | true |
extends | 指定 JSP 生成的 servlet 的超類 | <%@ page extends="package.class" %> | 無 |
language | 指定頁面使用的腳本語言 | <%@ page language="java" %> | java |
(2)實例:page指令應用
(1)實例一:在登錄login.jsp頁面中,首行代碼如下,請思考其作用。
<%@ page language="java" pageEncoding="UTF-8"%>
通過page指令來設定JSP頁面的腳本語言為Java,頁面的編碼格式為“UTF-8”。
(2)實例二:在某個JSP頁面中,首行代碼如下,請思考import屬性的作用和用法。
<%@ page language="java" import="java.util.*,com.inspur.vo.person" pageEncoding="UTF-8"%>
通過page指令的import屬性來引入java.util包和com.inspur.vo.person類,在該JSP頁面中可以直接使用java.util包和所有的類或者接口,以及com.inspur.vo.person類。
當然,上面的代碼也可以修改為:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,com.inspur.vo.person"%>
或者
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="com.inspur.vo.person"%>
3、include指令
(1)include 指令概念
include 指令用于在JSP頁面靜態插入一個文件,被插入的文件可以是JSP頁面、HTML頁面、文本文件或一段Java代碼。使用了include指令的JSP頁面在轉換成Java文件時,將被插入的文件在當前JSP頁面該指令的位置做整體的插入,合并成一個新的JSP頁面,然后JSP引擎再將這個新的JSP頁面轉譯成Java文件。因此,必須保證插入文件后形成的新的JSP頁面符合JSP語法和邏輯規則。include指令格式如下。
<%@ include file = "文件名"%>
include指令特點如下。
include 指令稱為靜態包含(在編譯之前已經做了處理),即先將要包含的文件信息嵌入相應的JSP頁面,再統一轉換成一個servlet類。
include指令不能傳參數。
使用include指令時,包含頁面和被包含頁面訪問的是同一個request內嵌對象。
(2)實例:include指令應用
在界面includeDemo02.jsp中,利用include指令引入top.jsp和bottom.jsp。
includeDemo02.jsp如下。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>案例</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%@ include file="top.jsp" %><br>主界面<br><%@ include file="bottom.jsp" %><br></body>
</html>
4、taglib指令
taglib 指令的作用是在JSP頁面中,將標簽描述符文件(tld文件)引入該頁面中,設置前綴,并利用標簽的前綴去使用標簽描述符文件(tld文件)中的標簽。
其中,tld文件是一個符合規范的XML文件,它描述一個或者更多標簽和它們的屬性。將這個文件放置在WEB-INF目錄中,放置該文件的目的是指定關于標簽處理程序的類名和標簽允許的屬性,可以提供標簽庫中類和JSP中對標簽引用的映射關系。
taglib指令格式如下。
<%@taglib uri=“標簽描述符文件” prefix=“前綴名” %>
其中,uri 屬性用來指定標簽庫的存放位置,prefix 屬性用來指定該標簽庫使用的前綴。當把某個標簽庫引入JSP文件時,<%@ taglib prefix=“c” uri=“myjstl”%>中的uri有兩種寫法。
(1)自定義
自定義可以為uri屬性值設定一個有個性的名字,但這樣做的后果就是編譯器會找不到所用的標簽描述符文件,從而找不到這個標簽的功能支持類,導致標簽無法正常工作。
如果使用了自定義uri的話,就需要在該工程的web.xml下加入如下信息,這樣編譯器就能通過這座“橋”找到對應的tld文件了。
<jsp-config><taglib> <taglib-uri>myjstl</taglib-uri> <taglib-location>/WEB-INF/tld/c.tld</taglib-location> </taglib>
</jsp-config>
(2)標準定義
標準定義設定的uri值需要和標簽描述符文件中uri節點的文本信息一致。當打開一個標簽描述符文件時,在文件的頭部會有一個節點,里面的內容即為uri的標準定義。使用標準定義的優點在于不用在web.xml中加入上面的代碼。假如在JSP頁面中使用JSTL中的核心標簽庫,則需要在JSP頁面中使用taglib指令引入標簽描述符文件(c.tld),下面的代碼uri是標準定義。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
(3)實例:taglib指令應用
JSP標準標簽庫(JSP Standard Tag Library,JSTL)中核心標簽庫out標簽的使用案例。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'outDemo01.jsp' starting page</title></head><body><c:out value="Hello JSP 2.0 !! " /> <br/></body>
</html>