JSP知識點彙總

 -------------------  JSP  Java Server Pages  -----------------
JSP全稱是Java Server Pages,它和servle技術一樣,都是SUN公司定義的一種用於開發動態web資源的技術。

JSP這門技術的最大的特點在於,寫jsp就像在寫html,但:
它相比html而言,html只能爲用戶提供靜態數據,而Jsp技術允許在頁面中嵌套java代碼,爲用戶提供動態數據。
相比servlet而言,servlet很難對數據進行排版,而jsp除了可以用java代碼產生動態數據的同時,也很容易對數
據進行排版。

Jsp快速入門:在jsp頁面中輸出當前時間。
把英文版myeclipse 8.6中jsp默認編碼格式改爲pageEncoding="utf-8"
windows -- > Preferences -- > MyEclipse -- > Files and Editors -- > JSP
然後右邊選擇Encoding爲 ISO 10646/Unicode(UTF-8)

JSP最佳實踐
不管是JSP還是Servlet,雖然都可以用於開發動態web資源。但由於這2門技術各自的特點,在長
期的軟件實踐中,人們逐漸把servlet作爲web應用中的控制器組件來使用,而把JSP技術作爲數
據顯示模板來使用。

其原因爲,程序的數據通常要美化後再輸出:
讓jsp既用java代碼產生動態數據,又做美化會導致頁面難以維護。
讓servlet既產生數據,又在裏面嵌套html代碼美化數據,同樣也會導致程序可讀性差,難以維護。
因此最好的辦法就是根據這兩門技術的特點,讓它們各自負責各的,servlet只負責響應請求產生數據,
並把數據通過轉發技術帶給jsp,數據的顯示jsp來做。

------------------------------------


JSP模版元素
JSP頁面中的HTML內容稱之爲JSP模版元素。 
JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。
修改JSP模板:
G:\MyEclipse\plugins\com.genuitec.eclipse.wizards_11.5.0.me201310291746.jar\templates
\jsp - ZIP 壓縮文件, 解包大小爲 392,388 字節 的jsp.vtl文件可以修改模板

1JSP原理
目標:
Web服務器是如何調用並執行一個jsp頁面的?
Jsp頁面中的html排版標籤是如何被髮送到客戶端的?
Jsp頁面中的java代碼服務器是如何執行的?
Web服務器在調用jsp時,會給jsp提供一些什麼java對象?

2思考:JSP爲什麼可以像servlet一樣,也可以叫做動態web資源的開發技術?


3JSP語法
JSP模版元素 
JSP表達式 
JSP腳本片斷 
JSP註釋
JSP指令
JSP標籤 
JSP內置對象
如何查找JSP頁面中的錯誤


4Tip: JSP模版元素
JSP頁面中的HTML內容稱之爲JSP模版元素。 
JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。


5Tip: JSP腳本表達式
JSP腳本表達式(expression)用於將程序數據輸出到客戶端
語法:<%= 變量或表達式 %>
舉例:當前時間:<%= new java.util.Date() %> 
JSP引擎在翻譯腳本表達式時,會將程序數據轉成字符串,然後在相應位置用out.print(…) 將數據輸給客戶端。
JSP腳本表達式中的變量或表達式後面不能有分號(;)。


6Tip: JSP腳本片斷(1)
JSP腳本片斷(scriptlet)用於在JSP頁面中編寫多行Java代碼。語法:
<% 
多行java代碼 
%> 

注意:JSP腳本片斷中只能出現java代碼,不能出現其它模板元素, JSP引擎在翻譯JSP頁面中,會將JSP腳本
片斷中的Java代碼將被原封不動地放到Servlet的_jspService方法中。 
JSP腳本片斷中的Java代碼必須嚴格遵循Java語法,例如,每執行語句後面必須用分號(;)結束。
在一個JSP頁面中可以有多個腳本片斷,在兩個或多個腳本片斷之間可以嵌入文本、HTML標記和其他JSP元素。

