JSP(第四天)

一、jsp的三大指令

1>jsp中有三大指令:page、include、taglib

2>jsp指令的格式:

<%@指令名稱 屬性=“值” 屬性=“值”.......%>--------->特殊的標籤

jsp的指令可以放在jsp頁面的任何位置,但是一般都會把jsp指令放到jsp文件的最上方

3>jsp的任何指令在一個jsp文件中都是可以重複出現的:如

<%@ page language = "java"%>

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

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

而用一個page指令也是可以搞定的:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

1.page指令

page指令沒有必須屬性,都是可選屬性。即使沒有出席那任何屬性也是可以的,如:

<%@ page %>

1>page指令的pageEncoding和contentType屬性:

   1)pageEncoding屬性:它用於指定當前jsp頁面的編碼格式,

        只要當前指定的編碼格式和右鍵點擊當前jsp文件Properties屬性看到的當前jsp文件的

        編碼文件的編碼格式一致就不會出現亂碼問題(但只要一個文件編輯的編碼格式)和

        打開的編碼格式一致就不會出現亂碼)

       而服務器需要以pageEncoding的編碼格式將jsp編譯成.java的否則不能正確編譯。

2)contentType屬性:與response.setContentType()方法的作用相同

      一是設置響應內容的編碼格式

      二是設置content-type響應頭,告訴瀏覽器服務器響應協議的編碼格式。

       如,<%@ page contentType = "text/html;charset=utf-8"%>

       在jsp頁面對應的Servlet中就是以response.setContentType("text/html;charset=utf-8");

       存在的。

注意:無論是page指令的pageEncoding屬性contentType屬性,默認值都是ISO8859-1

是不支持中文的,所以jsp頁面存在中文的話一定要設置這兩個屬性。

1)以上兩個屬性如果只提供了一個,那麼另一個屬性的值就默認爲設置的那一個屬性的值。

2)所以jsp爲了支持中文,以上兩個屬性至少要設置一個。

2>page指令的import屬性:

import屬性的本質就是jsp頁面對應的Servlet中的import關鍵字導包。

import屬性是唯一可以重複出現的屬性,如:

<%@  page import = "java.util.*" import = "java.io.*"%>,還可以使用“,”分隔

 <%@ page import="java.util.*,java.io.*"%>,但是一般會使用多個page指
   令來導入多個包:

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

3>page指令的errorPage屬性和isErrorPage屬性:

1)errorPage屬性:我們知道,當請求的jsp頁面出錯拋出異常後,服務器會給瀏覽器響應錯誤信息

那麼就可以使用page指令的errorPage屬性來自定義錯誤頁面。如:

    <%@ page errorPage ="xxx.jsp"%>,那麼當前jsp頁面出錯時,就會請求轉發到xxx.jsp,並且響應

200狀態碼,表示請求成功。

2)isErrorPage屬性:如果希望給客戶端響應的狀態碼爲500,那麼就還需要使用isErrorPage屬性指定

通過errorPage屬性請求轉發的jsp頁面爲錯誤頁面。當isErrorPage屬性的值爲True時,說明當前jsp

頁面爲錯誤頁面,即專門處理錯誤的頁面,那麼在這個jsp頁面中就可以使用內置對象exception了,

其它的頁面時不能使用exception內置對象的。

3)web.xml中也可以配置錯誤頁面

使用jsp的page指令的errorPage屬性和isErrorPage屬性可以配置錯誤頁面,還可以在web.xml

中配置錯誤頁面。

<!--

服務器給客戶端響應404狀態碼,即客戶端訪問的資源不存在時,請求轉發到error404.jsp頁面

-->

<error-page>
      <error-code>404</error-code>
      <location>/error/error404.jsp</location>
    </error-page>

 <!--
     服務器給客戶端瀏覽器響應500狀態碼,即客戶端請求服務器的資源出錯拋出
     異常時,請求轉發到error500.jsp頁面
     -->

    <error-page>
      <error-code>500</error-code>
      <location>/error/error500.jsp</location>
    </error-page>


    <!--
      上面的配置表示,當服務器響應500狀態碼,即客戶端請求服務器的資源出錯
      拋出異常時,請求轉發到指定頁面,而500狀態碼錶示的是服務器資源拋出任何
      異常.如果需要指定對具體的異常進行處理的話就使用以下配置,表示當請求的
      服務器資源拋出空指針異常時,就請求轉發到nullPoint.jsp
    -->

    <error-page>
      <exception-type>java.lang.NullPointerException</exception-type>
      <location>/error/nullPoint.jsp</location>
    </error-page>

4>page指令的autoFlush屬性和buffer屬性

1)buffer屬性:表示當前jsp的輸出流(out內置對象)的緩衝區大小,默認爲8KB.

(一般不需要修改)

2)autoFlush屬性:指定當前jsp的輸出流(out內置對象)緩衝區滿時,是否自動刷新。

默認爲true,自動刷新,表示當緩衝區滿時自動把緩衝區數據輸出到客戶端。

如果改爲false時,那麼在緩衝區滿時拋出異常。(一般也不需要修改)

