JavaWeb(六)JSP-1

來源:互聯網
上載者:User

標籤:lcx   awr   運算   引用   override   解釋   gem   過程   tps   

1、JSP起源

(1)在很多動態網頁中,絕大部分內容都是固定不變的,只有局部內容需要動態產生和改變。

(2)如果使用Servlet程式來輸出只有局部內容需要動態改變的網頁,其中所有的靜態內容也需要程式員用Java程式碼產生,整個Servlet程式的代碼將非常臃腫,編寫和維護都將非常困難。 

(3)對大量靜態內容的美工設計和相關HTML語句的編寫,並不是程式員所要做的工作,程式員對此也不一定在行。網頁美工設計和製作人員不懂Java編程,更是無法來完成這樣的工作。

(4)為了彌補 Servlet 的缺陷,SUN公司在Servlet的基礎上推出了JSP(Java Server Pages)技術作為解決方案。

(5)JSP是簡化Servlet編寫的一種技術,它將Java代碼和HTML語句混合在同一個檔案中編寫,只對網頁中的要動態產生的內容採用Java代碼來編寫,而對固定不變的靜態內容採用普通靜態HTML頁面的方式編寫。

2、建立對JSP的直觀認識

(1)JSP頁面是由HTML語句和嵌套在其中的Java程式碼群組成的一個普通文字檔,JSP 頁面的副檔名必須為.jsp。

(2)在JSP頁面中編寫的Java代碼需要嵌套在<%和%>中,嵌套在<%和%>之間的Java代碼被稱之為指令碼片段(Scriptlets),沒有嵌套在<%和%>之間的內容被稱之為JSP的模版元素。

(3)JSP中的Java代碼可以使用out.println語句將其他Java程式碼產生的結果字串輸出給用戶端,也可以使用System.out.println語句將它們列印到命令列視窗。

(4)JSP檔案就像普通的HTML檔案一樣,它們可以放置在WEB應用程式中的除了WEB-INF及其子目錄外的其他任何目錄中,JSP頁面的訪問路徑與普通HTML頁面的訪問路徑形式也完全一樣。

(5)在JSP頁面中也可以使用一種稱之為JSP運算式的元素,只需將要輸出的變數或運算式直接封裝在<%= 和 %>之中,就可以向用戶端輸出這個變數或運算式的運算結果。在JSP運算式中嵌套的變數或運算式後面不能有分號。

3、JSP的運行原理

(1)WEB容器(Servlet引擎)接收到以.jsp為副檔名的URL的訪問請求時,它將把該訪問請求交給JSP引擎去處理。

(2)每個JSP 頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet來源程式,接著再把這個Servlet來源程式編譯成Servlet的class類檔案,然後再由WEB容器(Servlet引擎)像調用普通Servlet程式一樣的方式來裝載和解釋執行這個由JSP頁面翻譯成的Servlet程式。

(3)JSP規範也沒有明確要求JSP中的指令碼程式碼必須採用Java語言,JSP中的指令碼程式碼可以採用Java語言之外的其他指令碼語言來編寫,但是,JSP頁面最終必須轉換成Java Servlet程式。

(4)可以在WEB應用程式正式發布之前,將其中的所有JSP頁面預先編譯成Servlet程式。

4、執行個體

(1)建立一個hello.jsp


 

(2)編譯成Servlet程式


 

(3)查看hello_jsp.java


 
 
 

(4)在eclipse按Ctrl+T查看HttpJspBase類,從該類可以看出,它也繼承了HttpServlet

public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {    private static final long serialVersionUID = 1L;        protected HttpJspBase() {    }        @Override    public final void init(ServletConfig config)   throws ServletException    {        super.init(config);        jspInit();        _jspInit();    }    @Override    public String getServletInfo() {        return Localizer.getMessage("jsp.engine.info");    }    @Override    public final void destroy() {        jspDestroy();        _jspDestroy();    }    @Override    public final void service(HttpServletRequest request, HttpServletResponse response)        throws ServletException, IOException    {        _jspService(request, response);    }    @Override    public void jspInit() {    }    public void _jspInit() {    }    @Override    public void jspDestroy() {    }    protected void _jspDestroy() {    }    @Override    public abstract void _jspService(HttpServletRequest request, HttpServletResponse response)        throws ServletException, IOException;}
?5、JSP隱式對象
 

JSP 頁面的隱含變數:沒有聲明就可以使用的對象.,JSP頁面一共有 9 個隱含對象。