舉例:
<%
int x = 10;
out.println(x);
%>
<p>這是JSP頁面文本</p>
<%
int y = 20;
out.println(y);
%>

多個腳本片斷中的代碼可以相互訪問,猶如將所有的代碼放在一對<%%>之中的情況。如:out.println(x);
單個腳本片斷中的Java語句可以是不完整的,但是,多個腳本片斷組合後的結果必須是完整的Java語句,例如:
<%
for (int i=1; i<5; i++) 
{
%>

<H1>www.it315.org</H1>

<%
}
%>


7Tip: JSP聲明
JSP頁面中編寫的所有代碼,默認會翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯
到_jspService方法的外面。語法:
<%! 
java代碼
%>
所以,JSP聲明可用於定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和方法 。 

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

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


JSP聲明案例
<%!
static 
System.out.println("loading Servlet!"); 
}
private int globalVar = 0;
public void jspInit()
{
System.out.println("initializing jsp!");
}
%>
<%!
public void jspDestroy()
{
System.out.println("destroying jsp!");
}
%>



9Tip: JSP註釋
JSP註釋的格式:
<%-- 註釋信息 --%>
JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被註釋的內容。

--------------------------------------------
10Tip: JSP指令
JSP指令(directive)是爲JSP引擎而設計的,它們並不直接產生任何可見輸出,
而只是告訴引擎如何處理JSP頁面中的其餘部分。在JSP 2.0規範中共定義了三個指令:
page指令
Include指令
taglib指令


11Tip: JSP指令簡介
JSP指令的基本語法格式:
<%@ 指令 屬性名="值" %>
舉例:<%@ page contentType="text/html;charset=gb2312"%>
如果一個指令有多個屬性,這多個屬性可以寫在一個指令中,也可以分開寫。
例如:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
也可以寫作:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>


12Tip: Page指令
page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什麼地方,它作用的都是整個JSP頁面,
爲了保持程序的可讀性和遵循良好的編程習慣,page指令最好是放在整個JSP頁面的起始位置。

JSP 2.0規範中定義的page指令的完整語法:
<%@ page 
[ language="java" ] 
[ extends="package.class" ] 
[ import="{package.class | package.*}, ..." ] 
[ session="true | false" ] 
[ buffer="none | 8kb | sizekb" ] 
[ autoFlush="true | false" ] 
[ isThreadSafe="true | false" ] 
[ info="text" ] 
[ errorPage="relative_url" ]   出現錯誤會執行一個url,或者說執行一個錯誤頁面的jsp
[ isErrorPage="true | false" ] 說明該jsp是否爲錯誤頁面的jsp
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 
[ pageEncoding="characterSet | ISO-8859-1" ] 
[ isELIgnored="true | false" ] 
%>

JSP 引擎自動導入下面的包:
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*

錯誤頁面處理:
errorPage屬性的設置值必須使用相對路徑,如果以“/”開頭,表示相對於當前WEB應用程序的根目錄
(注意不是站點根目錄),否則,表示相對於當前頁面。
可以在web.xml文件中使用<error-page>元素爲整個WEB應用程序設置錯誤處理頁面,其中的<except
ion-type>子元素指定異常類的完全限定名,<location>元素指定以“/”開頭的錯誤處理頁面的路徑。

如果設置了某個JSP頁面的errorPage屬性,那麼在web.xml文件中設置的錯誤處理將不對該頁面起作用。

JSP引擎會根據page指令的contentType屬性生成相應的調用ServletResponse.setContentType方法的語句。
page指令的contentType屬性還具有說明JSP源文件的字符編碼的作用。

13Tip:使用page指令解決JSP中文亂碼
JSP程序存在有與Servlet程序完全相同的中文亂碼問題
輸出響應正文時出現的中文亂碼問題 
讀取瀏覽器傳遞的參數信息時出現的中文亂碼問題
JSP引擎將JSP頁面翻譯成Servlet源文件時也可能導致中文亂碼問題 

