JSP(JSTL EL表示式 三個指令 六個動作標籤 九個JSP內建物件)

弎屲發表於2020-10-26

JSP(JSTL EL表示式 三個指令 六個動作標籤 九個JSP內建物件)

概念

JSP: Java Server Page Java服務專案

是一種可以寫html css js 也可以寫Java程式碼的頁面

作用是簡化頁面的書寫

JSP本質上是個Servlet
* JSP:
	* 註釋:
		* 標記語言註釋: <!--  -->
			* 缺點:
				1.會傳送到客戶端
				2.不能註釋Java程式碼
		
		* jsp註釋: <%-- --%>
			* 優點:
				1.不會傳送到客戶端
				2.能註釋Java程式碼
				
	* 3大指令:
		* 指令:配置JSP頁面的屬性或者匯入一些額外的內容
		* 格式:<%@ 指令名稱 屬性名="屬性值" %>
		* 分類:
			page:配置JSP頁面的屬性
			include:靜態包含
			taglib:匯入額外的內容
		
		* page指令:
			language :指定jsp頁面使用的語言。只有一個值 java
			*import :匯入軟體包
			*pageEncoding :設定頁面編碼
				1.指定jsp檔案的編碼
				2.告訴瀏覽器頁面使用的編碼格式
			autoFlush:自動重新整理
			buffer:緩衝區大小
			
			*errorPage:指定錯誤頁面,當頁面發生異常時,指定跳轉的頁面
				* 一般在開發完成後,會在web.xml中通過<error-page>標籤來配置整個專案的錯誤頁面

				 <error-page>
  					<error-code>500</error-code>
  					<!-- <exception-type></exception-type> -->
  					<location>/500.jsp</location>
  				</error-page>
			<!--    <error-page>
  				<error-code>404</error-code>
  				<location>/404.jsp</location>
 				 </error-page>
  			 -->
			
			isErrorPage:是否是錯誤頁面
				true:是錯誤頁面,可以使用內建物件exception
				false:不是
		
		* taglib:匯入額外的內容,如:匯入jstl標籤
			<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
			
		* include:靜態包含	
			* 包含後,只會存在一個.class檔案。
		
	* 6個動作標籤:
		* 動作標籤:替換Java程式碼。簡化書寫,提高可讀性
			<jsp:useBean> 	Person p = new Person()
				使用一個ID和一個給定作用範圍和同一ID的JavaBean相關聯
			<jsp:setProperty> 	p.setName("zhangsan")
				設定JavaBean的屬性值
			<jsp:getProperty> 	String name = p.getName()
			    取得JavaBean的屬性值
			<jsp:include>  動態包含
				請求時檔案包含
				* 多個.class位元組碼檔案
				
				
			<jsp:forward> 	轉發
				接受使用者輸入並將請求分派給另一頁面
			<jsp:param>		傳遞請求引數
				
		
------------------------------------------------------------------------------------------------------
			<%
   			Person p = new Person();
   			p.setName("張三");
   			String name = p.getName();
   			
   			//request.getRequestDispatcher("").include(request, response);
   			//request.getRequestDispatcher("").forward(request, response);
   			 %>
   			上面的標籤可以替換為下面的
   		<jsp:useBean id="p1" class="cn.itcast.domain.Person" /><!-- 反射 -->
   		<!--
   			name對應的是setName方法
   			name---Name--setName
   			
   			內省:通過欄位名稱,找到對應的setter和getter方法。
   		-->
   		
   		<jsp:setProperty name="p1" property="name"  value="李四"/>
   		<jsp:getProperty  name="p1" property="name"/>
---------------------------------------------------------------------------------------------
		<!-- 動態包含 -->
   		<!-- 
   		<jsp:include page="/hello.jsp" /> -->
--------------------------------------------------------------------------------------------------
	<!-- 請求轉發 -->
   		<jsp:forward page="/index.jsp">
   		
   			<jsp:param  name="msg" value="hehe"/>
   		</jsp:forward>
-------------------------------------------------------------------------------------------

		
		* JavaBean:一種符合特定規範的Java類
			1.私有所有成員變數
			2.提供公共的訪問方式	setter 或 getter
			3.提供空參構造
			
			domain
			pojo
			entity
			beans
	
	* 9個內建物件:
		* 內建物件:在jsp轉換後的.java檔案的service方法中 宣告好的 物件。在jsp中可以直接使用。
		
		* 分類:
			application:ServletContext
			session:HttpSession
			request:HttpServletRequest
			pageCotext:PageCotext (頁面域)
			
			out:JspWriter
			response:HttpServletResponse
			config:ServletConfig
			page:this
			exception: Throwable
		* pageCotext:
			1.域物件:頁面域
			2.獲取其他八個內建物件:可以在非jsp環境使用其他的內建物件。
		
		* out和response.getWriter():
			* 在使用物件向頁面輸出資訊時,採用out
			

