當(dāng)前位置:首頁(yè) > IT技術(shù) > Web編程 > 正文

3. JSP指令 | JSP 啊 哦 嗯 嘻嘻
2022-05-31 17:09:59

JSP指令

JSP指令

JSP 指令的作用是為當(dāng)前頁(yè)面做一些基本的屬性設(shè)置,為當(dāng)前的頁(yè)面的運(yùn)行提供基本的環(huán)境。
在JSP中包含三類指令:

  • page,頁(yè)面指令  ? ? ? 頁(yè)面? ???[pe?d?]
  • include,包含指令
  • taglib,標(biāo)簽庫(kù)指令(此頁(yè)不講先 詳看后面【? ___? 頁(yè)】)

這些指令的使用的語法格式均為如下形式:

<%@?指令名稱??屬性名=屬性值?...?%>

一 一 介 紹:

page指令:

page指令用于設(shè)置當(dāng)前JSP頁(yè)面的相關(guān)信息, 一個(gè) JSP中可以包含多個(gè) page 指令,有以下幾個(gè)常用的屬性:【page 屬性 有很多很多 但具體用的到的自己去百度 這里講最基本的】:

?

記住啊 是當(dāng)前頁(yè)面有效?。?!

pageEncoding 屬性

pageEncoding屬性用于設(shè)置當(dāng)前JSP頁(yè)面的字符編碼格式。

例如:

<%@?page?pageEncoding="UTF-8"?%>

該屬性被翻譯到j(luò)ava源碼里面的_jspService()方法中的 response.setContentType(“text/html;charset=UTF-8”)  你可以自己去查看一下!

如果你每次創(chuàng)建一個(gè)JSP文件都要改編碼的話, 你嫌麻煩 你可以在Eclipse 把它設(shè)置為 默認(rèn)是UTF-8的編碼:

在eclipse中新建JSP時(shí)默認(rèn)的使用ISO8859-1的編碼,此時(shí)可以通過下列步驟修改創(chuàng)建JSP文件的默認(rèn)編碼:
windows–>preference–>Web–>JSP files,將encoding修改為utf-8即可。

?

contentType 屬性
contentType屬性用于設(shè)置當(dāng)前 JSP 頁(yè)面在瀏覽器中的內(nèi)容類型,通常為”text/html”,若在 JSP 頁(yè)面中設(shè)置如下:

<%@?page?contentType="text/html;charset=utf-8"?%>
作用是服務(wù)器向客戶端發(fā)送數(shù)據(jù)的時(shí)候指定的文件格式是text/html,字符編碼是utf-8。

?

你新建文件他默認(rèn)頭部會(huì)自動(dòng)創(chuàng)建好 pageEncoding 和 contentType 屬性 ,而且指定好了編碼,默認(rèn)編碼上面已經(jīng)給出教程修改~~

?

import 屬性
該屬性主要用于在JSP中導(dǎo)入java包

<%@?page?import="java.util.*"?%>

在Java源碼中被翻譯為:    import java.util.*;

你也可以一條指令導(dǎo)入很多類包,用逗號(hào)隔開即可例如:

<%@?page?import="java.util.*,java.sql.SQLData"?%>

記得逗號(hào)分隔開即可

?

errorPage 屬性
該屬性主要用于指定當(dāng)前頁(yè)面運(yùn)行過程中發(fā)生異常時(shí)所要跳轉(zhuǎn)到的頁(yè)面。

<%@?page?errorPage="/error.jsp"?%>

我們測(cè)試一下 新建兩個(gè)jsp 其中一個(gè)故意拋出異常 他就會(huì)調(diào)到異常(error.jsp里面了?。。?/p>

該屬性會(huì)被翻譯到 Servlet 的_jspService()方法中。

但是:要配合這個(gè)屬性一起用:

isErrorPage 屬性
如果一個(gè)頁(yè)面中指定了發(fā)生異常后所要跳轉(zhuǎn)的頁(yè)面,這時(shí)將會(huì)出現(xiàn)一個(gè)問題:異常信息被隱藏。在控制臺(tái)看不到異常信息,在所跳轉(zhuǎn)的頁(yè)面中也看不到異常信息,這樣不利于開發(fā)者定位錯(cuò)誤的原因。此時(shí)可以在發(fā)生異常后所要跳轉(zhuǎn)的頁(yè)面中將isErrorPage屬性設(shè)置為true,將其聲明為錯(cuò)誤處理頁(yè)面:

什么意思呢 就是說 你異常了 跳到了 error.jsp 頁(yè)面 然后你要打印異常棧 就需要exception對(duì)象變量,默認(rèn)情況下exception對(duì)象變量是不存在的

在編譯后的java中也找不到,所以你要打印異常棧的話 你就必須得在那個(gè)頁(yè)面弄個(gè)指令 然后將isErrorPage設(shè)置為true,才能召喚出 exception 對(duì)象 ! 因?yàn)槟J(rèn)是false的!?。?

注意:一個(gè)頁(yè)面別出現(xiàn)兩個(gè)errorPage屬性 不然不報(bào)錯(cuò)報(bào)si你!

即配合起來兩個(gè)jsp源碼就是:

index.jsp:

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"
????pageEncoding="UTF-8"%>
????
????<%--?讓其出現(xiàn)異常時(shí)?我們跳到?error?的頁(yè)面?。?--%>
????<%@?page?errorPage="/error.jsp"?%>
????
<!DOCTYPE?html>
<html>
<head>
<meta?charset="UTF-8">
<title>Insert?title?here</title>
</head>
<body>