JSP引擎將JSP源文件翻譯成的Servlet源文件默認採用UTF-8編碼,而JSP開發人員可以採用各種字符集編碼
來編寫JSP源文件,因此,JSP引擎將JSP源文件翻譯成Servlet源文件時,需要進行字符編碼轉換。 
如果JSP文件中沒有說明它採用的字符集編碼,JSP引擎將把它當作默認的ISO8859-1字符集編碼處理。

如何解決JSP引擎翻譯JSP頁面時的中文亂碼問題 
通過page指令的contentType屬性說明JSP源文件的字符集編碼
page指令的pageEncoding屬性說明JSP源文件的字符集編碼


14Tip: include指令
include指令用於引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。
所以include指令引入通常也稱之爲靜態引入。在編譯時包含
語法:
<%@ include file="relativeURL"%>
其中的file屬性用於指定被引入文件的相對路徑。  file屬性的設置值必須使用相對路徑,如果以“/”開頭,
表示相對於當前WEB應用程序的根目錄(注意不是站點根目錄),否則,表示相對於當前文件。
細節:
被引入的文件必須遵循JSP語法。
被引入的文件可以使用任意的擴展名,即使其擴展名是html,JSP引擎也會按照處理jsp頁面的方式處理它裏面的內容,
爲了見明知意,JSP規範建議使用.jspf(JSP fragments)作爲靜態引入文件的擴展名。 
由於使用include指令將會涉及到2個JSP頁面,並會把2個JSP翻譯成一個servlet,所以這2個JSP頁面的指令不能衝突
(除了pageEncoding和導包除外)。
request.getRequestDispatcher("/a.jsp").forward(request,response);//動態包含,翻譯成多個servlet,運行時包含

15Tip: taglib指令
Taglib指令用於在JSP頁面中導入標籤庫,講自定義標籤技術時講。


--------------------
16Tip:九大隱式對象:

每個JSP 頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。
JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) ,然後按照servlet的調用方
式進行調用。
由於JSP第一次訪問時會翻譯成servlet,所以第一次訪問通常會比較慢,但第二次訪問,JSP引
擎如果發現JSP沒有變化,就不再翻譯,而是直接調用,所以程序的執行效率不會受到影響。
JSP引擎在調用JSP對應的_jspServlet時,會傳遞或創建9個與web開發相關的對象供_jspServlet
使用。
JSP技術的設計者爲便於開發人員在編寫JSP頁面時獲得這些web對象的引用,特意定義了9
個相應的變量,開發人員在JSP頁面中通過這些變量就可以快速獲得這9大對象的引用。
這9個對象分別是哪些,以及作用也是筆試經常考察的知識點。


17JSP九大隱式對象對應關係

request HttpServletRequest
response HttpServletResponse
session HttpSession
application servletContext
config   servletConfig
out      JspWriter  ----->   PrintWriter
exception
page    this
pageContext  

---------------------
輸入輸出對象

1.request:表示客戶端的請求,包含了所有的請求信息,是service方法的resquest參數.
2.response:處理JSP生成的響應,然後將響應結果發送給客戶端.是service方法的esponse參數.
3.out:表示輸出流,將作爲請求的響應發送給客戶端.是PrintWriter的一個實例.

作用域對象
4.session:表示用戶的會話狀況,用此機制可以輕易的識別每一個用戶,能保存和  跟蹤用戶的會話狀態.是HttpSession的一個實例.
5.pageContext:作用於此頁面,可以訪問頁面作用域中定義的所有隱式對象.是
PageContext的一個實例.
6.application:作用於整個應用程序.是ServletContext的一個實例.

Servlet對象

7.page:提供對網頁上定義的所有對象的訪問.是一個Object對象.是此Servlet的 一個引用.
8.config:存儲Servlet的一些初始信息.是ServletConfig的一個實例.

