什么是JSTL?
JSTL是apache對EL表達式的擴展(也就是說JSTL依賴EL),JSTL是標簽語言!JSTL標簽使用以來非常方便,它與jsp動作標簽一樣,只不過它不是JSP內置的標簽,需要我們自己導包,以及指定標簽庫而已!,JSTL是有tld文件(JSTL1.1含有5個tld文件)和標準處理類組成
如果你使用MyEclipse開發javaWeb,那么在把項目發布到Tomcat時,你會發現,MyEclipse會在lib目錄下存放jstl的Jar包!如果你沒有使用MyEclipse開發那么需要自己來導入這個JSTL的Jar包:jstl-1.2.jar
JSLT的下載:
下載之后解壓導入jstl.jar和standard.jsr包導入lib目錄下:
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
JSTL標簽庫:
JSTL一共包含四大標簽庫:
core:核心標簽庫,我們學習的重點fmt:格式化標簽庫,只需要學習兩個標簽即可sql:數據庫標簽庫,不需要學習了,它過時了xml:xml標簽庫,不需要學習了,它過時了使用taglib指令導入標簽庫:
除了JSP動作標簽外,使用其他第三方的標簽庫都需要:
導包在使用標簽的JSP頁面中使用taglib指令導入標簽庫下面是導入JSTL的core標簽庫:
<%@ taglib prefix=”c”:指定標簽庫的前綴,這個前綴可以隨便給值,但大家都會在使用core標簽庫時指定前綴為curi=”http://java.sun.com/jstl/core”:指定標簽庫的uri,它不一定是真實存在的網址,但它可以讓JSP找到標簽庫的描述文件
core標簽庫常用標簽:
out和set標簽:
<c:out value=”aaa”/> //輸出aaa字符串常量<c:out value=”${aaa}”/> //與${aaa}相同<c:out value=”${aaa}” default=”xxx”/> //當${aaa}不存在時,輸出xxx字符串<%request.setAttribute("a","<script>alert('hello');</script>");%><c:out value="${a }" default="xxx" escapeXml="false" />如果為escapeXml="false",則將其中的html、xml解析出來,還可以輸出轉義字符,所以會輸出hello<c:set var=”a” value=”hello”/> //在pageContext中添加name為a,value為hello的數據<c:set var="a" scope="session">hello</c:set> //也是輸出hello<c:set var=”a” value=”hello” scope=”session”/> //在session中添加name為a,value為hello的數據remove標簽:
<%pageContext.setAttribute("a","pageContext");request.setAttribute("a","session");session.setAttribute("a","session"); application.setAttribute("a","application");%><c:remove var="a"/> //刪除所有域中name為a的數據!<c:out value="${a}" default="none"/><c:remove var="a" scope=”page”/> //刪除pageContext中name為a的數據catch標簽:
<c:catch var="error"> <%=10/0></c:catch>//捕獲異常,后面的代碼繼續執行<c:out value="${error}"/> //輸出異常信息if標簽:
if標簽的test屬性必須是一個boolean類型的值,如果test的值為true,那么執行if標簽的內容,否則不執行
<c:set var="a" value="hello"/> <c:if test="${not empty a }" var="result" scope="session"> <c:out value="正確"/> </c:if><c:out value="${result}"></c:out> //輸出"正確"choose,when,otherwise標簽:
choose標簽對應Java中的if/else,when標簽的test為true時,會執行這個when的內容,當所有when標簽的test都為false時,才會執行otherwise標簽的內容,choose標簽可以省略不寫
<c:set var="score" value="${param.score }"/> <c:choose> <c:when test="${score > 100 || score < 0}">錯誤的分數:${score }</c:when> <c:when test="${score >= 90 }">A級</c:when> <c:when test="${score >= 80 }">B級</c:when> <c:when test="${score >= 70 }">C級</c:when> <c:when test="${score >= 60 }">D級</c:when> <c:otherwise>E級</c:otherwise> </c:choose>forEach標簽:
forEach當前就是循環標簽了,forEach標簽有多種兩種使用方式:
使用循環變量,指定開始和結束值,類似for(int i = 1; i <= 10; i++) {}循環遍歷集合,類似for(Object o : 集合)循環變量:
<c:set var="sum" value="0" /> <c:forEach var="i" begin="1" end="10"> <c:set var="sum" value="${sum + i}" /> </c:forEach> <c:set var="sum" value="0" /> <c:forEach var="i" begin="1" end="10" step ="2"> <c:set var="sum" value="${sum + i}" /> </c:forEach>遍歷集合或數組方式:
<% String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"}; pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }"> <c:out value="name: ${item }"/><br/> </c:forEach>遍歷List:
<% List<String> names = new ArrayList<String>(); names.add("zhangSan"); names.add("liSi"); names.add("wangWu"); names.add("zhaoLiu"); pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }" begin="1" end="3"> <c:out value="name: ${item }"/><br/> </c:forEach>遍歷Map:
<% Map<String,String> stu = new LinkedHashMap<String,String>(); stu.put("number", "N_1001"); stu.put("name", "zhangSan"); stu.put("age", "23"); stu.put("sex", "male"); pageContext.setAttribute("stu", stu); %> <c:forEach var="item" items="${stu }"> <c:out value="${item.key }: ${item.value }"/><br/> </c:forEach>forEach標簽還有一個屬性:varStatus,這個屬性用來指定接收”循環狀態”的變量名,例如:<forEach varStatus=”vs” …/>,
這時就可以使用vs這個變量來獲取循環的狀態了
forTokens標簽:
通過指定分隔符將字符串分隔為一個數組然后迭代它們,delims:分隔符
<c:forTokens items="google,runoob,taobao" delims="," var="name"> <c:out value="${name}"/><p></c:forTokens> //輸出google runoob taobaoc:import 標簽:
使用c:import標簽可以包含一個FTP服務器中不同的網頁內容
<c:import var="data" url="http://www.runoob.com"/><c:out value="${data}"/> //以上程序將會打印http://www.runoob.com"頁面的源代碼<c:import url="/import.jsp" context="/WebProjext"/> //引入同一個服務器下的另外一個Projectc:redirect>標簽:
c:redirect標簽通過自動重寫URL來將瀏覽器重定向至一個新的URL,它提供內容相關的URL,并且支持c:param標簽,context:緊接著一個本地網絡應用程序的名稱
<c:redirect url="if.jsp"> <c:param name="aa" value="123"></c:param>//傳參數</c:redirect> //用${param.aa}可以獲得url標簽:該標簽會在需要重寫URL時添加
<c:url value="/"/> //輸出上下文路徑:/項目名/<c:url value="/" var="a" scope="request"/> //把本該輸出的結果賦給變量a,范圍為request<c:url value="/AServlet"> <c:param name="username" value="abc"/> <c:param name="passWord" value="123"/></c:url> //輸出:/項目名/AServlet?username=abc&password=123,如果參數中包含中文,那么會自動使用URL編碼!fmt標簽庫常用標簽:
fmt標簽庫是用來格式化輸出的,通常需要格式化的有時間和數字
格式化時間:
<% Date date = new Date(); pageContext.setAttribute("d", date); %> <fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss"/>格式化數字:
<% double d1 = 3.5; double d2 = 4.4; pageContext.setAttribute("d1", d1); pageContext.setAttribute("d2", d2); %> <fmt:formatNumber value="${d1 }" pattern="0.00"/><br/> <fmt:formatNumber value="${d2 }" pattern="#.##"/>JSTL(fn函數):
首先,我們要在頁面的最上方引用:
<%@ taglib prefix="fn" uri="http://Java.sun.com/jsp/jstl/functions" %>基本函數使用:
fn:contains(string, substring)
<c:if test="${fn:contains("你好","你好了嗎")}"/> //前面的字符串是否包含后面的fn:containsIgnoreCase(string, substring) //忽略大小寫的包含fn:endsWith(string, suffix) //假如參數string以參數suffix結尾,返回truefn:indexOf(string, substring) //返回參數substring在參數string中第一次出現的位置fn:escapeXml(string)
將有非凡意義的XML (和HTML)轉換為對應的XML,character entity code,并返回
<c:out value="${fn:excapeXml('<book>歌曲</book>')}"/> <!--輸出<book>歌曲<book>-->JSP訪問JavaBean:
1.導入javaBean類
<%@ page import="com.anllin.bean.Person" %>2.聲明javaBean對象
<jsp:useBean id="person" class="com.anllin.bean.Person"></jsp:useBean>其實相當于
<% Person person = new Person(); %>Id表示生成一個類的實例,一般id不能重復,用于表示不同的對象,如果相同則表示同一個對象,這種情況下jsp會報錯
3.訪問javaBean屬性
<jsp:setProperty property="name" name="person" value="jack"/><jsp:getProperty property="name" name="person"/><br>其實相當于
<% person.setName("jack"); person.getName();%>也可以使用JSTL:
<c:set target="${person}" property="name" value="jark"/>//相當于:<c:set target="${person}" property="name">jark</c:set><c:out value="${person.name}"/>具體介紹:http://www.cnblogs.com/zfc2201/archive/2011/08/17/2143615.html
EL(Expression Language)表達式語言:用于計算和輸出存儲在標志位置(page、request、session、application)的java對象的值
EL是JSP2.0規范的一部分,只要容器支持Servlet2.4/JSP2.0,就可以在JSP2.0網頁中直接使用EL
基本格式:${表達式}
所有的EL都是以"${"開始,以"}"結尾表達式與開始符和終結符的空格被忽略表達式的值為null,則在頁面中顯示為一個空字符串,而不是null運算符的介紹:
算術運算:+、-、*、/或div、%或mod關系運算:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge邏輯運算:&&或and、||或or、!或not特殊運算:empty(是否為null或空字符串)、?:(三元運算符)轉義符:/${變量}EL 提供”.”和”[ ]”兩種運算符來存取數據:
當要存取的屬性名稱中包含一些特殊字符,如.或?等并非字母或數字的符號,就一定要使用”[ ]”,例如:
${user.My-Name}應當改為${user["My-Name"] }如果要動態取值時,就可以用“[ ]“來做,而“.“無法做到動態取值,例如:
${sessionScope.user[data]}中data 是一個變量EL常用的隱式對象:
作用域(以下11個EL作用域名稱也是EL提供的隱式對象):
EL中存取變量:
EL存取變量數據的方法很簡單,例如:${username},它的意思是取出某一范圍中名稱為username的變量
因為我們并沒有指定哪一個范圍的username,所以它會依序從Page、Request、Session、Application范圍查找
假如途中找到username,就直接回傳,不再繼續找下去,但是假如全部的范圍都沒有找到時,就回傳null
屬性范圍在EL中的名稱:
特別強調:
1.注意當表達式根據名稱引用這些對象之一時,返回的是相應的對象而不是相應的屬性,例如:即使現有的pageContext 屬性包含某些其他值,${pageContext}也返回 PageContext 對象
2.注意 <%@ page isELIgnored=”true” %> 表示是否禁用EL語言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默認的啟用EL語言
基本使用舉例:
< %=request.getParameter(“username”)% >等價于${ param.username } //注意EL會進行自動類型轉換新聞熱點
疑難解答