JSP、EL、JSTL

JSP:

1. 指令
	* 作用:用於配置JSP頁面,導入資源文件
	* 格式:
		<%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 ... %>
		<%@ page contentType="text/html;charset=UTF-8" language="java" %>
		一個頁面可以有多個<%@ %>
	* 分類:
		1. page		: 配置JSP頁面的
			* contentType:等同於response.setContentType()
				1. 設置響應體的mime類型以及字符集
				2. 設置當前jsp頁面的編碼(只能是高級的IDE才能生效,如果使用低級工具,則需要設置pageEncoding屬性設置當前頁面的字符集)
			* import:導包
				<%@ import ="java.util.List" %>
			* errorPage:當前頁面發生異常後,會自動跳轉到指定的錯誤頁面
			* isErrorPage:標識當前頁面是否是錯誤頁面。
				* true:是,可以使用內置對象exception
				* false:否。默認值。不可以使用內置對象exception

		2. include	: 頁面包含的。導入頁面的資源文件
			* <%@include file="top.jsp"%>
		3. taglib	: 導入資源
			* <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
				* prefix:前綴,自定義的
2. 註釋:
	1. html註釋:
		<!-- -->:只能註釋html代碼片段
	2. jsp註釋:推薦使用
		<%-- --%>:可以註釋所有


3. 內置對象
	* 在jsp頁面中不需要創建,直接使用的對象
	* 一共有9個:
			變量名					真實類型						作用
		* pageContext				PageContext					當前頁面共享數據,還可以獲取其他八個內置對象
		* request					HttpServletRequest			一次請求訪問的多個資源(轉發)
		* session					HttpSession					一次會話的多個請求間
		* application				ServletContext				所有用戶間共享數據
		* response					HttpServletResponse			響應對象
		* page						Object						當前頁面(Servlet)的對象  this
		* out						JspWriter					輸出對象,數據輸出到頁面上
		* config					ServletConfig				Servlet的配置對象
		* exception					Throwable					異常對象,isErrorPage=true纔有

JSP痛點:

JSP的痛點導致在大型web應用中被拋棄

1. 動態資源和靜態資源全部耦合在一起,無法做到真正的動靜分離。服務器壓力大,因爲服務器會收到各種http請求,如css、js、圖片、動態代碼等,一旦服務器出狀態,前後臺一起掛
2. 前端做好HTML,需要java工程師將HTML改成jsp頁面,出錯率高,修改需要雙方協商
3. JSP必須在支持java的web服務器上運行(如Tomcat),無法使用nginx等(nginx單實例併發5w),性能提不上來
4. 第一次請求JSP,必須在web服務器上編譯成servlet,第一次訪問慢
5. 每次請求JSP都是訪問servlet再輸出流輸出html頁面,效率不如直接訪問html頁面高
6. 如果JSP中內容很多,頁面相應慢,因爲是同步加載。

MVC:開發模式

1. jsp演變歷史
	1. 早期只有servlet,只能使用response輸出標籤數據,非常麻煩
	2. 後來又jsp,簡化了Servlet的開發,如果過度使用jsp,在jsp中即寫大量的java代碼,有寫html表,造成難於維護,難於分工協作
	3. 再後來,java的web開發,借鑑mvc開發模式,使得程序的設計更加合理性

2. MVC:
	1. M:Model,模型。JavaBean
		* 完成具體的業務操作,如:查詢數據庫,封裝對象
	2. V:View,視圖。JSP
		* 展示數據
	3. C:Controller,控制器。Servlet
		* 獲取用戶的輸入
		* 調用模型
		* 將數據交給視圖進行展示

	* 優缺點:
		1. 優點:
			1. 耦合性低,方便維護,可以利於分工協作
			2. 重用性高
		2. 缺點:
			1. 使得項目架構變得複雜,對開發人員要求高

EL表達式

1. 概念:Expression Language 表達式語言
2. 作用:替換和簡化jsp頁面中java代碼的編寫
3. 語法:${表達式}
4. 注意:
	* jsp默認支持el表達式的。如果要忽略el表達式
		1. 設置jsp中page指令中:isELIgnored="true" 忽略當前jsp頁面中所有的el表達式
		2. \${表達式} :忽略當前這個el表達式