異常對象
9.exception:此對象負責處理程序執行過程中引發的異常.

----------------
18.tip:out隱式對象:

out隱式對象用於向客戶端發送文本數據。 
out對象是通過調用pageContext對象的getOut方法返回的,其作用和用法與ServletResponse.getWriter
方法返回的PrintWriter對象非常相似。 
JSP頁面中的out隱式對象的類型爲JspWriter,JspWriter相當於一種帶緩存功能的PrintWriter,設置JSP
頁面的page指令的buffer屬性可以調整它的緩存大小,甚至關閉它的緩存。 
只有向out對象中寫入了內容,且滿足如下任何一個條件時,out對象纔去調用ServletResponse.getWriter
方法,並通過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:
設置page指令的buffer屬性關閉了out對象的緩存功能
out對象的緩衝區已滿
整個JSP頁面結束

注意:同時使用out和response.getwriter()輸出數據。是response.getWriter()先輸出。
用JSP實現文件下載。




Servlet引擎<-------response對象的緩衝區<------------JSPWriter對象的緩衝區-------JSP頁面
      |    |
      |    |
調用ServletResponse.getWriter()方法調用out隱式對象的方法
返回的PrintWriter對象的方法寫入數據寫入數據




21Tip: pageContext對象
pageContext對象是JSP技術中最重要的一個對象,它代表JSP頁面的運行環境,
這個對象不僅封裝了對其它8大隱式對象的引用,它自身還是一個域對象,可
以用來保存數據。並且,這個對象還封裝了web開發中經常涉及到的一些常用操
作,例如引入和跳轉其它資源、檢索其它域對象中的屬性等。


22Tip:通過pageContext獲得其他對象
getException方法返回exception隱式對象 
getPage方法返回page隱式對象
getRequest方法返回request隱式對象 
getResponse方法返回response隱式對象 
getServletConfig方法返回config隱式對象
getServletContext方法返回application隱式對象
getSession方法返回session隱式對象 
getOut方法返回out隱式對象
pageContext封裝其它8大內置對象的意義,思考:如果在編程過程中,把pageContext對象傳遞給
一個普通java對象,那麼這個java對象將具有什麼功能?    //用在 自定義標籤上


23Tip:pageContext作爲域對象

pageContext對象的方法 
public void setAttribute(java.lang.String name,java.lang.Object value)
public java.lang.Object getAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name)

pageContext對象中還封裝了訪問其它域的方法
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public void removeAttribute(java.lang.String name,int scope)

代表各個域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE 
findAttribute方法    (*重點,查找各個域中的屬性)


24Tip:重點
到此爲止,web開發接觸到了4個域對象:
pageContext(稱之爲page域) 
request(稱之爲request域)
session(稱之爲session域)
servletContext(稱之爲application域)
這4個域對象是學習web的重點,也是筆試經常考察的知識點。
明確如下問題:
這4個對象的生命週期?
什麼是域?爲什麼把這4個對象叫做域對象呢?
哪種情況下用哪種域對象。


25Tip:引入和跳轉到其他資源
PageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward
方法和include方法

傳遞給這些方法的資源路徑都只能是相對路徑,如果路徑以“/”開頭,表示相對於當前WEB應用程序的根目錄,
否則,表示相對於當前JSP所映射到的訪問路徑。

 

26Tip: JSP標籤
雖然我們希望JSP頁面僅用作數據顯示模塊,不要嵌套任何java代碼引入任何業務邏輯,但在實際開發中
不引入一點業務邏輯是不可能的,但引入業務邏輯會導致頁面出現難看java代碼,怎麼辦?
Sun公司允許用戶開發自定義標籤封裝頁面的java代碼,以便jsp頁面不出現一行java代碼。當然sun公司
在jsp頁面中也內置了一些標籤(這些標籤叫做jsp標籤),開發人員使用這些標籤可以完成頁面的一些常
用業務邏輯。
JSP標籤也稱之爲Jsp Action(JSP動作)元素,它用於在JSP頁面中提供業務邏輯功能。