5>page指令的isELlgnored屬性:

表示當前jsp是否忽略EL表達式,默認值爲false,表示不忽略,即支持。

(一般不需要修改)

6>page指令一些基本沒用的屬性:
1)language屬性:指定當前jsp編譯後的語言類型,默認值爲java。(目前只支持java)

2)info屬性:當前jsp的說明信息

3)isThreadSafe屬性:當前jsp是否支持併發訪問,默認值爲false,支持。當改爲true時,

jsp生成的servlet會去實現一個過時的標記接口SingleThreadModel,這時jsp就只能單線程訪問。

(一般不需要修改)

4)session屬性:當前jsp頁面是否支持session,默認爲true,表示當前jsp可使用內置對象

      session;如果改爲false,表示當前jsp不能使用內置對象session(一般不需要修改)

5)extends屬性:讓當前jsp生成的servlet去繼承該屬性指定的類。(一般不需要修改)

2、include指令:

include指令表示靜態包含,其目的是把多個jsp合併成一個jsp;

include指令只有一個屬性file,指定所包含的頁面,如:<%@ include file = x.jsp"%>

include指令靜態包含reuqest.getRequestDispacher().include()的請求包含的功能相似,但是

1>request.getRequestDispatcher().include()是請求包含,包含和被包含的是兩個servlet,即

兩個.class,只是把兩個servlet的響應內容在運行時合併了,再統一

響應給客戶端。

2>include指令是在jsp編譯成java文件時完成的。它是把兩個jsp合併成一個jsp然後編譯成一個java

文件(也就是一個servlet),最終生成一個class文件

在jsp頁面被編譯成java文件之前,還是jsp的時候就合併了。

注意:include指令靜態包含,包含頁面和被包含頁面不能出現相同內容部分,

因爲兩個jsp頁面會被合併成一個jsp,進而再被編譯成一個servlet,

不可能出現重複定義內容。

應用:把頁面分解了,使用include指令組合在一起。頁面中不變的且重複使用的部分就是一個獨立的jsp

而我們只需要處理變化的頁面部分。

3、taglib指令:

在jsp頁面中使用第三方標籤庫時,需要使用taglib指令來導入標籤庫。兩個屬性:

1>prefix:指定標籤庫在當前jsp頁面使用的前綴。

     自定義命名,類似於xml的名稱空間。

2>uri:指定標籤庫的位置。一般是由第三方標籤庫定義好的。

3>指定標籤庫的標籤的使用:<前綴:標籤名>

如:<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>

使用該標籤庫的text標籤時,是<c:text>

二、jsp的九大內置對象:

每個jsp頁面服務器都會將其編譯成對應的一個.java(即一個servlet)文件,

而jsp頁面的內容的“真身”在對應的servlet的jspService()方法中,

而在jspService()方法的開頭部分已經創建了九大內置對象,

所以在jsp頁面可以直接使用這九大內置對象。

1、out:是JspWriter的對象,等同於servlet的PrintWriter out = response.getWriter();

獲取的PrintWriter的對象,作用就是向客戶端響應輸出文本數據。

2、config:他就是ServletConfig的對象。在servlet中ServletConfig對象就代表當前

   <servlet>
                 <servlet-name></servlet-name>
             <servlet-class></servlet-class>
             </servlet>

      的內容

而jsp我們不需要在web.xml中配置,所以config內置對象在jsp中幾乎沒用。

3、page:當前jsp對象(this),但其在jsp編譯的servlet中是以

    Object page = this;

    存在的,屬於多態思想,所以子類對象this的很多屬性和功能父類引用page都無法使用。

    而在jsp的<%%>java腳本中能直接用this去操作當前jsp對象絕不用page,

    所以page內置對象在jsp中也幾乎不用。

4、exception:異常對象,只有在錯誤頁面中纔可以使用該對象。

5、request:HttpServletRequest的對象,請求對象。

6、response:HttpServletResponse的對象,響應對象。

7、application:ServletContext的對象,服務器會爲每個web應用程序創建唯一的

一個ServletContext對象,其作用就是在整個web應用的動態資源之間共享數據,即多個servlet

和jsp之間就都可以通過獲取這個唯一的ServletContext對象來傳遞數據。

8、session:HttpSession的對象,服務器會爲每個會話創建一個session對象,多個動態資源

即多個servlet和jsp就可以使用session對象在同一會話中共享數據。

9、pageContext對象:域對象

在javaWeb中一共有四大域對象,其中servlet中可以使用request、session、ServletContext

三個對象,在jsp中可以使用pageContext、request、session、application(ServletContext)

四大域對象:

1>application(ServletContext):在整個web應用中共享數據

2>session:在一個會話中共享數據

3>request:在一個請求鏈中共享數據

4>pageContext:在一個jsp頁面中共享數據。這個域是指在當前jsp頁面和當前jsp頁面中使用

的標籤之間共享數據。

1>pageContext域對象功能:

pageContext域對象是四個域對象中範圍最小的,在當前jsp頁面和當前jsp頁面中使用的標籤之間