使用 <% %> 編寫的代碼在此位置,可以用到 request,response, pageContext,session,application,config,out,page 這 8 個隱含對象。 (實際上還可以使用一個叫 exception 的隱含對象)

①. request: HttpServletRequest 的一個對象。

②. response: HttpServletResponse 的一個對象(在 JSP 頁面中幾乎不會調用 response 的任何方法.)

③. pageContext: 頁面的上下文, 是 PageContext 的一個對象. 可以從該對象中擷取到其他 8 個隱含對象. 也可以從中擷取到當前頁面的其他資訊. (學習自訂標籤時使用它) 

④. session: 代表瀏覽器和伺服器的一次會話, 是 HttpSession 的一個對象. 後面詳細學習. 

⑤. application: 代表當前 WEB 應用. 是 ServletContext 對象. 

⑥. config: 當前 JSP 對應的 Servlet 的 ServletConfig 對象(幾乎不使用). 若需要訪問當前 JSP 配置的初始化參數, 需要通過映射的地址才可以.映射JSP

⑦. out: JspWriter 對象. 調用 out.println() 可以直接把字串列印到瀏覽器上. 

⑧. page: 指向當前 JSP 對應的 Servlet 對象的引用, 但為 Object 類型, 只能調用 Object 類的方法(幾乎不使用) 

⑨. exception: 在聲明了 page 指令的 isErrorPage="true" 時, 才可以使用. *<%@ page isErrorPage="true" %>


 
 
 6、JSP與Servlet的應用比較

(1)JSP是一種以產生網頁顯示內容為中心的WEB開發技術,它可以直接使用模版元素來產生網頁文檔的內容。

(2)JSP頁面的源檔案要比Servlet源檔案簡單,並且JSP頁面的開發過程要比Servlet的開發過程簡單得多。

(3)JSP引擎可以對JSP頁面的修改進行檢測,並自動重新翻譯和編譯修改過的JSP檔案。

(4)JSP技術是建立在Servlet技術基礎之上的,所有的JSP頁面最終都要被轉換成Servlet來運行。

(4)在大型WEB應用程式的開發中,Servlet與JSP經常要混合使用,各司其職,Servlet通常用作控制組件,並處理一些複雜的後台業務,JSP則作為顯示組件。

(5)一次響應過程可以劃分成幾個功能模組來協同完成,首先由Servlet完成流程式控制制和業務處理,並將結果資料存放區在request或session域中,然後將請求轉寄(forward)到JSP頁面,再由JSP頁面從request或session域中取出結果資料並完成響應內容的輸出。通過這種方式實現商務邏輯與顯示內容的分離,從而將應用程式開發人員和網頁作者的工作分離。

7、JSP基本文法7.1、JSP模版元素

(1)JSP頁面中的靜態HTML內容稱之為JSP模版元素,在靜態HTML內容之中可以嵌套JSP的其他各種元素來產生動態內容和執行商務邏輯。

(2)JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。

7.2、JSP運算式

JSP運算式(expression)提供了將一個java變數或運算式的計算結果輸出到用戶端的簡化方式,它將要輸出的變數或運算式直接封裝在<%= 和 %>之中。

舉例:Current time: <%= new java.util.Date() %>

(1)JSP運算式中的變數或運算式的計算結果將被轉換成一個字串,然後被插入進整個JSP頁面輸出結果的相應位置處。

(2)JSP運算式中的變數或運算式後面不能有分號(;),JSP運算式被翻譯成Servlet程式中的一條out.print(…)語句。

7.3、JSP指令碼片斷

(1)JSP指令碼片斷(scriptlet)是指嵌套在<% 和 %>之中的一條或多條Java程式碼。

(2)在JSP指令碼片斷中,可以定義變數、執行基本的程式運算、調用其他Java類、訪問資料庫、訪問檔案系統等普通Java程式所能實現的功能。

(3)在JSP指令碼片斷可以直接使用JSP提供的隱式對象來完成WEB應用程式特有的功能。

(4)JSP指令碼片斷中的Java代碼將被原封不動地搬移進由JSP頁面所翻譯成的Servlet的_jspService方法中,所以,JSP指令碼片斷之中只能是符合Java文法要求的程式碼,除此之外的任何文本、HTML標記、其他JSP元素都必須在指令碼片斷之外編寫。

(5)JSP指令碼片斷中的Java代碼必須嚴格遵循Java文法,例如,每條命令執行語句後面必須用分號(;)結束。