早期寫法

指令碼

<%
  int num=100;
  System.out.println(num);
  out.print("abc");
  String s="一樹梨花";
%>

三六九

三個指令

三個指令
page指令:定義JSP頁面的相關資訊
contentType="text/html;charset=UTF-8"  響應的型別是html 用的編碼方式為UTF-8
language="java"  支援語言
pageEncoding="UTF-8" 頁面編碼
import 匯入包
isELIgnored="false" 是否忽略el標籤
errorPage 設定錯誤頁面

六個動作標籤

JSP內建的 直接使用
<jsp:forward page="/san">
    <jsp:param name="username" value="sanwa"/>
</jsp:forward>

九個JSP內建物件

JSP內建的 直接使用
1. request:HttpServletRequest
2. pageCotext:PageCotext(頁面域)
3. session:HttpSession
4. application:ServletContext

5. response
6. exception
7. config
8. page
9. out

el表示式

el:JSP內建的表示式 作用是來替代<%=%>
el:
	jsp的內建表示式語言,從jsp2.0開始.
	用來替代<%=..%>
	作用:
		1.獲取域中資料 ★
		2.執行運算 ★
		3.獲取常見的web物件
		4.呼叫java的方法
	格式:
		${el表示式}
		
獲取域中資料:★
	
	1.獲取簡單資料
		${pageScope|requestScope|sessionScope|applicationScope.屬性名}
		以後經常使用:
			${屬性名}:依次從pageContext,request,session,application查詢指定屬性,若查詢到返回值,結束該次查詢
				若查詢不到,返回""
------------------------------------------------------------------------------------
	例子:	<%
		request.setAttribute("rkey", "rvalue");
		session.setAttribute("skey", "svalue");
		session.setAttribute("rkey", "svalue");
		application.setAttribute("akey", "avalue");
	%>
	獲取request中的資料:<br>
	老方式:<%=request.getAttribute("rkey") %><br/>
	el方式:${requestScope.rkey }<br/>
	<hr>
	
	獲取session中的資料:<br>
	老方式:<%=session.getAttribute("skey") %><br/>
	el方式:${sessionScope.skey }<br/>
	<hr>
	
	獲取application中的資料:<br>
	老方式:<%=application.getAttribute("akey") %><br/>
	el方式:${applicationScope.akey }<br/>
	
	<hr>
	獲取失敗老方式:<%=application.getAttribute("aakey") %><br/>
	獲取失敗el方式:${applicationScope.aakey }
	
	<hr>
	便捷獲取:
	${skey },${rkey },${aakey },${akey }
	<hr>
	${rkey }
----------------------------------------------------------------------------------------------
	2.獲取複雜資料
		獲取陣列中的資料
			${域中的名稱[index]}
		獲取list中的資料
			${域中的名稱[index]}
		獲取map中的資料
			${域中的名稱.鍵名}
-----------------------------------------------------------------------------
	<%
		//往request域中放入陣列
		request.setAttribute("arr", new String[]{"aa","bb","cc"});
		
		//往request域中放入list
		List list=new ArrayList();
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");
		request.setAttribute("list", list);
		
		//往request域中放入map
		Map m=new HashMap();
		m.put("username","tom");
		m.put("age",18);
		request.setAttribute("map", m);
	%>
	
	獲取域中的陣列:<br>
	老方式:<%=((String[])request.getAttribute("arr"))[1] %><br>
	el方式:${arr[1] }<br>
	<hr>
	
	獲取域中的list:<br>
	老方式:<%=((List)request.getAttribute("list")).get(1) %><br>
	el方式:${list[1] }<br>
	list的長度:${list.size() }
	<hr>
	
	獲取域中的map:<br>
	老方式:<%=((Map)request.getAttribute("map")).get("age") %><br>
	el方式:${map.age}<br>
	<hr>
-----------------------------------------------------------------------------------------------------------	




	javabean導航
		javabean:
			java語言編寫的一個可重用的元件,
			狹義上來說就是我們編寫的一個普通的java類 例如:User Person 
			javabean規範:
				1.必須是一個公共的具體的類  public class
				2.提供私有的成員變數  private String id;//
				3.提供公共訪問欄位的方法 get|set|is方法
					public String getId(){..}
					一旦有公共的方法之後,get|set|is之後的內容,將首字母小寫,將這個東西稱之為bean屬性
						id就是一個bean屬性
				4.提供一個無參的構造器
				5.一般實現序列化介面  serializable
		
	3.${域中javabean名稱.bean屬性}
