JSP基礎知識_1

來源:互聯網
上載者:User

標籤:

一.JSP簡介

  JSP是簡化Servlet編寫的一種技術,它將Java代碼和HTML語句混合在同一個檔案中編寫,只對網頁中的要
  動態產生的內容採用Java代碼來編寫,而對固定不變的靜態內容採用普通靜態HTML頁面的方式編寫
 JSP 頁面的副檔名必須為.jsp 
 在JSP頁面中編寫的Java代碼需要嵌套在<%和%>中,嵌套在<%和%>之間的Java代碼被稱之為指令碼片段(Scriptlets),
 沒有嵌套在<%和%>之間的內容被稱之為JSP的模版元素
 JSP中的Java代碼可以使用out.println語句將其他Java程式碼產生的結果字串輸出給用戶端,也可以使用
 System.out.println語句將它們列印到命令列視窗。
 在JSP頁面中也可以使用一種稱之為JSP運算式的元素,只需將要輸出的變數或運算式直接封裝在<%= 和 %>之中,
 就可以向用戶端輸出這個變數或運算式的運算結果。在JSP運算式中嵌套的變數或運算式後面不能有分號。

二.JSP運行原理
 •WEB容器(Servlet引擎)接收到以.jsp為副檔名的URL的訪問請求時,它將把該訪問請求交給JSP引擎去處理。
 •每個JSP 頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet來源程式,接著再把這個Servlet來源程式編譯成Servlet
   的class類檔案,然後再  由WEB容器(Servlet引擎)像調用普通Servlet程式一樣的方式來裝載和解釋執行這個由JSP
   頁面翻譯成的Servlet程式。•JSP規範也沒有明確要求JSP中的指令碼程式碼必須採用Java語言,JSP中的指令碼程式碼可以採用Java語言之外的其他
  指令碼語言來編寫,但是,JSP頁面最終必須轉換成Java Servlet程式。•可以在WEB應用程式正式發布之前,將其中的所有JSP頁面預先編譯成Servlet程式。
從上得出:JSP本質上是一個Servlet,看原始碼更能理解
   若項目發布在tomcat中,可以到tomcat的work檔案-->Catalina-->localhost-->項目名-->jsp-->org
   -->apache-->jsp下找到jspname_jsp.java和jspname_jsp.class

 

Jsp與Servlet的關係

      1、 JSP檔案必須在JSP伺服器內運行。

      2、 JSP檔案必鬚生成Servlet才能執行。

      3、 每個JSP頁面的第一個訪問者速度很慢,因為必須等待JSP編譯成Servlet。

      4、 JSP頁面的訪問者無須安裝任何用戶端,甚至不需要可以運行Java的運行環境,因為JSP頁面輸送到用戶端的是標準HTML頁面。

      5、 JSP頁面的靜態內容、JSP指令碼都會轉換成Servlet的xxxService()方法,類似於自行建立Servlet時service()方法。

      6、 JSP聲明部分,轉換成Servlet的成員部分。所有JSP聲明部分可以使用private,protected,public,static等修飾符,其他地方則不行。

      7、 JSP的輸出運算式(<%= ..%>部分),輸出運算式會轉換成Servlet的xxxService()方法裡的輸出語句。

      8、 九個內建對象要麼是xxxService()方法的形參,要麼是該方法的局部變數,所以九個內建對象只能在JSP指令碼和輸出運算式中使用。

 

三.JSP九個內建對象

