JSP頁面中的三大指令:
page include taglib
一、Page指令的介紹:
對整個頁面的配置信息的指令。全部都是當前頁面的配置信息。去掉JSP的Page指令就是一個HTML文件。
page指令怎么加:
<%@ page ... %>
里面的屬性:
autoFlush是否清除緩存,默認True,不用修改。
ContentType頁面的類型,utf-8、GBK、GB2312、GB18030、ISO-8859-1注意:他們之間不可以混用。mime類型。把報頭信息改了就會發生改變。
errorPage錯誤頁面,輸入一個另外頁面的路徑。還是比較常用。請求轉發的方式。
isErrorPage為True當前頁面就是錯誤處理頁面。此頁面有exception對象。報異常的時候鏈接不到頁面的位置,因為找的是轉換的Servlet中的信息,所以在顯示的JSP頁面中定位不到。無論頁面中是否有isErrorPage,只要是errorPage屬性指定跳轉的頁面就可以跳轉和錯誤頁面中是否設置isErrorPage屬性無關。
import導入類,導入包。
isElIgnored是否屏蔽EL表達式,默認為False,不用管。
isThreadSafe是否允許同步,何謂同步,和線程有關,
開啟一條應用是一個進程,一個進程是由多條線程組成的。True 允許多條線程的同步訪問,線程不安全。由功能和環境來判斷。頁面允許是線程不安全的。數據是怎么來的是線程安全的。
數據的表現可以是線程不安全,數據的來源必須是線程安全。
language腳本應用語言(默認為java)。
pageEncoding設置當前頁面的字符編碼集。
session當前頁面是否允許使用session(True、False)
extends繼承,更換JSP的繼承類,默認JSP繼承JspBase類。改繼承類對於開發一般用不到。
例如:
執行數據庫操作的J S P頁面中可以看出,在jsp頁面的頭部,使p a g e指令:
〈%@ page contentType="text/html; charset=gb2312" language="java" %〉 〈%@ page import="java.sql.*" %〉
其中第二條指令用於導入本頁面中使用的類,如果沒有通過 page 指令的 import
令導入這些類,則需在腳本中使用全限定類名一一即必須帶包名。可見,此處的 import
屬性類似於 Java 程序中的 import 關鍵字的作用。
看下面的 JSP 頁面,該頁面使用 page 指令的 info 方法指定了 JSP 頁面的描述信息,
又使用 getServletInfo 方法輸出該描述信息。
該頁面的執行效果:會在頁面輸出“this is a jsp”
errorPage 屬性的實質是 JSP 的一種異常處理機制, JSP 不要求強制處理異常,即使
該異常是 checked 異常。如果 JSP 頁面在運行中拋出未處理的異常,系統將自動跳轉到
errorPage 屬性指定的頁面:如果errorPage 沒有指定錯誤頁面,系統則將異常信息呈現
給客戶端瀏覽器一一這是所有的開發者都不願意見到的場景。
看下面的 JSP 頁面,該頁面使用了page 指令的 errorPage 屬性,該屬性指定了對頁
面發生異常時的異常處理頁面。
〈%@ page contentType="text/html; charset=gb2312" language="java" errorPage="error.jsp"%〉 <lDOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> 測試 page 指令的 errorPage 屬性</TITLE> </HEAD> <BODY> 〈% // 下面代碼將出現運行時異常 int a = 6; int b = 0; int c = a / b; %〉 <table> </BODY> </HTML>
下面是 error.jsp 頁面,該頁面本身是錯誤處理頁面,因此將 isErrorPage 設置成 true
在瀏覽器中瀏覽前一個頁面的效果就會跳轉到出錯頁面。
如果將前一個頁面中 page 指令的 errorPage 屬性刪除,再次通過瀏覽器瀏覽該頁面,
執行效果則顯示錯誤信息。
二、include指令
作用:包含,把另一個頁面包含在當前頁面中。
在本頁面中怎么寫:
<%@ include file="被包含的頁面"%>
一個頁面包含另一個頁面,將兩個頁面合二為一,在什么時間合二為一的?頁面進行轉換Servlet的時候將兩者合二為一的。
這種方式有長處也有短處,第一點:雖然訪問兩個資源文件,但是只會生成一個Servlet,稱作靜態包含(只會生成一個Servlet,因為轉換的時候把其他網頁的信息加載進來了)。第二點:如果是Tomcat5.0,被包含頁面發生改變,包含頁面體現不出來。JavaEE的版本是隨着jsp版本和Servlet版本變化的,Tomcat版本越高,支持的Jsp和Servlet版本越高。Tomcat5.0以前被包含頁面發生改變,包含頁面體現不出來。//理解
所以在以前include指令一般不用,但是現在Tomcat6.0用,Tomcat6.0支持include指令。第三點:包含頁面可以訪問被包含頁面中的變量。在被包含頁面中聲明的變量在包含中頁面中是可以使用的。第四點:包含頁面無法向被包含頁面傳參。需要大量復用的東西需要專門生成一個頁面進行處理。
三、taglib指令:申明該JSP文件使用了自定義的標簽。
<%@taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
1、uri屬性:用來指定標簽庫的存放位置。
2、prefix屬性:指定該標簽庫必須使用的前綴。
如:<%@taglib uri="http:java.sun.com/.../core" prefix="c" %>
JSP中使用Taglib,用兩種方法,這里將兩種方法說明如下:
一、僅聲明TLD(標簽庫描述符)的位置
在jsp文件頭部,聲明:
<%@taglib uri="/WEB-INF/tlds/orataglib_1_0.tld" prefix="ora" %>
舉例:在MyEclipse中新建一Web工程,取名為HelloWorldTag。新建一包,包名為mytag
(1)在mytag下,新建一Java類,內容如下:
package mytag; import java.io.IOException; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class HelloWorldTag extends TagSupport{ public int doStartTag() throws JspTagException{ return EVAL_BODY_INCLUDE; } public int doEndTag() throws JspTagException{ try{ pageContext.getOut().write("Hello World"); } catch (IOException ex){ throw new JspTagException("Error!"); } return EVAL_PAGE; } }
(2)在WEB-INF下新建一目錄,目錄名為tlds,下tlds下面新建一tld文件,命名為hello.tld,內容如下:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>myTag</shortname> <tag> <name>hello</name> <tagclass>mytag.HelloWorldTag</tagclass> <bodycontent>empty</bodycontent> </tag> </taglib>
(3)修改index.jsp頁面代碼,修改內容如下:
<%@ page language="java"%> <%@ taglib uri="/WEB-INF/tlds/hello.tld" prefix="mytag"%> <html> <body> <mytag:hello></mytag:hello> </body> </html>
(4)運行:在瀏覽器中輸入http://localhost:8082/HelloWorldtag/index.jsp
運行結果為:Hello World
解釋:
<mytag:hello></mytag:hello>的作用就是在標簽結束后調用了doEndTag() 方法,打印出Hello World
二、定義庫名稱
這里就不再詳細描述了。

