JSP筆記,java的伺服器頁面,雖然說要淘汰了,但沒說已經不使用了,學吧

學JAVA的好人發表於2020-10-19

目錄

 

什麼是JSP?

JSP的作用

jsp如何訪問?

jsp的本質

jsp頭部的page指令

jsp常用指令碼

宣告指令碼:<%! 宣告java程式碼 %>

表示式指令碼:<%= 表示式 %>

程式碼指令碼:<% Java語句 %>

jsp的9大內建物件

jsp4大域物件

jsp中的out輸出和response.getWriter輸出的區別

out.write()輸出和out.print()輸出

靜態包含

多型包含

請求轉發

Listener監聽器


  1. 什麼是JSP?

    1. jsp全稱是java server pager(java的伺服器頁面)

  2. JSP的作用

    1. 主要作用是代替Servlet程式回傳HTML頁面的資料

    2. 以前Servle程式迴轉HTML頁面資料是一件非常繁瑣的事情,開發成本和維護成本極高

  3. jsp如何訪問?

    1. jsp頁面和HTML頁面一樣,都是存放在web目錄下,訪問也是一樣的方式

  4. jsp的本質

    1. jsp頁面是一個serlet程式

    2. 當我們第一次訪問jsp頁面的時候,Tomcat伺服器會把jsp頁面翻譯為一個jsbs原始檔,並且對它進行編譯稱為.class位元組碼程式

    3. 檢視原始碼可以發現有HttpJspBase類,這個類直接繼承了HttpServlet類。也就是說jsp翻譯出來的java類,間接繼承來HttpServlet類。也就是說所翻譯出來的是一個Servlet程式

    4. 總結:通過翻譯的java原始碼可以得出結論,jsp是一個Servlet程式

  5. jsp頭部的page指令

    1. jsp的page指令可以修改jsp頁面中的一些重要的屬性或行為

 

<%@ page contenType="text/html;charset=UTF-8" language="java" %>

 

  1. 屬性

    1. language屬性 表示jsp翻譯後的原始碼是什麼語言,目前只支援Java

    2. contentType屬性 表示jsp傳送的資料型別是什麼,也是原始碼中response.serContentType()引數值

    3. pageEncoding屬性 表示當前jsp頁面檔案本身的字符集

    4. import屬性 用來導包,或者導類

============================以下兩個屬性是給out輸出流使用==========================

  1. autoFlush屬性 設定當前out輸出流緩衝區滿了之後是否自動重新整理衝級區。預設值是true

  2. buffer屬性 表示out緩衝區的大小,預設是8kb

out緩衝區滿了之後不能自動重新整理就會報錯:java.io.IOException:Error:JSP Buffer overflow