在以下每個jspname_jsp.java中_jspService方法中聲明這九個內建對象,所以JSP頁面才能在不聲明該對象的情況下在<% %>中使用他們

 1 public void _jspService(HttpServletRequest request, HttpServletResponse response) 2         throws java.io.IOException, ServletException { 3  4       PageContext pageContext = null;//頁面上下文,很重要,可以擷取頁面的一切資訊,可以擷取其他八個隱藏對象 5      HttpSession session = null;//代表瀏覽器和伺服器的一次會話 6      ServletContext application = null;//代表當前web應用,能擷取web應用的初始化參數 7      ServletConfig config = null;//代表當前JSP對應的servlet的對象,幾乎不使用,因為需要為該JSP配置初始化參數 8      JspWriter out = null;//JspWriter對象,常調用out.println()方法,將字串列印到瀏覽器,eg out.println("<br/>")換行 9      Object page = this;//指向當前JSP對應的Servlet對象的應用,但為Object類型,只能調用Object的方法,幾乎不用10     JspWriter _jspx_out = null;11     PageContext _jspx_page_context = null;12 13    ... ...14     Throwable exception =15     org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);16    if (exception != null) {17     response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);18      //exception只有在聲明了page指令的isErrorPage=true時,才能使用,如下聲明:19      //在JSP檔案首部聲明<% page isErrorPage="true" %>20 }
上面九個內建對象中,以下4個稱為域對象
   pageContext,request,session,application,他們都有以下屬性相關方法:
   1.Object getAttribute(String name):擷取指定的屬性
   2.Enumeration getAttributeNames():擷取所有的屬性的名稱組成的Enumeration
   3.removeAttribute(String name):移除指定的屬性
   4.void setAttribute(String name,Object o):設定屬性   它們的範圍範圍如下:
   pageContext:屬性的作用範圍僅限於當前JSP頁面
   request:屬性的作用範圍僅限於同一個請求
   session:屬性的作用範圍僅限於同一次會話,即瀏覽器從開啟到關閉稱為一次會話(在此期間會話不失效)
  application:屬性的作用範圍限於當前web應用,最大的屬性作用範圍,只要在一處設定訪問,在各個JSP或Servlet中都可以擷取到
  四.JSP與Servlet的應用比較
     •JSP是一種以產生網頁顯示內容為中心的WEB開發技術,它可以直接使用模版元素來產生網頁文檔的內容。
    •JSP頁面的源檔案要比Servlet源檔案簡單,並且JSP頁面的開發過程要比Servlet的開發過程簡單得多。
    •JSP引擎可以對JSP頁面的修改進行檢測,並自動重新翻譯和編譯修改過的JSP檔案。
    •JSP技術是建立在Servlet技術基礎之上的,所有的JSP頁面最終都要被轉換成Servlet來運行。
    •在大型WEB應用程式的開發中,Servlet與JSP經常要混合使用,各司其職,Servlet通常用作控制組件,並處理
     一些複雜的後台業務,JSP則作為顯示組件。    •一次響應過程可以劃分成幾個功能模組來協同完成,首先由Servlet完成流程式控制制和業務處理,並將結果資料存放區
     在request或session域中,然後將請求轉寄(forward)到JSP頁面,再由JSP頁面從request或session域中取出結
     果資料並完成響應內容的輸出。通過這種方式實現商務邏輯與顯示內容的分離,從而將應用程式開發人員和網頁作者的
     工作分離。

五.請求的轉寄與重新導向    1)請求轉寄       Servlet請求轉寄實現過程:   
1 public void doGet(HttpServletRequest request, HttpServletResponse response)2             throws ServletException, IOException {3 4         System.out.println("forwardServlet doGet");5         //1.在doXxx()中調用HttpServletRequest的getRequestDispatcher(String path),並傳入轉寄地址6         RequestDispatcher requestDispatcher=request.getRequestDispatcher("testServlet");7         //2.調用HttpServletRequest的forward(request,response),進行請求轉寄8         requestDispatcher.forward(request, response);9     }

     JSP請求轉寄實現:

      同理 

1 <body>2     <%3       //請求轉寄4      request.getRequestDispatcher("/jsp_result.jsp").forward(request, response);5     %>6 </body>

 

    2)重新導向      Servlet重新導向實現過程:
1 public void doGet(HttpServletRequest request, HttpServletResponse response)2             throws ServletException, IOException {3 4         System.out.println("RedirectServlet doGet");5         //在doXxx()中執行請求的重新導向,直接調用response.sendRedirect(String path),並傳入要重新導向的地址6         response.sendRedirect("testServlet");7     }
      JSP重新導向實現過程:     
1 <body>2     <%3        //重新導向4        response.sendRedirect("jsp_result.jsp");5     %>6  </body>
    3)兩者的區別

  本質區別是:請求轉寄只發送一次請求,而重新導向則發送兩次請求
  具體如下
  (1)轉寄:地址欄的請求地址是初次發出請求的地址
    重新導向:地址欄的請求地址顯示為最後重新導向的地址
  (2)轉寄:在最終的Servlet中,request對象和中轉的那個request是同一個對象
    重新導向:在最終的Servlet中,request對象和中轉的那個request不是同一個對象
  (3)轉寄:只能轉寄給當前web應用的資源
    重新導向:可以重新導向到任何資源
  (4)轉寄:path中/ 代表當前web應用的根目錄
    重新導向:path中/ 代表當前web網站的根目錄

JSP基礎知識_1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.