共享數據:

   1>void | setAttribute(String name,Object value)
   2>Object | getAttribute(String name)
   3>void | removeAttribute(String name)

2>pageContext獲取其它內置對象:

拿到了pageContext內置對象就等同於拿到了所有的內置對象,因爲pageContext對象

可以獲取其它8個內置對象:

                   1>JspWriter  |  getOut()獲取out內置對象

                   2>ServletConfig  |  getServletConfig()獲取config內置對象

                   3>Object  |  getPage()獲取page內置對象

                   4>ServletRequest  |  getRequest()獲取request內置對象

                   5>ServletResponse  |  getResponse()獲取response內置對象

                   6>HttpSession  |  getSession()獲取session內置對象

                   7>Throwable  |  getException()獲取exception內置對象

                   8>ServletContext  |  getServletContext()獲取application內置對象

3>pageContext代理其他域對象

因爲pageContext對象可以拿到其它8個內置對象,所以可以使用pageContext域對象

來代理其它3個域對象,也就是說可以使用pageContext對象向request、session、

application域對象中存儲數據和獲取數據。

    1>void | setAttribute(String name,Object value,int scope)向指定的域對象中添加數據
    2>Object | getAttribute(String name,int scope)從指定的域對象中獲取數據
    3>void | removeAttribute(String name,int scope)移除指定域對象中的數據

    如:
    1>pageContext.setAttribute("uname","mmy");默認向pageContext域中存儲數據
    2>pageContext.setAttribute("uname","mmy",PageContext.REQUEST_SCOPE)向
        request域對象中存儲數據
    3>pageContext.setAttribute("uname","mmy",PageContext.SESSION_SCOPE)向
       session域對象中存儲數據
    4>pageContext.setAttribute("uname","mmy",PageContext.APPLICATION_SCOPE)向
       application域對象中存儲數據

4>全域查找

pageContext全域查找:Object | findAttribute(String name)

 1>會從小到大,依次在pageContext,request,session,
      application域對象中查找名爲name的數據的值,如果找到則返回結果,沒有則返回null。
    2>如果在在多個域對象中存在同名的屬性,那麼依據優先級別,範圍最小的域對象的優先
      級別最高。所以存儲同名的屬性時,爲了進行區別都加上前綴,如:
      pageContext.setAttribute("uname","mmy");
      pageContext.setAttribute("request_uname","mmy",PageContext.REQUEST_SCOPE) 
      pageContext.setAttribute("session_uname","mmy",PageContext.SESSION_SCOPE) pageContext.setAttribute("application_uname","mmy",PageContext.APPLICATION_SCOPE)
三、jsp的動作標籤:
1>jsp的動作標籤的作用是用來簡化java腳本的,因爲其內部封裝的就是java腳本。

2>jsp的動作標籤和html的標籤的區別:

      A>html的標籤是由瀏覽器來解析執行的。

      B>jsp的動作標籤它封裝的就是java代碼,和java代碼一樣都是由服務器解析執行的。

3>jsp動作標籤的格式:<jsp:標籤名>

4>jsp的動作標籤是javaWeb內置已經定義好的動作標籤,供於我們直接使用。

1><jsp:forward>動作標籤:

<jsp:forward>動作標籤的作用就是請求轉發,和

  servlet的request.getRequestDispatcher("").forward(request, response);
  的作用是一樣的。

2><jsp:include>動作標籤:

<jsp:include>動作標籤的作用就是請求包含,和

servlet的request.getRequestDispatcher("").include(request,response);

的作用是一樣的。

<jsp:include>動作標籤和<%@include%>指令的區別:

1><%@include%>能夠是靜態包含,是指在兩個jsp頁面在被編譯成servlet之前,

合併成一個jsp頁面,然後在被編譯成一個servlet。

2><jsp:include>動作標籤,也叫動態包含,它於servlet的request.getRequestDispatcher("").include

(request,response);

一樣都是請求包含的作用。即表示當前jsp和被包含的jsp頁面都被編譯成各自對應的servlet後,在運

行時當前jsp頁面時請求包含到被包含的jsp頁面,合併兩個jsp頁面的響應體,共同向瀏覽器完成

完整的一個響應。

3><jsp:param>動作標籤:

還可以在<jsp:forward>和<jsp:include>動作標籤之間使用<jsp:param>動作標籤,向被請求轉發和

請求包含的jsp頁面傳遞參數。

  <jsp:forword page="b.jsp">
    <jsp:param name="uname" value="aaa"/>
  </jsp:forword>
  等價於:
  request.getRequestDispatcher("/b.jsp?uname=aaa").forword(request,response);

4<jsp:useBean>如果javaBean對象存在,則從指定域對象中獲取javaBean對象;

如果不存在,在當前jsp頁面創建javaBean對象,並保存到指定域對象中。

默認域對象時pageContext,

可以使用scope屬性來指定保存到的域對象,或指定獲取javaBean的域對象

5><jsp:setProperty>和<jsp:getProperty>

<jsp:setProperty>標籤的作用是給指定的javaBean對象的javaBean屬性賦值,

<jsp:getProperty>標籤時獲取指定javaBean對象的javaBean屬性的值:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章