1. 程式人生 > >JSP中的三大指令

JSP中的三大指令

目錄

0.碼仙勵志

考慮一千次,不如去做一次;猶豫一萬次,不如實踐一次。華麗的跌倒,勝過無謂的徘徊,邁出第一步,才可以收穫停不住!

1.JSP指令概述

  1. JSP指令的格式:<%@指令名 attr1=”” attr2=”” %>,一般都會把JSP指令放到JSP檔案的最上方,但這不是必須的。
  2. JSP中有三大指令:page、include、taglib,最為常用,也最為複雜的就是page指令了。

2.page指令

page指令是最為常用的指定,也是屬性最多的屬性! page指令沒有必須屬性,都是可選屬性。例如<%@page %>,沒有給出任何屬性也是可以的! 在JSP頁面中,任何指令都可以重複出現! <%@ page language=”java”%> <%@ page import=”java.util.*”%> <%@ page pageEncoding=”utf-8”%> 這也是可以的!

1.page指令的pageEncoding和contentType(重點)

  1. pageEncoding指定當前JSP頁面的編碼!這個編碼是給伺服器看的,伺服器需要知道當前JSP使用的編碼,不然伺服器無法正確把JSP編譯成java檔案。所以這個編碼只需要與真實的頁面編碼一致即可!在MyEclipse中,在JSP檔案上點選右鍵,選擇屬性就可以看到當前JSP頁面的編碼了。
  2. contentType屬性與response.setContentType()方法的作用相同!它會完成兩項工作,一是設定響應字元流的編碼,二是設定content-type響應頭。例如:<%@ contentType=”text/html;charset=utf-8”%>,它會使“真身”中出現response.setContentType(“text/html;charset=utf-8”)。
  3. 無論是page指令的pageEncoding還是contentType,它們的預設值都是ISO-8859-1,我們知道ISO-8859-1是無法顯示中文的,所以JSP頁面中存在中文的話,一定要設定這兩個屬性。
  4. 其實pageEncoding和contentType這兩個屬性的關係很“曖昧”:
  5. 當設定了pageEncoding,而沒設定contentType時: contentType的預設值為pageEncoding;
  6. 當設定了contentType,而沒設定pageEncoding時: pageEncoding的預設值與contentType;
  7. 也就是說,當pageEncoding和contentType只出現一個時,那麼另一個的值與出現的值相同。如果兩個都不出現,那麼兩個屬性的值都是ISO-8859-1。所以通過我們至少設定它們兩個其中一個! 

2.page指令的import屬性 

  1. import是page指令中一個很特別的屬性!
  2. import屬性值對應“真身”中的import語句。
  3. import屬性值可以使逗號:<%@page import=”java.net.*,java.util.*,java.sql.*”%>
  4. import屬性是唯一可以重複出現的屬性:
  5. <%@page import=”java.util.*” import=”java.net.*” import=”java.sql.*”%>
  6. 但是,我們一般會使用多個page指令來匯入多個包:
  7. <%@ page import=”java.util.*”%>
  8. <%@ page import=”java.net.*”%>
  9. <%@ page import=”java.text.*”%>

3.page指令的errorPage和isErrorPage 

我們知道,在一個JSP頁面出錯後,Tomcat會響應給使用者錯誤資訊(500頁面)!如果你不希望Tomcat給使用者輸出錯誤資訊,那麼可以使用page指令的errorPage來指定錯誤頁!也就是自定義錯誤頁面,例如:<%@page errorPage=”xxx.jsp”%>。這時,在當前JSP頁面出現錯誤時,會請求轉發到xxx.jsp頁面。

a.jsp

<%@ page import="java.util.*" pageEncoding="UTF-8"%>
<%@ page  errorPage="b.jsp" %>
    <%
    	if(true)
    		throw new Exception("哈哈~");
    %>

b.jsp

<%@ page pageEncoding="UTF-8"%>
<html>
  <body>
   <h1>出錯啦!</h1>
  </body>
</html>