(6)在一個JSP頁面中可以有多個指令碼片斷(每個指令碼片斷代碼嵌套在各自獨立的一對<% 和 %>之間),在兩個或多個指令碼片斷之間可以嵌入文本、HTML標記和其他JSP元素,多個指令碼片斷中的代碼可以相互訪問。

(7)單個指令碼片斷中的Java語句可以是不完整的,但是,多個指令碼片斷組合後的結果必須是完整的Java語句。


 7.4、JSP聲明

(1)JSP聲明將Java代碼封裝在<%!和 %>之中,它裡面的代碼將被插入進Servlet的_jspService方法的外面,所以,JSP聲明可用於定義JSP頁面轉換成的Servlet程式的靜態代碼塊、成員變數和方法 。

(2)多個靜態代碼塊、變數和函數可以定義在一個JSP聲明中,也可以分別單獨定義在多個JSP聲明中。

(3)JSP隱式對象的作用範圍僅限於Servlet的_jspService方法,所以在JSP聲明中不能使用這些隱式對象。


 7.5、JSP注釋

<%-- JSP 注釋 --%>

區別: JSP 注釋可以阻止 Java 代碼的執行,而HTML注釋不可以.


 8、和屬性相關的方法

1). 方法

void setAttribute(String name, Object o): 設定屬性 

Object getAttribute(String name): 擷取指定的屬性

Enumeration getAttributeNames(): 擷取所有的屬性的名字組成的 Enumeration 對象

removeAttribute(String name): 移除指定的屬性

2). pageContext, request, session, application 對象都有這些方法!

這四個對象也稱之為域對象.

pageContext: 屬性的作用範圍僅限於當前 JSP 頁面

request:  屬性的作用範圍僅限於同一個請求.

session: 屬性的作用範圍限於一次會話: 瀏覽器開啟直到關閉稱之為一次會話(在此期間會話不失效)

application: 屬性的作用範圍限於當前 WEB 應用. 是範圍最大的屬性作用範圍, 只要在一處設定屬性, 在其他各處的 JSP 或 Servlet 中都可以擷取到.

attr_1.jsp


 

attr2.jsp


 
 
 

關閉瀏覽器後,再次訪問attr_2.jsp,session的屬性值消失


 9、請求的轉寄和重新導向9.1、RequestDispatcher介面

(1)RequestDispatcher執行個體對象是由Servlet引擎建立的,它用於封裝一個要被其他資源調用的資源(例如,Servlet、HTML檔案、JSP檔案等),並可以通過其中的方法將用戶端的請求轉寄給所封裝的資源。

(2)RequestDispatcher介面中定義了兩個方法:forward方法和include方法。

(3)forward和include方法接收的兩個參數必須是傳遞給當前Servlet的service方法的那兩個ServletRequest和ServletResponse對象,或者是對它們進行了封裝的ServletRequestWrapper 或ServletResponseWrapper對象。

(4)擷取RequestDispatcher對象的方法:

ServletContext.getRequestDispatcher (參數只能是以“/”開頭的路徑)

ServletContext.getNamedDispatcher

ServletRequest.getRequestDispatcher (參數可以是不以“/”開頭的路徑)

9.2、用sendRedirect方法實現請求重新導向

(1)sendRedirect 方法不僅可以重新導向到當前應用程式中的其他資源,它還可以重新導向到同一個網站上的其他應用程式中的資源,甚至是使用絕對URL重新導向到其他網站的資源。

(2)如果傳遞給sendRedirect 方法的相對URL以“/”開頭,則是相對於整個WEB網站的根目錄,而不是相對於當前WEB應用程式的根目錄。

9.3、請求重新導向與請求轉寄的比較

(1)RequestDispatcher.forward方法只能將請求轉寄給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還可以重新導向到同一個網站上的其他應用程式中的資源,甚至是使用絕對URL重新導向到其他網站的資源。

(2)如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對於整個WEB網站的根目錄;如果建立RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對於當前WEB應用程式的根目錄。

(3)調用HttpServletResponse.sendRedirect方法重新導向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重新導向的目標URL;調用RequestDispatcher.forward 方法的請求轉寄過程結束後,瀏覽器地址欄保持初始的URL地址不變。

(4)HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在伺服器端內部將請求轉寄給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在伺服器程式內部發生了轉寄行為。

(5)RequestDispatcher.forward方法的調用者與被調用者之間共用相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。

樣本:


 
 
 
 
 
 
 

樣本2:

 


 
 
 

 


 
 
 
 

本質區別: 請求的轉寄只發出了一次請求, 而重新導向則發出了兩次請求.

 

JavaWeb(六)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.