對於JSTL和EL之間的關係,這個問題對於初學JSP的朋友來講,估計是個問題,下面來詳細介紹一下JSTL和EL表達式他們之間的關係,以及JSTL和EL一些相關概念!html
EL相關概念
JSTL通常要配合EL表達式一塊兒使用,來實如今jsp中不出現java代碼段。因此咱們先來學習EL表達式java
EL主要用於查找做用域中的數據,而後對它們執行簡單操做;它不是編程語言,甚至不是腳本編制語言。一般與 JSTL 標記一塊兒做用,能用簡單而又方便的符號來表示複雜的行爲。程序員
EL基本格式
EL表達式的格式:用美圓符號($)定界,內容包括在花括號({})中;
例如: ${loginInfoBean.suser}web
此外,您能夠將多個表達式與靜態文本組合在一塊兒以經過字符串並置來構造動態屬性值;
例如:Hello {loginInfoBean.suser} ${loginInfoBean.spwd}sql
EL語法組成-標識符
EL表達式由標識符、存取器、文字和運算符組成。數據庫
標識符用來標識存儲在做用域中的數據對象。EL 有 11 個保留標識符,對應於 11個EL隱式對象。除了11隱式對象外,假定全部其它標識符都用來標識做用域的變量。apache
標識符
例:
${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類cookie
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="" step="" begin="" end="" var="" varStatus=""></c:forEach>
屬性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>