jsp文件的三個(gè)指令中,page指令的屬性最多妨猩,今天我們就來(lái)一一學(xué)習(xí)page指令的各個(gè)屬性惭墓。
1.import屬性
import屬性表示導(dǎo)入jar包挺尿,對(duì)應(yīng)著java文件中的import語(yǔ)句,該屬性是page指令中唯一一個(gè)可以重復(fù)出現(xiàn)的屬性门怪,例如:<%@page import=”java.util.*” import=”java.net.*” import=”java.sql.*”%>骡澈,也可以寫成<%@page import=”java.net.*,java.util.*,java.sql.*”%>,多個(gè)包之間用逗號(hào)隔開掷空。
2.errorPage屬性和isErrorPage屬性
我們知道肋殴,如果一個(gè)頁(yè)面出現(xiàn)錯(cuò)誤囤锉,在瀏覽器端訪問(wèn)這個(gè)頁(yè)面時(shí),服務(wù)器會(huì)響應(yīng)錯(cuò)誤信息护锤,但是一般在開發(fā)中官地,為了讓用戶體驗(yàn)更好一些,開發(fā)人員不會(huì)讓用戶看到錯(cuò)誤信息烙懦,這時(shí)我們就可以使用page指令的errorPage屬性指定錯(cuò)誤頁(yè)面驱入,給用戶一種友好的體驗(yàn)。
errorPage屬性的作用:當(dāng)前訪問(wèn)的頁(yè)面如果拋出異常氯析,就轉(zhuǎn)發(fā)到errorPage屬性指定的頁(yè)面亏较。下面我們來(lái)驗(yàn)證一下,如下所示:
(1)在一個(gè)web工程下創(chuàng)建一個(gè)one.jsp掩缓,主要代碼如例1-1所示:
例1-1 one.jsp
<%@ page language="java"?import="java.util.*"?pageEncoding="utf-8"?errorPage="errorPage.jsp"%>
My JSP 'index.jsp' starting page
"pragma"?content="no-cache">
"cache-control"?content="no-cache">
"expires"?content="0">
"keywords"?content="keyword1,keyword2,keyword3">
"description"?content="This is my page">
<%
?int?n=1/0;
%>
例1-1中雪情,在page指令中設(shè)置errorPage屬性的值為“errorPage.jsp”,表示如果one.jsp頁(yè)面出現(xiàn)問(wèn)題你辣,就轉(zhuǎn)發(fā)到errorPage.jsp巡通。
(2)在當(dāng)前web應(yīng)用下再次新建一個(gè)jsp頁(yè)面,errorPage.jsp舍哄,主要代碼如例1-2所示:
例1-2 errorPage.jsp
<%@ page language="java"?contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
"Content-Type"?content="text/html; charset=UTF-8">
Insert title here
哈哈~出錯(cuò)了
(3)將工程發(fā)布到服務(wù)器中宴凉,然后啟動(dòng)服務(wù)器,在瀏覽器端訪問(wèn)one.jsp頁(yè)面表悬,瀏覽器顯示結(jié)果如圖1-1所示:
圖1-1 瀏覽器顯示結(jié)果
由圖1-1可知弥锄,瀏覽器地址欄上的地址仍然是one.jsp頁(yè)面的訪問(wèn)地址,說(shuō)明當(dāng)頁(yè)面拋出異常签孔,使用errorPage屬性會(huì)轉(zhuǎn)發(fā)到指定的頁(yè)面叉讥。
(4)使用HttpWatch工具抓取請(qǐng)求響應(yīng)信息,如圖1-2所示:
圖1-2 響應(yīng)狀態(tài)碼
圖1-2中饥追,響應(yīng)狀態(tài)碼是200图仓,表示響應(yīng)成功。訪問(wèn)one.jsp頁(yè)面但绕,該頁(yè)面有錯(cuò)誤救崔,服務(wù)器本應(yīng)該響應(yīng)500狀態(tài)碼,而現(xiàn)在卻相應(yīng)200狀態(tài)碼捏顺,出現(xiàn)這種現(xiàn)象是由于我們沒有設(shè)置另外一個(gè)屬性:isErrorPage六孵。下面我們來(lái)了解這個(gè)屬性:
isErrorPage屬性的作用是指定當(dāng)前頁(yè)面是否為處理錯(cuò)誤的頁(yè)面,如果值為true幅骄,這個(gè)頁(yè)面會(huì)設(shè)置響應(yīng)狀態(tài)碼500劫窒,并且在該頁(yè)面中可以使用jsp九大內(nèi)置對(duì)象中的exception對(duì)象。
(5)在errorPage.jsp頁(yè)面的page指令中添加一個(gè)屬性拆座,isErrorPage主巍,值為true冠息,如下所示:
<%@ page language="java"?contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"?isErrorPage="true"%>
(6)然后再在瀏覽器端訪問(wèn)one.jsp,使用HttpWatch工具抓取到的信息如圖1-3所示:
圖1-3 響應(yīng)狀態(tài)碼
由圖1-3可知孕索,當(dāng)在errorPage.jsp頁(yè)面中設(shè)置了isErrorPage屬性逛艰,響應(yīng)狀態(tài)碼就為500了。
(7)在errorPage.jsp頁(yè)面使用九大內(nèi)置對(duì)象中的exception對(duì)象搞旭,如例1-3所示:
例1-3 errorPage.jsp
哈哈~出錯(cuò)了
<%
exception.printStackTrace(response.getWriter());
%>
例1-3中散怖,使用九大內(nèi)置對(duì)象將異常信息打印在瀏覽器端。
(8)在瀏覽器端再次訪問(wèn)one.jsp肄渗,瀏覽器顯示結(jié)果如圖1-4所示:
圖1-4 瀏覽器顯示結(jié)果
如果jsp頁(yè)面中沒有isErrorPage=true镇眷,那么該頁(yè)面中就不能使用exception內(nèi)置對(duì)象。
溫馨提示:IE瀏覽器會(huì)在狀態(tài)碼為500時(shí)翎嫡,并且響應(yīng)正文的長(zhǎng)度小于等于512B時(shí)不給予顯示偏灿!而是顯示“網(wǎng)站無(wú)法顯示該頁(yè)面”字樣。這時(shí)你只需要添加一些響應(yīng)內(nèi)容即在瀏覽器端顯示.
3.web.xml中配置錯(cuò)誤頁(yè)面
錯(cuò)誤頁(yè)面不僅可以在jsp頁(yè)面中配置钝的,還可以在web.xml中配置。如例1-4所示:
例1-4 web.xml
404
/error404.jsp
500
/error500.jsp
java.lang.RuntimeException
/error.jsp
在例1-4中铆遭,如果響應(yīng)的狀態(tài)碼是404時(shí)硝桩,會(huì)轉(zhuǎn)發(fā)到error404.jsp頁(yè)面,如果響應(yīng)狀態(tài)碼是500枚荣,會(huì)轉(zhuǎn)發(fā)到error500.jsp頁(yè)面碗脊,當(dāng)服務(wù)器端拋出RuntimeException,會(huì)轉(zhuǎn)發(fā)到error.jsp頁(yè)面橄妆。
我們知道無(wú)論服務(wù)器端拋出什么異常衙伶,響應(yīng)的狀態(tài)碼都是500,那么當(dāng)服務(wù)器端拋出RuntimeException時(shí)害碾,是轉(zhuǎn)發(fā)到error500.jsp還是轉(zhuǎn)發(fā)到error.jsp?由于狀態(tài)碼500的范圍比較大矢劲,相對(duì)來(lái)說(shuō)不夠具體,所以會(huì)轉(zhuǎn)發(fā)到error.jsp頁(yè)面慌随。如果響應(yīng)狀態(tài)碼是500芬沉,但并不是RuntimeException異常,那么就轉(zhuǎn)發(fā)到error500.jsp阁猜。
下面我們來(lái)驗(yàn)證一下丸逸,如下所示:
(1)在web應(yīng)用下新建一個(gè)error目錄,在該目錄下新建一個(gè)errorPage.jsp剃袍,頁(yè)面的主要內(nèi)容如例1-5所示:
<%@ page language="java"?contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"?isErrorPage="true"%>
"Content-Type"?content="text/html; charset=UTF-8">
Insert title here
哈哈~出錯(cuò)了
(2)該應(yīng)用的web.xml黄刚,如例1-6所示:
404
/error/errorPage.jsp
500
/error/errorPage.jsp
java.lang.RuntimeException
/index.jsp
(3)重啟服務(wù)器,在瀏覽器端訪問(wèn)一個(gè)不存在的頁(yè)面民效,瀏覽器的顯示結(jié)果如圖1-5所示:
圖1-5 瀏覽器顯示結(jié)果
4.autoFlush屬性和buffer屬性
這兩個(gè)屬性很少使用憔维,我們了解一下即可涛救,如下所示:
autoFlush屬性:指定jsp的輸出緩沖區(qū)被響應(yīng)信息填滿時(shí),是否自動(dòng)刷新埋同。默認(rèn)值為true州叠,如果值為false,表示在緩沖區(qū)被填滿時(shí)拋出異常凶赁;
buffer屬性:指定緩沖區(qū)的大小咧栗,默認(rèn)是8kb,通常不需要修改虱肄。
5.其他屬性
page指令的其他不常用屬性致板,如下所示:
isELIgnored屬性:是否忽略el表達(dá)式,默認(rèn)值是false咏窿,表示不忽略斟或;
language屬性:指定當(dāng)前jsp編譯后的語(yǔ)言類型,默認(rèn)值為java集嵌;
info:jsp的說(shuō)明信息萝挤;
isThreadSafe:當(dāng)前的jsp是否支持并發(fā)訪問(wèn);
session:當(dāng)前頁(yè)面是否支持session根欧,如果為false怜珍,那么當(dāng)前頁(yè)面就沒有session這個(gè)內(nèi)置對(duì)象;
extends:讓jsp生成的servlet去繼承該屬性指定的類凤粗。
contentType?是指服務(wù)器發(fā)送給客戶端時(shí)的內(nèi)容編碼
pageEncoding?是jsp文件本身的編碼