============================……=========================

  1. errorPage屬性 設定當前jsp頁面出錯時,自動跳轉去的頁面(一般是提示出錯頁面)的路徑

    1. errorPage表示錯誤後自動跳轉的路徑。這個路徑通常是以“/”開頭,表示請求的地址是http://ip:port/工程路徑/。對映導程式碼的web目錄

  2. isErrorPage屬性 設定當前jsp頁面是否是錯誤資訊頁面,預設是false,如果是true可以獲取錯誤資訊

  3. session屬性 設定訪問當前jsp頁面是否會建立HttpSession物件,預設是true

  4. extends屬性 設定jsp翻譯出來的Java預設繼承誰(設定父類)

  1. jsp常用指令碼

  2. 宣告指令碼:<%! 宣告java程式碼 %>

    1. 基本不使用

    2. 作用:宣告指令碼可以給jsp翻譯出來的java類定義屬性和方法,甚至是靜態程式碼塊、內部類

  3.  

    <%--宣告指令碼練習1、宣告類屬性--%>
    <%!
        private Integer id;
        private String name;
        private  static Map<String, Object> map;
    %>
    

     

  4. 表示式指令碼:<%= 表示式 %>

    1. 常用

    2. 作用:表示式指令碼的作用是在jsp頁面上輸出資料

    3. 特點:

      1. 所有的表示式指令碼都會被翻譯到_jspService()輸出到頁面上

      2. 表示式指令碼都會被翻譯成為out.print()輸出到頁面上

      3. 由於表示式指令碼翻譯的內容都在_jspService()方法中,所以_jspService()方法中的物件都可以直接使用

      4. 表示式指令碼中的表示式不能以分號結束

  5.  

    <%--表示式指令碼練習1、輸出整型--%>
    <%= 12 %>
    

     

  6. 程式碼指令碼:<% Java語句 %>

    1. 作用:程式碼指令碼的作用是可以在jsp頁面編寫java語句實現想要的功能

    2. 特點:

      1. 程式碼指令碼翻譯之後都在_jspService方法中

      2. 程式碼指令碼由於翻譯到_jspService()方法中,所以在_jspService方法中現有的物件都可以直接使用

      3. 程式碼指令碼還可以由多個程式碼塊組合完成一個Java語句

      4. 程式碼指令碼可以和表示式指令碼一起組合使用,在jsp頁面上輸出資料

  7.  

    <%--程式碼指令碼練習1:if語句--%>
    <%
        int i = 12;
        if (i > 10) {
            System.out.println("大於10");
        } else {
            System.out.println("不大於10");
        }
    %>
    

     

  8. jsp的三種註釋

    1. html註釋

      1. <!-- 註釋 -->

      2. html註釋會被翻譯到Java程式碼中,在_jspService方法裡,以out.writer輸出到客戶端

    2. java註釋

      1. // 單行註釋

      2. /* 多行註釋 */

    3. jsp註釋

      1. <%--jsp註釋--%>

      2. jsp註釋的優先順序最高,可以把其他兩種註釋註釋掉

  9. jsp的9大內建物件

    1. request 請求物件

    2. response 響應物件

    3. pageContext jsp的上下文物件

    4. session 會話物件

    5. application ServletContext物件

    6. config ServletConfig物件

    7. out jsp輸出流物件

    8. page 指向當前jsp物件

    9. exception 異常物件

  10. jsp4大域物件

    1. 域物件是可以像Map一樣存取資料的物件,四個域物件功能一樣,不同的是它們對資料的採取範圍不一樣

    2. 4大域物件

      1. pageContext

        1. jsp的上下文物件

        2. PageContextImpl類

        3. 範圍:當前jsp頁面範圍內有效

      2. response

        1. 響應物件

        2. HttpServleRequest類

        3. 範圍:一次請求內有效

      3. session

        1. 會話物件

        2. HttpSession類

        3. 範圍:一次會話範圍內有效(瀏覽器從開啟到關閉是一次會話)

      4. application

        1. ServletContext物件

        2. ServletContext類

        3. 範圍:整個web工程範圍內有效

          (只要web工程不停止,資料都在)

        4. 往域中存值:

        5.  

          域物件.setAttribute("key", "value");
          

           

        6. 在域中取值

        7. 使用順序

          1. 雖然四個域物件都可以存取資料,但是在使用上它們是有優先順序的。

          2. 優先順序如下(從小到大):

          3. pageContext ==> response ==>session ==> application

            <body>
                <h1>scope.jsp頁面</h1>
                <%
                    // 往四個域中分別儲存資料
                    pageContext.setAttribute("key", "pageContext");
                    request.setAttribute("key", "request");
                    session.setAttribute("key", "session");
                    application.setAttribute("key", "application");
                %>
                pageContext域是否有值:<%= pageContext.getAttribute("key") %><br>
                request域是否有值:<%= request.getAttribute("key") %><br>
                session域是否有值:<%= session.getAttribute("key") %><br>
                application域是否有值:<%= application.getAttribute("key") %><br>
                <%
                    request.getRequestDispatcher("/scope2.jsp").forward(request, response);
                %>
            </body>
            

             

  11. jsp中的out輸出和response.getWriter輸出的區別

    1. response中表示響應,我們經常用於設定返回客戶端的內容(輸出)

    2. out也是給使用者做輸出使用的

    3. 當jsp頁面的所有程式碼執行完成後,會進行下面兩個操作

      1. 執行out.flush()操作,該操作會把out緩衝區的資料追加寫入到response緩衝區末尾

      2. 執行response的重新整理操作,把全部資料寫給客戶端

      3. <body>
            <%
                out.write("out輸出1<br/>");
                out.write("out輸出2<br/>");
                response.getWriter().write("response輸出1<br/>");
                response.getWriter().write("response輸出2<br/>");    %>
        </body>
        
        <body>
            <%
                out.write("out輸出1<br/>");
                out.flush();// 把out追加到response末尾(提前追加一次)
                out.write("out輸出2<br/>");
                response.getWriter().write("response輸出1<br/>");
                response.getWriter().write("response輸出2<br/>");    %>
        </body>
        

         

      4. 上面兩段程式碼的輸出結果如下

      5. 注意:由於jsp翻譯之後,底層原始碼都是使用out進行輸出。所以一般情況下,我們在jsp頁面統一使用out進行輸出,避免輸出順序被打亂

      6. out.write()輸出和out.print()輸出

        1. out.write()只能用來輸出字串

        2. out.print()可以用來輸出任意型別的資料(會把資料轉換為字串再呼叫out.write()輸出)

        3. 注意:深入原始碼,淺出結論:在jsp頁面中,可以統一使用out.print()來進行輸出

      7. 靜態包含

        1. 靜態包含的特點:

          1. 靜態包含不會翻譯被包含的jsp頁面

          2. 靜態包含其實是把包含的jsp頁面的程式碼拷貝到包含的位置執行輸出

        2. 語法:

          1. file屬性指定你要包含的jsp

            頁面的路徑

          2. 地址中的第一個"/"表示為"http://ip:port/工程路徑/"對映到程式碼的web目錄

            <%@include file="..."%>
            
            
            <body>
                頭部資訊<br>
                主體內容<br>
                <%@include file="/include/footer.jsp"%>
            </body>
            

            0

  12. 多型包含

    1. 多型包含可以像靜態包含一樣,把被包含的內容輸出到包含的位置

    2. 特點:

      JspRuntimeLibrary.include(request,response,"/include/footer.jsp", out,false)
      
      1. 多型包含會把包含的jsp頁面也翻譯成為java程式碼(個人理解是:先執行翻譯的Java程式碼,再把執行結果顯示在網頁上)

      2. 動態包含底層程式碼如下,使用該程式碼去呼叫被包含的jsp頁面執行輸出

    3. 動態包含可以傳遞引數

    4. 語法:
      1. page屬性是指定你要包含的jsp頁面的路徑
        <jsp:include page="..."></jsp:include>    <!--或-->
        <jsp:include page="..."><jsp:param name="..." value="..."/></jsp:include>
        

         

  13. 請求轉發

    1. 語法

      1. page屬性設定請求轉發的路徑

  14. <jsp:forward page="..."></jsp:forward>
    
    <jsp:forward page="/scope2.jsp"></jsp:forward>
    

    Listener監聽器

    1. Listener監聽器是JavaWeb的三大元件之一(三大元件分別是:Servlet程式,Filter過濾器,Listener監聽器)

    2. Listener它是javaEE的規範,也就是介面

    3. 作用:

      1. 監聽某事物的變化,然後通過回撥函式(也就是程式)反饋給客戶去進行一些對應的操作

    4. ServletContextListener監聽器

      1. ServletContextListener監聽器可以監聽ServletContext物件的建立和銷燬

      2. ServletContext物件在web工程啟動的時候建立,在web工程結束的時候銷燬。監聽到建立和銷燬之後會分別呼叫ServletContextListener監聽器的方法反饋

    5. 兩個方法

      public interface ServletContextListener extends EventListener {
          // 在servletContext物件建立之後馬上呼叫,做初始化
          public void contextInitialized(ServletContextEvent sce);
          // 在ServletContext物件銷燬之後呼叫
          public void contextDestroyed(ServletContextEvent sce);
      }
      

       

    6. 如何使用servletContextListener監聽器的servletContext物件
      1. 使用步驟:

        1. 編寫一個類去實現servletContextListener

        2. 實現其兩個方法(contextInitialized、contextDestroyed)

        3. 到web.xml中配置監聽器

      2. 展示:

        1. 編寫一個MyServletContextListenerImp1類實現介面及兩個方法
public class MyServletContextListenerImp1 implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext物件被建立");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext物件被銷燬");
    }
}
<!--    配置監聽器-->
    <listener>
        <listener-class>com.atguigu.listener.MyServletContextListenerImp1</listener-class>
    </listener>

相關文章