天天看點

3. JSP指令 | JSP 啊 哦 嗯 嘻嘻

JSP指令

JSP指令

JSP 指令的作用是為目前頁面做一些基本的屬性設定,為目前的頁面的運作提供基本的環境。

在JSP中包含三類指令:

  • page,頁面指令        頁面     [peɪdʒ]
  • include,包含指令
  • taglib,标簽庫指令(此頁不講先 詳看後面【  ___  頁】)

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

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

一 一 介 紹:

page指令:

page指令用于設定目前JSP頁面的相關資訊, 一個 JSP中可以包含多個 page 指令,有以下幾個常用的屬性:【page 屬性 有很多很多 但具體用的到的自己去百度 這裡講最基本的】:

記住啊 是目前頁面有效!!!

pageEncoding 屬性

pageEncoding屬性用于設定目前JSP頁面的字元編碼格式。

例如:

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

該屬性被翻譯到java源碼裡面的_jspService()方法中的 response.setContentType(“text/html;charset=UTF-8”)  你可以自己去檢視一下!

如果你每次建立一個JSP檔案都要改編碼的話, 你嫌麻煩 你可以在Eclipse 把它設定為 預設是UTF-8的編碼:

在eclipse中建立JSP時預設的使用ISO8859-1的編碼,此時可以通過下列步驟修改建立JSP檔案的預設編碼:

windows–>preference–>Web–>JSP files,将encoding修改為utf-8即可。

contentType 屬性

contentType屬性用于設定目前 JSP 頁面在浏覽器中的内容類型,通常為”text/html”,若在 JSP 頁面中設定如下:

<%@ page contentType="text/html;charset=utf-8" %>      
作用是伺服器向用戶端發送資料的時候指定的檔案格式是text/html,字元編碼是utf-8。      

你建立檔案他預設頭部會自動建立好 pageEncoding 和 contentType 屬性 ,而且指定好了編碼,預設編碼上面已經給出教程修改~~

import 屬性

該屬性主要用于在JSP中導入java包

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

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

你也可以一條指令導入很多類包,用逗号隔開即可例如:

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

記得逗号分隔開即可

errorPage 屬性

該屬性主要用于指定目前頁面運作過程中發生異常時所要跳轉到的頁面。

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

我們測試一下 建立兩個jsp 其中一個故意抛出異常 他就會調到異常(error.jsp裡面了!!)

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

但是:要配合這個屬性一起用:

isErrorPage 屬性

如果一個頁面中指定了發生異常後所要跳轉的頁面,這時将會出現一個問題:異常資訊被隐藏。在控制台看不到異常資訊,在所跳轉的頁面中也看不到異常資訊,這樣不利于開發者定位錯誤的原因。此時可以在發生異常後所要跳轉的頁面中将isErrorPage屬性設定為true,将其聲明為錯誤處理頁面:

什麼意思呢 就是說 你異常了 跳到了 error.jsp 頁面 然後你要列印異常棧 就需要exception對象變量,預設情況下exception對象變量是不存在的

在編譯後的java中也找不到,是以你要列印異常棧的話 你就必須得在那個頁面弄個指令 然後将isErrorPage設定為true,才能召喚出 exception 對象 ! 因為預設是false的!!!

注意:一個頁面别出現兩個errorPage屬性 不然不報錯報si你!

即配合起來兩個jsp源碼就是:

index.jsp:

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

        <%-- 現在故意讓其出現允許時異常:  記住啊 隻有允許時異常我才能 其他異常被檢測到了你就直接報錯的!!!--%>
        <% 
            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.我們顯示給使用者說: 我們出現了異常 請聯系管理者 BIHU: --%>
    <p style = "margin:10px  auto ;font-size: 30px">異常 500 ! 請聯系管理者 BIHU!</p>
    
    <%-- 2.如果我們想要列印異常棧來擷取到底是哪裡錯了  我們就需要配置那個 isErrorPage 為真!!! 不然沒有exception對象變量  --%>
    <%@ page isErrorPage="true" %>
    
    <%    
    //    3.在控制台中列印 異常資訊:
    exception.printStackTrace();
    
    %>
</body>
</html>      

這裡強調2點!!! 千萬千萬要是允許時異常才能啊,你文法錯了那種 直接報錯的啊!

還有就是 一定要是isErrorPage屬性設定為true!!!!不然沒那個對象變量的!

一個頁面中的isErrorPage屬性被設定為true之後,在_jspService()方法中,多出了一個變量 exception。這就是内置對象exception,可以通過該對象在控制台列印異常資訊。

session 屬性

session屬性用于指定目前頁面中是否可以直接使用内置對象session,預設為 true。    //意思就是說 如果你先禁用session的話! 那麼你才來設定此屬性為false即可!!

include指令

包含指令, 似曾相識啊! C語言的包含頭檔案的關鍵字 啊哈哈!

用于将某個檔案包含到目前的 JSP 檔案中。該指令隻有一個屬性 file,用于指定要包含的檔案。

被包含的檔案可以是 JSP 檔案,也可以是 HTML檔案。

這裡要注意include的格式啊: 他沒有等于号 直接 空格 file的啊 :

include 包含檔案 格式:

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

這裡定義一個名為 jsp2.jsp 的檔案,其中定義了一個變量 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>      

然後我們在index.jsp 包含 jsp2.jsp,看會怎麼樣:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
  <%-- 這裡包含jsp2.jsp 檔案   記住include是指令!!!! 不用page!!!!  page 也是一個指令!!!!!    --%>
  <%@  include file="/jsp2.jsp" %> 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%-- 因為這裡導入了jsp2 是以呢 我們要在這通路jsp2定義的sum  值是 10 --%>
        <% out.print(sum); %>
</body>
</html>      

上面可知我們成功通路到了 jsp2中定義的 sum !!! 但是注意!include  他是一個指令 不是屬性 别加page!!初學者總是那麼内個 對吧~~

 靜态引入變量名 别 重名!!!! 動态就可以! 後面說為什麼

找到生成java檔案的目錄,裡面隻生成了一個 index.java 的檔案,并沒有生成jsp2.java 檔案。那是因為 JSP 翻譯引擎在翻譯時,會将 include 指令所指定的檔案内容直接翻譯到目前 JSP 的java源碼中,形成一個.java 檔案 ( 合并 ) 。這個包含操作是在編譯之前由 JSP 翻譯引擎完成的,不是在程式運作期完成的。這種包含通常被稱為靜态包含,與之相對的還有動态包含(後面會講到)。

由于在編譯期就将這些檔案合并為了一個 java檔案,是以,整個過程就一個_jspService()方法。也就是說,這些檔案之間是可以互相通路局部變量的,隻要滿足變量聲明與使用的先後順序即可 (即包含檔案和使用變量的順序 因為他合體為一個java檔案 是以先後會排好的.... 不然異常)。

為什麼使用 include 指令

在一個web系統中,往往很多頁面的頭部、底部等内容是相同的,為了減少重複性的工作和便于修改,可以将這些内容相同的内容單獨定義為一個jsp檔案,在需要的時候直接使用include指令将其引入進來即可,這樣不僅大大減少了工作量,還做到了對于頁面修改的”一改全改”效果。