????????<%--?現(xiàn)在故意讓其出現(xiàn)允許時(shí)異常:??記住啊?只有允許時(shí)異常我才能?其他異常被檢測(cè)到了你就直接報(bào)錯(cuò)的?。?!--%>
????????<%?
????????????System.out.print(8/0);
????????%>
</body>
</html>

error.jsp:

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"
????pageEncoding="UTF-8"%>
<!DOCTYPE?html>
<html>
<head>
<meta?charset="UTF-8">
<title>Insert?title?here</title>
</head>
<body>

????<%--?1.我們顯示給用戶說:?我們出現(xiàn)了異常?請(qǐng)聯(lián)系管理員?BIHU:?--%>
????<p?style?=?"margin:10px??auto?;font-size:?30px">異常?500?!?請(qǐng)聯(lián)系管理員?BIHU!</p>
????
????<%--?2.如果我們想要打印異常棧來獲取到底是哪里錯(cuò)了??我們就需要配置那個(gè)?isErrorPage?為真?。?!?不然沒有exception對(duì)象變量??--%>
????<%@?page?isErrorPage="true"?%>
????
????<%????
????//????3.在控制臺(tái)中打印?異常信息:
????exception.printStackTrace();
????
????%>
</body>
</html>

?

這里強(qiáng)調(diào)2點(diǎn)!??! 千萬千萬要是允許時(shí)異常才能啊,你語法錯(cuò)了那種 直接報(bào)錯(cuò)的?。?/p>

還有就是 一定要是isErrorPage屬性設(shè)置為true?。。?!不然沒那個(gè)對(duì)象變量的!

一個(gè)頁(yè)面中的isErrorPage屬性被設(shè)置為true之后,在_jspService()方法中,多出了一個(gè)變量 exception。這就是內(nèi)置對(duì)象exception,可以通過該對(duì)象在控制臺(tái)打印異常信息。

?

?

session 屬性
session屬性用于指定當(dāng)前頁(yè)面中是否可以直接使用內(nèi)置對(duì)象session,默認(rèn)為 true?!   ?/意思就是說 如果你先禁用session的話! 那么你才來設(shè)置此屬性為false即可??!

?

?


include指令

包含指令, 似曾相識(shí)??! C語言的包含頭文件的關(guān)鍵字 啊哈哈!

用于將某個(gè)文件包含到當(dāng)前的 JSP 文件中。該指令只有一個(gè)屬性 file,用于指定要包含的文件。
被包含的文件可以是 JSP 文件,也可以是 HTML文件。

這里要注意include的格式?。?他沒有等于號(hào) 直接 空格 file的啊 :

include 包含文件 格式:

?

<%@? include file="/xxxx.jsp" %>?

這里定義一個(gè)名為 jsp2.jsp 的文件,其中定義了一個(gè)變量 sum? =? 10 :

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"
????pageEncoding="UTF-8"%>
<!DOCTYPE?html>
<html>
<head>
<meta?charset="UTF-8">
<title>Insert?title?here</title>
</head>
<body>
????<%?int?sum?=?10;?%>
</body>
</html>

然后我們?cè)趇ndex.jsp 包含 jsp2.jsp,看會(huì)怎么樣:

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"
????pageEncoding="UTF-8"%>
????
??<%--?這里包含jsp2.jsp?文件???記住include是指令?。。?!?不用page!!!!??page?也是一個(gè)指令?。。。?!????--%>
??<%@??include?file="/jsp2.jsp"?%>?
<!DOCTYPE?html>
<html>
<head>
<meta?charset="UTF-8">
<title>Insert?title?here</title>
</head>
<body>

<%--?因?yàn)檫@里導(dǎo)入了jsp2?所以呢?我們要在這訪問jsp2定義的sum??值是?10?--%>
????????<%?out.print(sum);?%>
</body>
</html>

上面可知我們成功訪問到了 jsp2中定義的 sum !?。?但是注意!include? 他是一個(gè)指令 不是屬性 別加page??!初學(xué)者總是那么內(nèi)個(gè) 對(duì)吧~~

?靜態(tài)引入變量名 別 重名!?。。?動(dòng)態(tài)就可以! 后面說為什么

找到生成java文件的目錄,里面只生成了一個(gè) index.java 的文件,并沒有生成jsp2.java 文件。那是因?yàn)?JSP 翻譯引擎在翻譯時(shí),會(huì)將 include 指令所指定的文件內(nèi)容直接翻譯到當(dāng)前 JSP 的java源碼中,形成一個(gè).java 文件 ( 合并 )?。這個(gè)包含操作是在編譯之前由 JSP 翻譯引擎完成的,不是在程序運(yùn)行期完成的。這種包含通常被稱為靜態(tài)包含,與之相對(duì)的還有動(dòng)態(tài)包含(后面會(huì)講到)。
由于在編譯期就將這些文件合并為了一個(gè) java文件,所以,整個(gè)過程就一個(gè)_jspService()方法。也就是說,這些文件之間是可以相互訪問局部變量的,只要滿足變量聲明與使用的先后順序即可 (即包含文件和使用變量的順序 因?yàn)樗象w為一個(gè)java文件 所以先后會(huì)排好的.... 不然異常)。

為什么使用 include 指令
在一個(gè)web系統(tǒng)中,往往很多頁(yè)面的頭部、底部等內(nèi)容是相同的,為了減少重復(fù)性的工作和便于修改,可以將這些內(nèi)容相同的內(nèi)容單獨(dú)定義為一個(gè)jsp文件,在需要的時(shí)候直接使用include指令將其引入進(jìn)來即可,這樣不僅大大減少了工作量,還做到了對(duì)于頁(yè)面修改的”一改全改”效果。

?

?


作者:??咸瑜???

本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >