JSP/EL/JSTL - JavaWeb

一. JSP


1.1 Jsp腳本


  1. <%代碼片段%>
    java腳本片段, 生成在service方法中, 每次請求的時候都會執行

  2. <%! 代碼 %>
    聲明片段, 在java代碼中聲明成員, 放在jsp生成java文件中的成員位置

  3. <%= 代碼 %>
    輸出腳本片段, 在jsp頁面上進行輸出, 源碼 out.print(“代碼”). 注意: 輸出表達式不能以分號結尾

舉例:

<!-- 代碼片段 -->
<%
	if(3>4) {
		out.print("真");
	} else {
		out.print("否");
	}
%>
<%
	int i = 1;
%>

<!-- 聲明片段 -->
<%!
	// 聲明成員變量j
	int j = 3;
	// 聲明一個方法
	public void add() {
		System.out.println("This is a method");
	}
%>

<!-- 輸出片段: 在jsp頁面做輸出操作, 調用out.print(i)-->
<%=i%>

Jsp註釋: <%-- 註釋內容 --%>
html註釋: <!-- 註釋內容 -->

1.2 Jsp指令


格式: <%@jsp指令 屬性名="屬性值" 屬性名1="屬性名1" %>

三大指令:

  1. page配置jsp, 兌入jsp頁面上需要的類
    <%@ page import="java.util.List'' %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" session="false"
         isELIgnored="true" errorPage="error/500.jsp" isErrorPage="false" %>
    
    <%--
    	contentType: 相當於 response.setContentType(); 並且可以指定當前頁面的編碼
    	lanuage: 聲明jsp中腳本是什麼類型, 只有一個值: java
    	pageEncoding: 用來聲明當前jsp頁面的編碼, 一般不寫
    	session: 用來聲明在當前jsp頁面上是否可以使用session對象
    	isELIgnored: 用來聲明在當前頁面上是否忽略el表達式, 默認值: false
    	import: 聲明當前jsp頁面導入了哪些類
    	errorPage: 聲明當前頁面運行時若產生了異常 轉到哪個頁面值
    	isErrorPage: 聲明當前頁面是否是一個錯誤頁面 默認值: false, 一旦聲明爲true, 在頁面是可以使用exception對象獲取錯誤信息
    --%>
    
  2. include 將其他的jsp頁面包含到當前頁面上
    <%@include file="inclue/footer.jsp" %>
  3. taglib 導入標籤庫
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -> 導入jstl標籤庫

1.3 Jsp內置對象


* jsp一共有9個內置對象
	變量名				  真實類型					作用
	pageContext		    PageContext			 	 當前頁面中共享數據,獲取其他的內置對象
    request				HttpServletRequest       一次請求中共享數據
    session             HttpSession				 一次會話中共享數據
    application			ServletContext			 整個web應用共享數據
    response			HttpServletResponse		 響應對象
    page				Object					 當前頁面(servlet)對象
    out                 JspWriter				 輸出對象
    config              ServletConfig			 servlet配置對象
    exception           Throwable				 異常對象		

* 常用
	1. pageContext
	2. request
	3. response
	4. out 用來在jsp頁面上直接通過java代碼輸入內容

1.4 PageContext


  • 獲取其他內置對象 getXxx方法 .例如:pageContext.getRequest()方法
  • 域對象,在當前頁面上可以共享數據
  • 可以操作其他的三個域對象
    • setAttribute(String key,String value,int 哪個域)
    • getAttribute(String key,int 哪個域)
    • removeAttribute(String key,int 哪個域)
  • findAttribute(String key)
    • 依次從jsp的四個域中從小到大(域的範圍)挨個查找指定的key.若找到直接返回,終止查找,若沒有返回null
    • jsp的四個域:
      • page:只是在當前頁面中
      • request:在一次請求中
      • session:在一次會話中
      • application:在項目中
<%--設置值--%>
<%
	request.setAttribute("msg", "request域中的值");
	// 放在session域中
	session.setAttribute("msg", "session域中的值");
	// 放在當前頁面域中
	pageContext.setAttribute("msg", "page域中的值");
%>

<%--獲取並輸出值--%>
<%=request.getAttribute("msg") %>
<%=session.getAttribute("msg") %>
<%=pageContext.getAttribute("msg") %>

