對於JSTL和EL之間的關系,這個問題對於初學JSP的朋友來說,估計是個問題,下面來詳細介紹一下JSTL和EL表達式他們之間的關系,以及JSTL和EL一些相關概念!
EL相關概念
JSTL一般要配合EL表達式一起使用,來實現在jsp中不出現java代碼段。所以我們先來學習EL表達式
EL主要用於查找作用域中的數據,然後對它們執行簡單操作;它不是編程語言,甚至不是腳本編制語言。通常與 JSTL 標記一起作用,能用簡單而又方便的符號來表示復雜的行為。
EL基本格式
EL表達式的格式:用美元符號($)定界,內容包括在花括號({})中;
例如: ${loginInfoBean.suser}
此外,您可以將多個表達式與靜態文本組合在一起以通過字符串並置來構造動態屬性值;
例如:Hello {loginInfoBean.suser} ${loginInfoBean.spwd}
EL語法組成-標識符
EL表達式由標識符、存取器、文字和運算符組成。
標識符用來標識存儲在作用域中的數據對象。EL 有 11 個保留標識符,對應於 11個EL隱式對象。除了11隱式對象外,假定所有其它標識符都用來標識作用域的變量。
標識符
例:
${abc} 相當於<%=pageContext.findAttribute(“abc”)%>
${og_1} <%=pageContext.findAttribute(“og_1”)%>
…等等;就是說{}內的標識符除了11個保留字之外都表示作用域中的數據對應的名.
${requestScope}中的requestScope是11個EL隱式對象之一,它不再表示作用域中數據,而是表示request作用域;
EL隱藏對象
pageContext PageContext 實例對應於當前頁面的處理
pageScope 與頁面作用域屬性的名稱和值相關聯的Map類
requestScope 與請求作用域屬性的名稱和值相關聯的Map類
sessionScope 與會話作用域屬性的名稱和值相關聯的Map類
applicationScope 與應用程序作用域屬性的名稱和值相關聯的Map類
param 按名稱存儲請求參數的主要值的 Map 類
paramValues 將請求參數的所有值作為 String 數組存儲的 Map 類
Header 按名稱存儲請求頭主要值的 Map 類
headerValues 將請求頭的所有值作為 String 數組存儲的 Map 類
cookie 按名稱存儲請求附帶的 cookie 的 Map 類
initParam 按名稱存儲 Web 應用程序上下文初始化參數的Map類
EL存取器
存取器用來檢索對象的特性或集合的元素。
存取器: 通過 “[]” 或 “.” 符號獲取相關數據
例:
${userBean.suser} 或 ${userBean[“suser”]}
//獲取輸出bean中的suser屬性值;
${mcType[“id”]} //獲取map中key為id對應的值;
EL運算符
運算符允許對數據和文字進行組合以及比較。
EL運算符:
類別 運算符
算術運算符 +、-、*、/(或 div)和 %(或 mod)
關系運算符 ==(或eq)、!=(或ne)、<(或lt)、>(或gt)、<=(或le) 和 >=(或ge)
邏輯運算符 &&(或 and)、||(或or)和 !(或 not)
驗證運算符 empty
驗證運算符(empty):對於驗證數據特別有用。empty 運算符采用單個表達式作為其變量(也即,${empty input}),並返回一個布爾值,該布爾值表示對表達式求值的結果是不是“空”值。求值結果為 null 的表達式被認為是空,即無元素的集合或數組。如果參數是對長度為零的 String 求值所得的結果,則 empty 運算符也將返回 true。
EL文字
文字表示固定的值 — 數字、字符、字符串、布爾型或空值。
在 EL 表達式中,數字、字符串、布爾值和 null 都可以被指定為文字值。字符串可以用單引號或雙引號定界。布爾值被指定為 true 和 false
JSTL是什麼
JSTL(JSP Standard Tag Library,JSP標准標簽庫)是一個不斷完善的開放源代碼的JSP標簽庫,是由apache的jakarta小組來維護的。JSTL1.0 由四個定制標記庫(core、format、xml 和 sql)和一對通用標記庫驗證器組成。core 標記庫提供了定制操作,通過限制了作用域的變量管理數據,以及執行頁面內容的迭代和條件操作。它還提供了用來生成和操作 URL 的標記。format 標記庫定義了用來格式化數據(尤其是數字和日期)的操作。它還支持使用本地化資源束進行JSP頁面的國際化。xml 庫包含一些標記,這些標記用來操作通過XML表示的數據,而 sql 庫定義了用來查詢關系數據庫的操作。 兩個 JSTL 標記庫驗證器允許開發人員在其 JSP 應用程序中強制使用編碼標准。
如果要使用JSTL,則必須引用jstl.jar和 standard.jar兩個包。
為什麼要用JSTL
我們JSP用於開發信息展現頁非常方便;也可以嵌入java代碼(scriptlet、表達式和聲明)代碼用來實現相關邏輯控制。看下面程序。但這樣做會帶來如下問題:
jsp維護難度增加;
出錯提示不明確,不容易調試;
分工不明確;(即jsp開發者是美工,也是程序員);
最終增加程序的開發成本;
解決上面的問題可以使用定制標記庫,JSTL使JSP開發者可以減少對腳本元素的需求,甚至可以不需要它們,從而避免了相關的維護成本。使分工更明確。
<% if (session.getAttribute(“user”).equals(“member”)) { %>
<p>Welcome, member!</p>
<% } else { %>
<p>Welcome, guest!</p>
<% } %>
JSTL一般配合EL一起使用,因此先看看EL.
JSTL部署
在EE應用程序中部署JSTL有兩種方式:
已存在的工程上部署
將jstl.jar和standard.jar兩個包考到現有工程
WebRoot / WEB-INF / lib 目錄下
將相關的 .tld文件考到現有工程 WebRoot / WEB-INF 目錄下;
也可通過eclipse在已存在
工程上部署
新建工程的時候直接部署
在JSP使用JSTL-core標簽庫
core在jsp中的使用:
在 web.xml 中添加
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
</jsp-config>
在jsp文件中添加
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>或<%@ taglib prefix="c" uri="/WEB-INF/c.tld" %>
使用<c:out value=“HelloWorld” />
Core的操作作用域變量標簽
獲取輸出作用域中變量.
<c:out > 屬性: value [default] [escapeXml]
定義作用域中變量
<c:set > 屬性: value var [scope]
刪除作用域中變量
<c:remove > 屬性: var [scope]
Core的條件控制標簽
單分支條件
<c:if > 屬性:test [var] [scope]
多分支條件
<c:choose >
<c:when > 屬性: test
<c:otherwise >
Core的其它標簽
輸出轉換成的URL:
<c:url > 屬性:value [context] [var] [scope]
和<jsp:include >相似用於包含其它頁面的內容:
<c:import >屬性:url [context] [charEncoding] [var] [scope]
重定向
<c:redirect >屬性: url [context]
與<c:url><c:import><c:redirect>配合使用,用於傳參
<c:param >屬性: name value
Core的循環控制標簽
實現簡單循環
<c:forEach > var='item' begin='5' end='10' step='2‘ varStatus=‘’
實現迭代(遍歷)
<c:forEach > items='' var='item‘ varStatus=‘’
屬性varStatus和var相似設置一個作用域變量;只是varStatus作用域變量中存的是包括運行狀態的對象;此對象包含如下屬性:
current index count first last begin end step
簡單循環
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ taglib prefix="c" uri="/WEB-INF/c.tld" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>testjstl1</title>
</head>
<body>
<c:forEach var="i" step="1" begin="1" end="100">
${i} <br>
</c:forEach>
</body>
</html>
循環迭代
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ taglib prefix="c" uri="/WEB-INF/c.tld" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>testjstl1</title>
</head>
<body>
<c:forEach var="mcBean" items="${mcList}" varStatus="mcStatus">
當前遍歷索引:${mcStatus.index} ; 商品名:${mcBean.sname} ; .... <br>
</c:forEach>
</body>
</html>
在JSP使用JSTL-format標簽庫
format在jsp中的使用:
在 web.xml 中添加
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
</jsp-config>
在jsp文件中添加
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
使用
<fmt:formatDate value=“” pattern=“yyyy-MM-dd” />
Format常用標簽
格式化輸出日期:
<fmt:formatDate > value type var pattern
type取值:
short: 10/19/00 6:07 PM
medium: Oct 19, 2000 6:07:01 PM
long: October 19, 2000 6:07:01 PM MDT
full: Thursday, October 19, 2000 6:07:01 PM MDT
例: <fmt:formatDate value=“” pattern=“yyyy/MM/dd” />
格式化輸出數字:
<fmt:formatNumber> value var pattern
例:<fmt:formatNumber value=“” pattern=“###.##” />
format實例
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ taglib prefix="fmt" uri="/WEB-INF/fmt.tld" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>testjstl1</title>
</head>
<body>
<jsp:useBean id="curDate" class="java.util.Date" scope="page"/>
<fmt:formatDate value="${curDate}" pattern="yyyy-MM-dd HH:mm:ss"/><br>
<fmt:formatNumber value="10.32898432" pattern="#.##"/><br>
<% request.setAttribute("var1",3.1415926); %>
<fmt:formatNumber value="${var1}" pattern="#.##"/><br>
</body>
</html>
到這裡我們對JSTL和EL之間的關系有了一定的認識,只要我們經常使用這些技術相信能很快的認識到這些技術的優缺點,比起死記硬背來說,理解才是真正的理解了.