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.*”%>,也可以寫(xiě)成<%@page import=”java.net.*,java.util.*,java.sql.*”%>,多個(gè)包之間用逗號(hào)隔開(kāi)。
2.errorPage屬性和isErrorPage屬性
我們知道,如果一個(gè)頁(yè)面出現(xiàn)錯(cuò)誤,在瀏覽器端訪(fǎng)問(wèn)這個(gè)頁(yè)面時(shí),服務(wù)器會(huì)響應(yīng)錯(cuò)誤信息,但是一般在開(kāi)發(fā)中,為了讓用戶(hù)體驗(yàn)更好一些,開(kāi)發(fā)人員不會(huì)讓用戶(hù)看到錯(cuò)誤信息,這時(shí)我們就可以使用page指令的errorPage屬性指定錯(cuò)誤頁(yè)面,給用戶(hù)一種友好的體驗(yàn)。
errorPage屬性的作用:當(dāng)前訪(fǎ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"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</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">
</head>
<body>
<%
int n=1/0;
%>
</body>
</html> |
例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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>哈哈~出錯(cuò)了</h1>
</body>
</html> |
(3)將工程發(fā)布到服務(wù)器中,然后啟動(dòng)服務(wù)器,在瀏覽器端訪(fǎng)問(wèn)one.jsp頁(yè)面,瀏覽器顯示結(jié)果如圖1-1所示:
圖1-1 瀏覽器顯示結(jié)果
由圖1-1可知,瀏覽器地址欄上的地址仍然是one.jsp頁(yè)面的訪(fǎng)問(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)成功。訪(fǎ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)象是由于我們沒(méi)有設(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)然后再在瀏覽器端訪(fǎng)問(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
<body>
<h1>哈哈~出錯(cuò)了</h1>
<%
exception.printStackTrace(response.getWriter());
%>
</body> |
例1-3中,使用九大內(nèi)置對(duì)象將異常信息打印在瀏覽器端。
(8)在瀏覽器端再次訪(fǎng)問(wèn)one.jsp,瀏覽器顯示結(jié)果如圖1-4所示:
圖1-4 瀏覽器顯示結(jié)果
如果jsp頁(yè)面中沒(méi)有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
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/error.jsp</location>
</error-page> |
在例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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>哈哈~出錯(cuò)了</h1>
</body>
</html> |
(2)該應(yīng)用的web.xml,如例1-6所示:
<error-page>
<error-code>404</error-code>
<location>/error/errorPage.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/errorPage.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/index.jsp</location>
</error-page> |
(3)重啟服務(wù)器,在瀏覽器端訪(fǎng)問(wèn)一個(gè)不存在的頁(yè)面,瀏覽器的顯示結(jié)果如圖1-5所示:
圖1-5 瀏覽器顯示結(jié)果
4.autoFlush屬性和buffer屬性
這兩個(gè)屬性很少使用,我們了解一下即可,如下所示:
- autoFlush屬性:指定jsp的輸出緩沖區(qū)被響應(yīng)信息填滿(mǎn)時(shí),是否自動(dòng)刷新。默認(rèn)值為true,如果值為false,表示在緩沖區(qū)被填滿(mǎn)時(shí)拋出異常;
- buffer屬性:指定緩沖區(qū)的大小,默認(rèn)是8kb,通常不需要修改。
5.其他屬性
page指令的其他不常用屬性,如下所示:
- isELIgnored屬性:是否忽略el表達(dá)式,默認(rèn)值是false,表示不忽略;
- language屬性:指定當(dāng)前jsp編譯后的語(yǔ)言類(lèi)型,默認(rèn)值為java;
- info:jsp的說(shuō)明信息;
- isThreadSafe:當(dāng)前的jsp是否支持并發(fā)訪(fǎng)問(wèn);
- session:當(dāng)前頁(yè)面是否支持session,如果為false,那么當(dāng)前頁(yè)面就沒(méi)有session這個(gè)內(nèi)置對(duì)象;
- extends:讓jsp生成的servlet去繼承該屬性指定的類(lèi)。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://m.fskzgqt.cn/javaee