<%--查找值--%>
<%=pageContext.findAttribute("msg") %>
<%=pageContext.findAttribute(msg1") %>



二. EL


EL: Expression Language, 可以替代JSP頁面中的JAVA代碼

servlet(增加數據)-> JSP(顯示數據)

2.1 獲取值(域中)


  • el表達式只能從域對象(4個域)中獲取數據

  • 語法

    • ${pageScope.鍵名} //從page域中獲取指定鍵名對應的值
    • ${requestScope.鍵名} //從request域中獲取指定鍵名對應的值
    • ${sessionScope.鍵名} //從session域中獲取指定鍵名對應的值
    • ${applicationScope.鍵名} //從application域中獲取指定鍵名對應的值

    簡化寫法:${鍵名}

    依次從小到大四個域中查找指定屬性的名字,找到了馬上返回且終止查找;若找不到返回""

EL示例:

${requestScope.student.address.schoolAddress}

${域對象.域對象中的屬性.屬性.屬性.級聯屬性}

2.2 EL操作符:


  • 點操作符 . --使用方便

  • 中括號操作符 [] --功能強大: 可以包含特殊字符(. 、 -), 可以訪問數據, 獲取變量值

例如存在變量name, 則可以${requestScope[name] }

EL表達式的隱式對象(不需要new就能使用的對象, 自帶的對象)

  • a. 作用於訪問對象(EL域對象): pageScope requestScope sessionScope applicationScope

如果不指定域對象, 則默認會根據 從小到大的順序 依次取值

  • b. 參數訪問對象: 獲取表單數據( request.getParameter() ->${param.name}、request.getParameterValues() -> ${paramValues.name[0]} )

也可以傳 超鏈接中的值: a.jsp?a=b&c=d 或者 地址欄中的值 a.jsp?a=b&c=d

  • c. JSP隱式對象: pageContext 獲取其他的jsp隱式對象; 因此如果要在EL中使用JSP的隱式對象, 可以通過pageContext間接獲取, 例如${pageContext.request}

獲取的方法:(去掉get 首字母小寫 去掉括號 即可)

  • ${pageContext.getSession()} -> ​${pageContext.session}
  • ${pageContext.getResponse} -> ${pageContext.response}`
獲取指定cookie的值: ${cookie.cookie的name屬性.value}
在jsp頁面上獲取項目的虛擬路徑:${pageContext.request.contextPath}

eg:

<body>
獲取指定cookie的value:${cookie.JSESSIONID.value}<br>
獲取項目的虛擬路徑:${pageContext.request.contextPath}<br/>
</body>



三. JSTL


核心標籤庫: 通用標籤庫, 條件標籤庫, 迭代標籤庫

3.1 a. 通用標籤庫


<c:set>賦值

i: 在某個作用於之中(4個範圍對象), 給某個變量賦值

<c:set var="變量名" value="變量值" scope="4個範圍對象的作用於" />

eg: <c:set var=“name” value=“zhangsan” scope=“request” />

ii: 在某個作用於之中(4個範圍對象), 給某個對象的屬性賦值(此種寫法, 不能指定scope屬性)

<c:set target="對象" property="對象的屬性" value="賦值" />

eg: <c:set target="${requestScope.student}" property=“sname” value"zxx" />

給map對象賦值:

<c:set target="${requestScope.countries}" property=“cn” value=“中國” />

注意: <c:set>可以給不存在的變量賦值 (但不能給不存在的對象賦值)

<c:out>取值

傳統EL: ${requestScope.student }

c:out方式: <c:out value="${requestScope.student }" />

c:out顯示不存在的數據並設置默認值:

<c:cout value="${requestScope.stu }" default=“zs-sss” />

<c:out value=’<a href=“https://www.baidu.com”>百度` escapeXml=“true” />

<c:out value=’<a href=“https://www.baidu.com”’>百度 escapedXml=“false” />

image-20200420212526370

<c:remove>移除

<c:remove var=“a” scope=“request” />

3.2 條件標籤庫


**注意: 後面的test引號中不要加多餘的空格!**比如EL表達式之後加個空格->將會當做字符串處理

\<c:if test="${10>2}" var="result" scope="request">

${requestScope.result}

\</c:if>

\<c:set var="role" value="學生" scope="request" />

<c:choose>
	<c:when test="..."> </c:when>
    <c:when test="..."> </c:when>
    <c:otherwise> </c:otherwise>
</c:choose>


3.3 迭代標籤庫

foreach的兩種形式

<c:forEach begin="0" end="5" step="1" varStatus="status">
	${status.index}
</c:forEach>
---
<%--
varStatus:記錄循環狀態
	count屬性:序號
--%>
---
<c:forEach var="name" items="${requestScope.names}">
    ${name}
</c:forEach>
---
<c:forEach var="student" items="${requestScope.students }">
    ${student.sname}-${student.sno}
</c:forEach>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章