在上面程式碼中,a.jsp丟擲異常後,會請求轉發到b.jsp。在瀏覽器的位址列中還是a.jsp,因為是請求轉發! 而且客戶端瀏覽器收到的響應碼為200,表示請求成功!如果希望客戶端得到500,那麼需要指定b.jsp為錯誤頁面。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page  isErrorPage="true"  %>
<html>
  <body>
   <h1>出錯啦!</h1>
	<%=exception.getMessage() %>
  </body>
</html>

注意,當isErrorPage為true時,說明當前JSP為錯誤頁面,即專門處理錯誤的頁面。那麼這個頁面中就可以使用一個內建物件exception了。其他頁面是不能使用這個內建物件的!

web.xml中配置錯誤頁面

不只可以通過JSP的page指令來配置錯誤頁面,還可以在web.xml檔案中指定錯誤頁面。這種方式其實與page指令無關,但想來想去還是在這個位置來講解比較合適!

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> 

<error-page>有兩種使用方式: ***<error-code>和<location>子元素; ***<exception-type>和<location>子元素; 其中<error-code>是指定響應碼;<location>指定轉發的頁面;<exception-type>是指定丟擲的異常型別。

在上例中: 當出現404時,會跳轉到error404.jsp頁面; 當出現RuntimeException異常時,會跳轉到error.jsp頁面; 當出現非RuntimeException的異常時,會跳轉到error500.jsp頁面。  這種方式會在控制檯看到異常資訊!而使用page指令時不會在控制檯列印異常資訊。

4.page指令的autFlush和buffer

  1. buffer表示當前JSP的輸出流(out隱藏物件)的緩衝區大小,預設為8kb。
  2. authFlush表示在out物件的緩衝區滿時如果處理!當authFlush為true時,表示緩衝區滿時把緩衝區資料輸出到客戶端;當authFlush為false時,表示緩衝區滿時,丟擲異常。authFlush的預設值為true。
  3. 這兩個屬性一般我們也不會去特意設定,都是保留預設值!

5.page指令的isELIgnored

page指令的isElIgnored屬性表示當前JSP頁面是否忽略EL表示式,預設值為false,表示不忽略(即支援)。

6.page指令的其他屬性

  1. language:只能是Java,這個屬性可以看出JSP最初設計時的野心!希望JSP可以轉換成其他語言!但是,到現在JSP也只能轉換成Java程式碼;
  2. info:JSP說明性資訊;
  3. isThreadSafe:預設為false,為true時,JSP生成的Servlet會去實現一個過時的標記介面SingleThreadModel,這時JSP就只能處理單執行緒的訪問;
  4. session:預設為true,表示當前JSP頁面可以使用session物件,如果為false表示當前JSP頁面不能使用session物件;
  5. extends:指定當前JSP頁面生成的Servlet的父類;

7.jsp-config(瞭解)

在web.xml頁面中配置<jsp-config>也可以完成很多page指定的功能!

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern> 
        <el-ignored>true</el-ignored> 
        <page-encoding>UTF-8</page-encoding> 
        <scripting-invalid>true</scripting-invalid> 
    </jsp-property-group>
</jsp-config>

3.include指令

  1. include指令表示靜態包含!即目的是把多個JSP合併成一個JSP檔案!
  2. include指令只有一個屬性:file,指定要包含的頁面,例如:<%@include file=”b.jsp”%>。
  3. 靜態包含:當hel.jsp頁面包含了lo.jsp頁面後,在編譯hel.jsp頁面時,需要把hel.jsp和lo.jsp頁面合併成一個檔案,然後再編譯成Servlet(Java檔案)。

 

很明顯,在ol.jsp中在使用username變數,而這個變數在hel.jsp中定義的,所以只有這兩個JSP檔案合併後才能使用。通過include指定完成對它們的合併!

4.taglib指令

  1. 在JSP頁面中使用第三方的標籤庫時,需要使用taglib指令來“導包”。例如:
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. 其中prefix表示標籤的字首,這個名稱可以隨便起。uri是由第三方標籤庫定義的,所以你需要知道第三方定義的uri。