JSP學習個人心得
阿新 • • 發佈:2018-11-17
1,什麼是jsp?
一種動態網頁技術。一種專門用於進行資料展示的Servlet,普通的Servlet是用於完成業務邏輯處理的。
一樣的單例多執行緒。
2,jsp 的註釋
1,<%-- --%> 網頁檢視原始碼時不可見
2,<!-- --> 網頁檢視原始碼時可見
3,JSP的Java程式碼塊(jsp小指令碼)
1,在<% %>中進行編寫。 執行順序與其放置的順序相關。 2,需要注意的是,jsp小指令碼是被翻譯到Servlet的_jspService方法中。(相當於Java中的區域性變數) 故在JSPJava程式碼塊中,不能出現一些內容: 1,宣告的變數不能新增許可權訪問控制符 2,不能定義方法。 3,不能定義靜態語句塊。
4,JSP的宣告語句塊
1,在<%! %>中宣告。
2,在這個塊的內容,將被翻譯到Servlet的實體中,沒用包含到所謂的哪個方法中,相當於Java中的成員變數和成員方法。
3,故在這個塊中,可以出現。成員變數,靜態變數,靜態方法,靜態程式碼塊,但是不能出現普通的Java語句。
4,值得注意的是,JSP是一種單例多執行緒的模式,所以成員變數儘量不要宣告與使用,因為比較危險。
5,JSP的表示式塊
1,<%= %> 2,在JSP頁面中輸出變數,常量,及它們組成的各種表示式的值。(無分號) 3,翻譯到_jspService方法中的out.write()中輸出。
6,JSP內建物件(9個)
1,pageContext(最小的那個域) 其所含有的set,get,remove Parameter()的方法基本沒用。、 但是其含有的部分get方法可以獲得其他8個內建物件。 2,servletContext(application) Servlet中詳細闡述過,不過多闡述。 3,out 4,page(不常用) 即Servlet物件本身。 5,exception 配合page指令使用,當頁面中的page指令的isErrorPage屬性被指定為true,exception會展示出來。 6,request 7,response 8,session 9,config
7,JSP兩大編譯指令
關於指令格式:
<%@ 指令名稱 屬性=屬性值 屬性2=屬性值2 屬性3=屬性值3 .。。。。。%>
1,page指令(具體變化需要參照Servlet的_jspService方法)
1,pageEncoding 配置當前頁面使用的編碼格式
2,contentType 配置當前頁面的MIME格式和編碼格式,一般與1不同時使用
3,import 配置當前頁面需要使用的類,可以匯入多個類,類與類之間用“,”逗號隔開。
4,errorPage 配置當前頁面發生錯誤後,需要跳轉的頁面,畢竟總是跳轉至404,客戶體驗感會不好。
5,iserrorPage 配置當前頁面是否為錯誤頁面
6,session
2,include指令 <%@ include file="檔名" %>
1,配置指定的檔案插入當前頁面,值得注意的是,如果插入的是錯誤頁面,那麼include將會出現只存在錯誤頁面的問題。
2,file為唯一的屬性,專門用來指定要插入的檔案。
3,這種include指令引入檔案,又稱為靜態聯編,被引入的檔案不會生成新的Servlet,而是直接被翻譯到_jspService方法。與此同時,區域性變數將會共享。
4,使用include可以達到一改全改的效果。
8,jsp動作指令
1,關於指令格式:<jsp:動作名稱 屬性名=屬性值 屬性名=屬性值 屬性名=屬性值 。。。。。></jsp:動作名稱>
或<jsp:動作名稱 屬性名=屬性值 屬性名=屬性值 屬性名=屬性值 。。。。。/>
2,重要的動作名稱
1,include 請求轉發至對應的page頁面
2,forward 請求轉發至對應的page頁面
以上兩個動作均為請求轉發,底層呼叫的是RequestDispatacher的兩個方法。
動作指令的include引入檔案,稱為動態聯編,相當於在_jspService方法去呼叫該類中的其他方法。
動態聯編一般應用於檔案中重名問題的解決。
3,useBean
4,setProperty
5,getProperty
以上方法與Java類有關,後邊闡述
9,EL表示式
1,Expression Language 表示式語言。
一種在JSP檔案中獲取資料的方式。在JSP頁面的任何靜態部分(即非程式碼塊,宣告塊,表示式塊)都可以使用${expression}獲取資料。
唯一的小缺點,不支援字串的操作。
2,從域空間中獲得資料
在這個板塊中,我們用到了在servlet中的相關Attribute方法。
1,四大域
1>pageContext 在該域獲取物件,pageScope.屬性名
2>requestContext 在該域獲取物件,requestScope.屬性名
3>sessionContext 在該域獲取物件,sessionScope.屬性名
4>applicationContext (又名servletContext),application無需建立,故方便使用。 在該域獲取物件,applicationScope.屬性名
2,訪問Bean屬性
域名Scope.Bean名.屬性名,需要注意的是,在Bean中需要提供對應的get方法,否則無法獲取。
eg:${pageScope.student.name},底層呼叫的是name的get()方法。
3,訪問陣列,List,Map中的資料
與上述的2的訪問基本沒啥差別。值得注意的是陣列,List的下標越界,不會報錯,只是不顯示而已。
4,運算子
與Java中的運算子沒有什麼差別,值得注意的是,empty 這個運算子(布林型別)。
empty 判斷當前物件,字串,集合等是否定義,是否為空,若是,則為true;
5,EL內建物件(11個,前10個map型別,最後一個為域)
1>pageScope
2>requestScope
3>sessionScope
4>applicationScope
5>param 位址列請求引數
6>paramValues 位址列請求引數值
7>initParam servletContext的初始化引數
8>heard 請求頭
9>heardValue 請求頭的值
10>cookie
11>pageContext
10,EL自定義函式
1,定義函式
定義一個類,通過類中的某個方法(靜態,static 公共 piblic)實現所需要的功能
2,註冊函式
1>/WEB-INF下新增一個副檔名為.tld的檔案,將定義好的函式在這個檔案中進行註冊。
2>新增約束條件,可在tomcat/weabapps/examples/WEB-INF/jsp2/jsp2-example-taglib中複製。
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
</taglib>
3><tlib-version>1.0</tlib-version> 指定函式庫版本號
<short-name>myfunction</short-name> 指定函式庫名稱,一般與tld檔名一致
<uri>http://www.sxflow.cn/jsp/mytig</uri> 指定所對應函式庫的url
4><function>
<name>hello</name> 對應的函式名稱
<function-class>cn.sxflow.tiglib.Test01</function-class> 實現功能的類的全名
<function-signature>java.lang.String hello()</function-signature> 實現功能的方法的描述 類的返回值型別(全名) 類名( 引數的型別(全名) )
</function>
3,使用函式
1,<%@ taglib uri = "http://www.sxflow.cn/jsp/mytig" prefix = "myfunction" %>
2,${myfunction:hello() }
11,自定義標籤
1,定義標籤處理器,實現javax.servlet.jsp.tagext.SimpleTag介面,或者繼承javax.servlet.jsp.tagext.SimpleTagSupport(官方的,更為強勢)
其中的幾個重要方法:
dotag() 伺服器端自動呼叫,核心方法。自定義標籤功能的實現均在這個方法中。
getParent() 獲得當前標籤的父標籤的引用。
getJspBody()
getJspContext()
setJspBody()
getJspContext()
2,註冊標籤處理器,在自定義EL函式的tld檔案中的<taglib/>標籤下新增類似
<tag>
<name>clientIP</name> 自定義標籤名字
<tag-class>cn.sxflow.tiglib.Test02</tag-class> 標籤處理器完整類名
<body-content>empty</body-content> 其值有四個選項,empty只是其中一個
</tag>
的這種格式,即完成了對自定義標籤的註冊。
3,<body-content>的四個值的簡單描述
empty 沒有標籤體
scriptless 自定義的標籤具有標籤體,但標籤體文字不能含有Java指令碼,但可以包含 EL表示式,並可以對其進行計算。
tagdependent 會將標籤體的內容原樣顯示在瀏覽器,EL表示式也不會對其進行計算,而是被當作普通的字串。
JSP 對繼承SimpleTagSupport的標籤處理器無法使用,會報錯。除此之外,其功能同tagdependent
4,自定義標籤的幾種型別
1,無標籤體
無需多言,上述的三條就是無標籤體的創造步驟
2,有標籤體
1>定義標籤處理器
通過jspBody()獲得當前標籤的標籤體,之後對標籤體進行處理,如需將其寫入瀏覽器對應的位置,則需要使用帶有緩衝區的字元流,如StringWriter
將jspBody寫入輸出流中,然後獲得JSP的標準輸出流物件,然後對從快取中獲取的標籤文字進行處理,然後輸出給瀏覽器
2>註冊標籤瀏覽器,根據需求選擇body-content的型別
3,帶屬性的標籤
1>標籤處理器的屬性,在其的標籤處理器中對應的是一個具有set方法的屬性。
2>在標籤處理器中,根據標籤屬性的值進行判斷,該執行哪些動作與方法。
3>註冊標籤處理器的時候,需要在<tag>標籤下加入<attribute>自標籤,
如:<attribute>
<name>id</name> 屬性的名稱
<required>true</required> 屬性是否必須
<rtexprvalue>true</rtexprvalue> 屬性是否支援動態語句,如EL表示式,JSP表示式塊。(runtime expression value)
</attribute>
4,以上三種的自由組合
5,自定義標籤庫的打包發行
12,JSTL
1,JSTL(JavaServer Pages Standard Tag Library,JSP標準標籤庫)是一個不斷完善的開放原始碼的JSP標籤庫,16個對字串進行處理的函式標籤庫
2,EL函式標籤庫
fn:contains(string, substring) 如果引數string中包含引數substring,返回true
fn:containsIgnoreCase(string, substring) 如果引數string中包含引數substring(忽略大小寫),返回true
fn:endsWith(string, suffix) 如果引數 string 以引數suffix結尾,返回true
fn:escapeXml(string) 將有特殊意義的XML (和HTML)轉換為對應的XML實體字元,並返回轉義後的字元
fn:indexOf(string, substring) 返回引數substring在引數string中第一次出現的位置
fn:join(array, separator) 將一個給定的陣列array用給定的間隔符separator串在一起,組成一個新的字串並返回。
fn:length(item) 返回引數item中包含元素的數量。
fn:replace(string, before, after)返回一個String物件。用引數after字串替換引數string中所有出現引數before字串的地方,並返回替換後的結果
fn:split(string, separator) 返回一個數組,以引數separator 為分割符分割引數string,分割後的每一部分就是陣列的一個元素
fn:startsWith(string, prefix) 如果引數string以引數prefix開頭,返回true
fn:substring(string, begin, end)返回引數string部分字串, 從引數begin開始到引數end位置,包括end位置的字元
fn:substringAfter(string, substring)返回引數substring在引數string中後面的那一部分字串
fn:substringBefore(string, substring)返回引數substring在引數string中前面的那一部分字串
fn:toLowerCase(string) 將引數string所有的字元變為小寫,並將其返回
fn:toUpperCase(string) 將引數string所有的字元變為大寫,並將其返回
fn:trim(string) 去除引數string 首尾的空格,並將其返回
3,核心標籤庫 http://java.sun.com/jsp/jstl/core
4,格式化標籤庫 http://java.sun.com/jsp/jstl/fmt
13,關於EL的一些特性
1,不能出現在JSP 動態部分
2,只允許在四大域中獲取資料
3,不能丟擲空指標異常,不會出現陣列下標越界異常
4,不具有處理字串的能力。