一,指令碼元素:將Java代碼插入到與jsp頁面對應的servlet中。
指令碼元素的3中形式:
運算式,Scriptlet,聲明。
二,運算式:將資料或資料操作後的結果轉換為字串,插入到當前servlet的輸入資料流中(_jspService方法中)。
1,JSP運算式標準文法:
<%= JAVA運算式 %>
JSP運算式xml文法:
<jsp:expression>JAVA運算式</jsp:expression>
2,JSP運算式後面不加分號;
3,操作後的結果將轉換為字串,插入到當前servlet的輸入資料流中。
4,JSP運算式將產生Servlet的print語句。
HTML轉換為print語句時,使用雙引號將文本引起來。
JSP運算式轉換為沒有雙引號的print語句。
5,這些語句都會放入_jspService方法中,無論doGet還是doPost都調用該_jspService方法。
三,Scriptlet(指令碼段): 將Java代碼插入到servlet的_jspService方法中。
1,Scriptlet標準文法:
<% java代碼 %>
Scriptlet的xml文法格式:
<jsp:scriptlet> scriptlet </jsp:scriptlet>
2,scriptlet 語句後面要加分號。
3,Scriptlet可以訪問到運算式能夠訪問的所有自動定義變數。
4,Scriptlet代碼會按出現的次序插入到_jspService方法中。
5,在Scriptlet中聲明的變數都轉譯為_jspService方法中的本地變數。所以變數是安全執行緒的。
四,聲明(declaration):將方法或欄位定義插入到servlet類的主定義體中(_jspService方法除外)。
1,聲明的文法:
<%! 域或方法的聲明 %>
聲明的xml文法格式:
<jsp:declaration> 域或方法的聲明 </jsp:declaration>
2,聲明只在當前JSP頁面中有效。
3,聲明不產生輸出。
4,不要使用JSP聲明覆蓋Servlet的(service方法)。
5,可以使用JSP聲明覆蓋jspInit或jspDestroy方法來初始化和銷毀JSP頁面,而不要直接使用init和destroy方法。
注意:這裡是jspInit和jspDestroy而不是_jspInit和_jspDestroy方法。JSP容器會在調用_jspInit和_jspDestroy方法後調用自訂的jspInit和jspDestroy方法。
個人認為,這裡的使用了模板方法模式,jspInit和jspDestroy為模板方法_jspInit和_jspDestroy方法的鉤子方法。
既然JSP實現提供了這樣的機制,那實現這些方法是理由充分的了。
在擷取初始化參數的時候,需要在web.xml中配置JSP頁面的Servlet和ServletMapping。
<servlet-name>即為帶尾碼的jsp檔案名稱 xxx.jsp。
<jsp-file>代替<servlet-class>對jsp檔案做映射。
<url-pattern>的路徑要指定jsp檔案的相對路徑的全稱包括尾碼。
重點在於 如何解決由此帶來的資料並發訪問的問題。
JSP容器只有一個servlet執行個體,請求線程的不同會造成並發的問題。為多個線程共用,這樣將造成使用聲明中資料的一致問題。
6,使用單獨的Java類而非JSP聲明來定義多數方法。
7,對於並發訪問,聲明中的域或者變數,除非是唯讀 ,否則是線程不安全的。
8,聲明是產生_jspService方法之外的代碼,所以在聲明中是不能“直接”訪問“隱含對象”。
五,運算式,Scriptlet,聲明的比較
文法:
Scriptlet 和 聲明 都是java語句,而JSP運算式只是運算式。一個完整的語句需要分號表示結束,而運算式不需要。
Java代碼插入位置:
運算式:_jspService方法的輸出資料流的print方法中;
Scriptlet :_jspService方法體中對應的位置。
聲明:servlet類的主定義體中(_jspService方法除外);
變數存取範圍:
運算式:可以訪問serlvet類中的類的域和_jspService方法中的局部變數。
Scriptlet:同運算式。
聲明:不能訪問聲明外的局部變數,比如_jspService方法中的局部變數(隱含對象)。
執行緒安全性:
運算式和Scriptlet是安全執行緒的。
聲明是線程不安全的。