1. 程式人生 > >JSP學習個人心得

JSP學習個人心得

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,不具有處理字串的能力。