5. 使用:
	1. 運算:
		* 運算符:
			1. 算數運算符: + - * /(div) %(mod)
			2. 比較運算符: > < >= <= == !=
			3. 邏輯運算符: &&(and) ||(or) !(not)
			4. 空運算符: empty
				* 功能:用於判斷字符串、集合、數組對象是否爲null或者長度是否爲0
				* ${empty list}:判斷字符串、集合、數組對象是否爲null或者長度爲0
				* ${not empty str}:表示判斷字符串、集合、數組對象是否不爲null 並且 長度>0
	2. 獲取值
		1. el表達式只能從域對象中獲取值
		2. 語法:
			1. ${域名稱.鍵名}:從指定域中獲取指定鍵的值
				* 域名稱:
					1. pageScope		--> pageContext
					2. requestScope 	--> request
					3. sessionScope 	--> session
					4. applicationScope --> application(ServletContext)
				* 舉例:在request域中存儲了name=張三
				* 獲取:${requestScope.name}

			2. ${鍵名}:表示依次從最小的域中查找是否有該鍵對應的值,直到找到爲止。
				${name}
			
			
			3. 獲取對象、List集合、Map集合的值
				1. 對象:${域名稱.鍵名.屬性名}
					* 本質上會去調用對象的getter方法,屬性名爲getter方法去掉get,將剩餘部分首字母變小寫
					* 若定義一個User類爲標準JavaBean,有private的name、age、date。若已經設置了request.setAttribute("u", user),user爲new的User對象,則
						${requestScope.u.name}  雖然name爲私有成員變量,但其實訪問的是getName()方法
						${u.name}
					* 若需要將date格式化後展示到頁面,只需要在User類中定義一個getXxx方法實現返回一個String即可。在展示時${u.xxx}
						

				2. List集合:
					${域名稱.鍵名[索引]}  顯示集合下標爲索引的值
					${域名稱.鍵名}	中括號形式顯示集合中所有值
				
				3. Map集合:
					* ${域名稱.鍵名.key名稱}
					* ${域名稱.鍵名["key名稱"]}


	3. 隱式對象:
		* el表達式中有11個隱式對象
		* pageContext:
			* 獲取jsp其他八個內置對象
				* ${pageContext.request}    獲取request對象
				* ${pageContext.request.contextPath}:動態獲取虛擬目錄

JSTL

1. 概念:JavaServer Pages Tag Library  JSP標準標籤庫
	* 是由Apache組織提供的開源的免費的jsp標籤		<標籤>

2. 作用:用於簡化和替換jsp頁面上的java代碼		

3. 使用步驟:
	1. 導入jstl相關jar包
	2. 引入標籤庫:taglib指令:  <%@ taglib %>
		<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
	3. 使用標籤

4. 常用的JSTL標籤
	1. if:相當於java代碼的if語句
		1. 屬性:
            * test 必須屬性,接受boolean表達式
                * 如果表達式爲true,則顯示if標籤體內容,如果爲false,則不顯示標籤體內容
                * 一般情況下,test屬性值會結合el表達式一起使用
                * 例:判斷number數字是否是偶數,是則打印
                  <c:if test="${number % 2==0}">
					    ${number}爲偶數
				  </c:if>
   		 2. 注意:
       		 * c:if標籤沒有else情況,想要else情況,則可以在定義一個c:if標籤
	2. choose:相當於java代碼的switch語句
        1. 使用choose標籤聲明         			相當於switch聲明
        2. 使用when標籤做判斷         			相當於case
        3. 使用otherwise標籤做其他情況的聲明    	相當於default
        
        <c:choose>
		    <c:when test="&{number==1}">星期一</c:when>
		    <c:when test="&{number==2}">星期二</c:when>
		    <c:when test="&{number==3}">星期三</c:when>
		    <c:when test="&{number==4}">星期四</c:when>
		    <c:otherwise>數字輸入有誤</c:otherwise>
		</c:choose>
    

	3. foreach:相當於java代碼的for語句

5. 練習:
	* 需求:在request域中有一個存有User對象的List集合userList。需要使用jstl+el將list集合數據展示到jsp頁面的表格table中
	*	 <table border="1px" align="center" width="500px" >
		    <tr>
		        <td>姓名</td>
		        <td>性別</td>
		        <td>電話</td>
		    </tr>
		
		    <c:forEach items="${userList}" var="user">
		        <tr>
		            <td>${user.name}</td>
		            <td>${user.sex}</td>
		            <td>${user.tel}</td>
		        </tr>
		    </c:forEach>
		</table>
發佈了78 篇原創文章 · 獲贊 8 · 訪問量 8516
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章