---------------------------------------------------------------------
	例子 el  獲取物件中欄位的值
	<%
	User u=new User();
	u.setId("001");
	u.setName("tom");
	u.setPassword("123");
	
	//將u放入域中
	request.setAttribute("user", u);
	%>
獲取域中javabean的id值:<br>
老方式:<%=((User)request.getAttribute("user")).getId() %><br/>
el方式:${user.id }<!-- 相當於呼叫 getXxx() -->

<hr>
el獲取那麼:${user.name }<br>
錯誤演示:${user.username }
-------------------------------------------------------------------------------------

//
執行運算:
	四則運算 關係(>..) 邏輯(&& ||)
	注意:
		+:只能進行加法運算,字串形式數字可以進行加法運算.
		empty:判斷一個容器的長度是否為0(array set list map),還可以判斷一個物件是否為空
			${empty 域中的物件名稱}
		取反 not   例如    not empty 
			${not empty 域中物件名稱}
		三元運算子   ${ 3>4?"yes":"no" }
--------------------------------------------------------------------------------------------------------
例子:
<%
		request.setAttribute("i", 3);
		request.setAttribute("j", 4);
		request.setAttribute("q", "12");
		request.setAttribute("k", "k");
		
		List l=null;
		request.setAttribute("list", l);
		
		List ll=new ArrayList();
		ll.add("22");
		request.setAttribute("list_", ll);
		
		User user=null;
		request.setAttribute("bean", user);
		
		User user_=new User();
		request.setAttribute("bean_", user_);
	%>
	
	${i+j }<br/>
	${i+q }<br/>
	${q+q }<br/>
	<%-- ${i+k }<br/> --%>
	<hr>
	域中list的長度是否為0:${empty list}<br/>
	域中list_的長度是否為0:${empty list_ }<br/>
	
	<hr>
	域中的bean是否為空:${empty bean }<br/>
	域中的bean_是否為空:${empty bean_ }<br/>
	
	<hr>
	${ 3>4?"yes":"no" }<br/>
	
	${i==3 }
--------------------------------------------------------------------------------------		



//
el的內建物件(瞭解)
	11個
		
		pageScope
		requestScope
		sessionScope
		applicationScope
		
		param
		paramValues
		
		header
		haederValues
		
		initParam
		
		cookie★
		
	
		
	cookie內建物件:
		${cookie} 獲取map{key=Cookie}
			例如:建立cookie
				Cookie c=new Cookie("username","tom");
			通過${cookie}獲取相當於	
				{username=new Cookie("username","tom")}
			相當於map的key是cookie的鍵
			map的value是當前cookie
			
		若項獲取名稱username的cookie的value值(獲取tom)
			${cookie.username.value}--javabean導航
		注意:
			java中Cookie的api
				getName():獲取cookie的名稱
				getValue():獲取cookie的value值
			我們稱name和value是cookie的bean屬性
	
		使用cookie內建物件:
			${cookie.給cookie起名字.value}
			
		例如:
			獲取jsession的值
			${cookie.JSESSIONID.value}
			
	pageContext:獲取不是map集合,相當於jsp的pageContext內建物件
			在jsp頁面中獲取專案名
			${pageContext.request.contextPath}
			例如:<a href="${pageContext.request.contextPath }/demo8.jsp">pagecontext內建物件獲取專案名(掌握)</a>
-----------------------------------------------------------------------------------------------------

JSTL


-----------------------------------------------------------------------------------------------------
jstl:
	jsp標準的標籤庫語言
	apache的
	用來替代java指令碼
	使用步驟:
		1.匯入jar包 (jstl.jar和standard.jar)
		2.在頁面上匯入標籤庫
			<%@taglib prefix="" uri=""%>
			
			例如:
				<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
	jstl的分類:
		core:核心類庫 ★
		fmt:格式化|國際化
		xml:過時了
		sql:過時了
		函式庫:很少使用
	core:掌握
		★c:if
		★c:forEach
		
		
		
	★c:if 判斷
		<c:if test="${el表示式}">滿足的時候輸出的內容</c:if>
		例如:
			<c:if test="${3>4 }">
				3大於4
			</c:if>
			<c:if test="${3<=4 }">
				3不大於4
			</c:if>
			//

例子 比如可以給我們登陸成功頁面 加上判斷
	<c:if test="${not empty name }">

	 ${name}歡迎你!

	</c:if>

	<c:if test="${empty name }">

	 
		你尚未登陸請重新登陸<a href="/ServletDemo/login.jsp">點選登陸</a>

	</c:if>
