1. 程式人生 > >JSP學習心得-程式設計師技術淺談

JSP學習心得-程式設計師技術淺談

下面是本人在學習JSP時的一些心得,特此奉獻出來以供大家分享。 
一、JSP工作原理 
在一個JSP檔案第一次被請求時,JSP引擎把該JSP檔案轉換成為一個servlet。而這個引擎本身也是一個servlet,在JSWDK或WEBLOGIC中,它就是JspServlet。 JSP引擎先把該JSP檔案轉換成一個Java原始檔,在轉換時如果發現jsp檔案有任何語法錯誤,轉換過程將中斷,並向服務端和客戶端輸出出錯資訊;如果轉換成功, JSP引擎用javac把該Java原始檔編譯成相應的class檔案。然後建立一個該SERVLET的例項,該SERVLET的jspInit()方法被執行,jspInit()方法在servlet的生命週期中只被執行一次。然後jspService()方法被呼叫來處理客戶端的請求。對每一個請求,JSP引擎建立一個新的執行緒來處理該請求。如果有多個客戶端同時請求該JSP檔案,則JSP引擎會建立多個執行緒。每個客戶端請求對應一個執行緒。以多執行緒方式執行可大大降低對系統的資源需求,提高系統的併發量及響應時間.但應該注意多執行緒的程式設計限制,由於該servlet始終駐於記憶體,所以響應是非常快的。 如果.jsp檔案被修改了,伺服器將根據設定決定是否對該檔案重新編譯,如果需要重新編譯,則將編譯結果取代記憶體中的servlet,並繼續上述處理過程。 雖然JSP效率很高,但在第一次呼叫時由於需要轉換和編譯而有一些輕微的延遲。 此外,如果在任何時候如果由於系統資源不足的原因,JSP引擎將以某種不確定的方式將servlet從記憶體中移去。當這種情況發生時jspDestroy()方法首先被呼叫, 然後servlet例項便被標記加入“垃圾收集”處理。 jspInit()及jspDestory()格式如下:可在jspInit()中進行一些初始化工作,如建立與資料庫的連線,或建立網路連線,從配置檔案中取一些引數等,在jspDestory()中釋放相應的資源。 
<%! 
public void jspInit() 

System.out.println("jspinit");  

 
%> 
 
<%! 
public void jspDestory() 

System.out.println("jspDestory");  

%> 
二、服務端的輸出緩衝區 
預設情況下:服務端要輸出到客戶端的內容,不直接寫到客戶端,而是先寫到一個輸出緩衝區中.只有在下面三中情況下,才會把該緩衝區的內容輸出到客戶端上: 
1.該JSP網頁已完成資訊的輸出 
2.輸出緩衝區已滿 
3.JSP中呼叫了out.flush()或response.flushbuffer() 
 
輸出緩衝區的大小可以用:<%@page buffer="none"|"nkb"%>或response.setBufferSize()設定,如下: 
1、設定輸出緩衝區的大小為1KB。<%@page buffer="1kb"%>或response.setBufferSize(1); 
2、設定輸出緩衝區的大小為0,即不緩衝。<%@page buffer="none" %>或response.setBufferSize(0); 
 
用response.getBufferSize()或out.getBufferSize()可取的輸出緩衝區的大小,單位為位元組. 
用response.isCommitted()可檢檢視服務端是否已將資料輸出到客戶端. 如果返回值是TRUE則已將資料輸出到客戶端,是FALSE則還沒有。 


三、服務端輸出重定向 
有以下3種方法可以做到輸出重定向: 
(1) RESPONSE.SETREDERECT("URL") 
該方法通過修改HTTP協議的HEADER部分,對瀏覽器下達重定向指令的,使瀏覽器顯示重定向網頁的內容. 
response.sendRedirect("http://localhost:7001/index.html"); 
(2)下面的方法也能改變HTTP HEADER屬性,它的原理和(1)是一樣的. 
<% 
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
String newLocn="/index.html"; 
response.setHeader("Location",newLocn); 
%>  
(3)採用 
該方法是利用伺服器端先將資料輸出到緩衝區的機制,在把緩衝區的內容傳送到客戶端之前,原來的不傳送,改為傳送該頁面的內容,如果在之前有很多輸出,前面的輸出已使緩衝區滿,將自動輸出到客戶端,那麼該語句將不起作用,這一點應該特別注意. 
如下面的例子中(1)會輸出index.html的內容,(2)不會輸出index.html的內容,而是輸出out.println("@@@@@@@@@@@@@@@@@"); 
中的內容,並且在服務端會丟擲:java.lang.IllegalStateException: Response already committed 異常,但客戶端沒有任何錯誤輸出。 
(1) 
<%@page buffer="1kb"%> 
 
<% 
long i=0; 
 
for(i=0;i<10;i++) 

out.println("@@@@@@@@@@@@@@@@@"); 

%> 
 

%> 
 
說明: 
1. 方法(1),(2)可以使用變量表示重定向的地址;方法(3)不能使用變量表示重定向的地址。 
String add="./index.html"; 
 
無法重定向到index.html中去 
 
String add=http://localhost:7001/index.html 
response.sendRedirect(add); 
可以重定向到http://localhost:7001/index.html中去。