27Tip: JSP常用標籤
<jsp:include>標籤  
<jsp:forward>標籤  
<jsp:param>標籤  


28Tip: <jsp:include>標籤
<jsp:include>標籤用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面
執行時的引入方式稱之爲動態引入。
語法:
<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
 
page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。
flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。  


29Tip: <jsp:include>與include指令的比較
<jsp:include>標籤是動態引入, <jsp:include>標籤涉及到的2個JSP頁面會被翻譯成2個servlet,這2個
servlet的內容在執行時進行合併。 
而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在源文件級別進行合併。
不管是<jsp:include>標籤,還是include指令,它們都會把兩個JSP頁面內容合併輸出,所以這兩個頁面不
要出現重複的HTML全局架構標籤,否則輸出給客戶端的內容將會是一個格式混亂的HTML文檔。
<jsp:include>標籤:使用page屬性指定被引入資源。
include指令:使用file屬性指定被引入資源。
假設myweb應用的根目錄下有一個a.jsp文件如果將a.jsp頁面映射成了如下地址:
http://localhost:8080/myweb/dir1/a.html
在a.jsp頁面中使用瞭如下語句引入b.jsp文件:
<jsp:include page="b.jsp" />
請問:b.jsp要位於什麼位置,上面的include纔不會出錯? 
http://localhost:8080/myweb/b.jspf  bad
http://localhost:8080/myweb/dir1/b.jspf   ok
假設myweb應用程序的根目錄下有一個a.jsp文件,如果將a.jsp頁面映射爲如下地址:
http://localhost:8080/myweb/dir1/a.html
在a.jsp頁面中使用瞭如下語句引入b.jspf文件:
<%@ include file=“b.jspf”%>
請問: b.jspf要位於什麼位置,上面的include纔不會出錯?
http://localhost:8080/myweb/b.jspf   ok
http://localhost:8080/myweb/dir1/b.jspf   bad


30Tip: <jsp:forward>標籤
<jsp:forward>標籤用於把請求轉發給另外一個資源。
語法:
<jsp:forward page="relativeURL | <%=expression%>" /> 
page屬性用於指定請求轉發到的資源的相對路徑,它也可以通過執行一個表達式來獲得。


31Tip: <jsp:param>標籤
當使用<jsp:include>和<jsp:forward>標籤引入或將請求轉發給其它資源時,可以使用<jsp:param>標籤向
這個資源傳遞參數。
語法1:
<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
語法2:
<jsp:forward page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
<jsp:param>標籤的name屬性用於指定參數名,value屬性用於指定參數值。在<jsp:include>和<jsp:forward>
標籤中可以使用多個<jsp:param>標籤來傳遞多個參數。


32Tip:映射JSP
<servlet>
<servlet-name>SimpleJspServlet</servlet-name>
<jsp-file>/jsp/simple.jsp</jsp-file>
<load-on-startup>1</load-on-startup >
</servlet>
……
<servlet-mapping>
<servlet-name>SimpleJspServlet</servlet-name>
<url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>


33Tip:如何查找JSP頁面中的錯誤

JSP頁面中的JSP語法格式有問題,導致其不能被翻譯成Servlet源文件,JSP引擎將提示這類錯誤
發生在JSP頁面中的位置(行和列)以及相關信息。

JSP頁面中的JSP語法格式沒有問題,但被翻譯成的Servlet源文件中出現了Java語法問題,導致
JSP頁面翻譯成的Servlet源文件不能通過編譯,JSP引擎也將提示這類錯誤發生在JSP頁面中的位
置(行和列)以及相關信息。

JSP頁面翻譯成的Servlet程序在運行時出現異常,這與普通Java程序的運行時錯誤完全一樣,
Java虛擬機將提示錯誤發生在Servlet源文件中的位置(行和列)以及相關信息。   


 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章