標籤:
一.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