---------------------------------------------------------------------------------------------------------


	★c:forEach 迴圈
		格式1:
			 <c:forEach begin="從那裡開始" end="到那裡結束" step="步長" var="給變數起個名字" varStatus="迴圈狀態變數">
				${i }--${vs.count }--${vs.current }<br>
			 </c:forEach>
			 
			varStatus:用來記錄迴圈的狀態
				常用的屬性:
					count:記錄次數 從1開始
					current:當前遍歷的內容
					index: 索引 從0 開始
		例如:
			<c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
				${i }--${vs.count }--${vs.current }<br>
			</c:forEach>
		
		格式2:
			<c:forEach items="${el獲取域中的容器}" var="n">
				${n }
			</c:forEach>
			
			例如:
				//遍歷list
				<c:forEach items="${list }" var="n">
					${n }
				</c:forEach>
				
				//遍歷map
				 <c:forEach items="${map }" var="en">
					${en.key }-- ${en.value }<br/>
				  </c:forEach>
-----------------------------------------------------------------------------------
例子:
	<%
		ArrayList<Student> list = new ArrayList<Student>();
		list.add(new Student("張三", "23"));
		list.add(new Student("李四", "24"));
		list.add(new Student("王五", "25"));
		list.add(new Student("趙六", "26"));

		request.setAttribute("list", list);
	%>

	<table height=300 width=400 align=center>
		<tr bgcolor=green>
			<th>編號</th>
			<th>姓名</th>
			<th>年齡</th>
		</tr>
		<c:forEach items="${list }" var="stu" varStatus="s">
			<c:if test="${s.count%2==0 }">
				<tr bgcolor=red>
			</c:if>
			<c:if test="${s.count%2!=0 }">
				<tr bgcolor=yellow>
			</c:if>

			<td>${s.count }</td>
			<td>${stu.name }</td>
			<td>${stu.age }</td>
			</tr>
		</c:forEach>

	</table>
-----------------------------------------------------------------------------------------------------------------
	* c:url:
		功能:	
			* 自動補專案路徑
			* 自動url重寫
				<a href='<c:url value="/foreach.jsp" />'>foreach.jsp</a>

---------------------------------------------------------------------------------------------------------------------------
 	<%
  		HttpServletRequest req = (HttpServletRequest)(pageContext.getRequest());
  		String contextPath = req.getContextPath();
  		session.setAttribute("aaa", "aaa");
  	 %>
  	<%=contextPath %><br>
  	${pageContext.request.contextPath}
    		<a href="${pageContext.request.contextPath}/foreach.jsp">foreach.jsp</a><br>
    		
    		
    		<a href='<c:url value="/foreach.jsp" />'>foreach.jsp</a>


--------------------------------------------------------------------------------------------------------------------
 <%--使用標籤 --%>
    <%--set標籤 :儲存資料(儲存到域中)預設儲存到page域 --%>
    <c:set var="name" value="rose" scope="request"></c:set>
    
    <%
    	String msg = null;
    	pageContext.setAttribute("msg",msg);
     %>
    
    ${msg }
    <br/>
    <%--out標籤: 獲取資料(從域中) 
    default: 當value值為null時,使用預設值
    escapeXml: 是否對value值進行轉義,false,不轉義,true,轉義(預設)
    --%>
    <c:out value="${msg}" default="<h3>標題3</h3>" escapeXml="true"></c:out>
    
    <hr/>
----------------------------------------------------------

 <%--choose標籤+when標籤+otherwirse標籤: 多條件判斷 --%>
    <c:set var="score" value="56"></c:set>
    
    <c:choose>
    	<c:when test="${score>=90 && score<=100}">
    		優秀
    	</c:when>
    	<c:when test="${score>=80 && score<90}">
    		良好
    	</c:when>
    	<c:when test="${score>=70 && score<80}">
    		一般
    	</c:when>
    	<c:when test="${score>=60 && score<70}">
    		及格
    	</c:when>
    	<c:otherwise>
    		不及格
    	</c:otherwise>
    </c:choose>
--------------------------------------------
    <%-- forToken標籤: 迴圈特殊字串 --%>
    <%
    	String str = "java-php-net-平面";
    	pageContext.setAttribute("str",str);
     %>
    
    <c:forTokens items="${str}" delims="-" var="s">
    	${s }<br/>
    </c:forTokens>
    
    <%--redrict:重定向 --%>
    <c:redirect url="http://www.baidu.com"></c:redirect>

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

* MVC模式 一種前輩們總結出來的開發模式
	* M :Model 模
		* 封裝資料,處理業務邏輯
	* V : View 檢視
		* 介面顯示
	* C :Controller 控制器
		* 排程
	
	

* JavaWeb的三層架構
	* org.westos.web.servlet	:web層
	*  org.westos.service:service層
	*org.westos.dao:dao層
	* org.westos.domain : JavaBean
	*  org.westos.util:工具包
	org.westos.test:測試包



相關文章