JavaWeb開發之JSTL標簽庫的運用、 自定義EL函數、自定義標簽(帶屬性的、帶標簽體的)。本站提示廣大學習愛好者:(JavaWeb開發之JSTL標簽庫的運用、 自定義EL函數、自定義標簽(帶屬性的、帶標簽體的))文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb開發之JSTL標簽庫的運用、 自定義EL函數、自定義標簽(帶屬性的、帶標簽體的)正文
JSTL
JSTL簡介:
JSTL的全稱:JSP Standard Tag Library,JSP規范標簽庫
JSTL的作用:
提供應Java Web開發人員一個規范通用的標簽函數庫
和EL來取代傳統直接在頁面上嵌入Java順序(Scripting)的做法,以進步順序可讀性、維護性和方便性
JSTL的版本:
JSTL的次要版本是1.0、1.1和1.2(區別不大)
1.0版本EL表達式還沒有歸入官方標准
1.1和1.2版本EL表達式曾經歸入了官方標准
JSTL1.1 下載相應的jar包
JSTL的下載
JSTL次要由Apache組織的Jakarta Project完成
http://tomcat.apache.org/taglibs/standard/
容器必需支持Servlet2.4且JSP2.0以上的版本
JavaEE1.4
JSTL導入jar包
解緊縮後將lib中的jstl.jar、standard.jar 復制到WEB使用順序的WEB-INF\lib下
JSTL標簽庫
中心標簽庫(core)---c(重點) XML(x:操作xml的標簽庫) SQL(sql標簽庫) FMT(fmt:國際化標簽庫) JSTL函數(EL函數)elJSTL疾速入門
導入jar包(jstl.jar和standard.jar)
其中jstl.jar是編譯後的Java類文件,standard.jar定義的是規范接口
新建JSP的頁面
在頁面中引入中心標簽庫
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL標簽庫關於導入版本的問題
http://java.sun.com/jsp/core 1.1或許1.2版本(運用該版本)
http://java.sun.com/jstl/core 1.0版本(不支持EL表達式)
<c:out>標簽輸入常量或許域范圍中的變量(value屬性,運用EL表達式)
輸入默許值(default屬性)
默許HTML標簽不本義(escapeXml)
屬性名
能否支持EL
屬性類型
屬性描繪
value
true
Object
指定要輸入的內容
escapeXml
true
Boolean
指定能否將>、<、&、'、" 等
特殊字符停止HTML編碼轉換
後再停止輸入。默許值是true。
default
true
Object
指定假如value屬性的值為null時所輸入的默許值
<!-- c:out 輸入數據到閱讀器 --> <c:out value="Hello c out "></c:out> Hello c out <!-- 輸入一個變量 --> <c:set var="m" value="10" scope="page"/> <c:out value="${m}"></c:out> ${m } <!-- 本義HTML 默許本義,經過設置escapeXml 為false 不停止本義--> <c:out value="<a href='xxx'>link</a>" /> ${fn:escapeXml("<a href='xxx'>link</a>") } <!-- 允許輸入默許值 ,假如city不存在,輸入北京--> <c:out value="${city}" default="北京"></c:out> ${empty city?"北京":city }
在WebRoot下新建jstl文件夾,在文件夾下新建out.jsp
實例代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>傳統方式</h4> <%= "Hello" %> <% int a = 10; request.setAttribute("name", "xy"); %> <%= a %> <h4>JSTL的方式 </h4> <c:out value="Hello"></c:out> <c:out value="${name }"></c:out> <!-- "" --> <c:out value="${ city }" default="北京"></c:out> <c:out value="<a href='#'>超鏈接</a>" escapeXml="false"/> <c:out value="<a href='#'>超鏈接2</a>" escapeXml="true"/> </body> </html>
<c:set>標簽
向4個域中存入值。(var value scope屬性) 設置Web域中的java.util.Map 類型的屬性對象或JavaBean類型的屬性對象的屬性(target property value屬性)
屬性名
能否支持EL
屬性類型
屬性描繪
value
true
Object
用於指定屬性
var
false
String
用於指定要設置的Web域屬性的稱號
scope
false
String
用於指定屬性所在的Web域
target
true
Object
用於指定要設置屬性的對象,這個對象必需是
JavaBean對象或java.util.Map對象
property
true
String
用於指定以後要為對象設置的屬性稱號
在WebRoot/jstl下新建set.jsp
代碼如下:
<%@page import="cn.itcast.vo.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>傳統方式</h4> <% pageContext.setAttribute("name", "10", pageContext.REQUEST_SCOPE); %> <% User user = new User(); user.setUsername("美美"); user.setPassword("123"); request.setAttribute("user", user); %> ${ user.username } <h4>JSTL方式</h4> <c:set var="i" value="10" scope="request" ></c:set> ${ i } <c:set target="${ user }" property="username" value="小鳳"></c:set> ${ user.username } </body> </html>
<c:remove>標簽
<c:remoive>標簽用於刪除各種Web域中的屬性
其語法格式如下:
<c:remove var="varName" [scope="{page|request|session|application}"]>
假如不設置,默許是pageContext域范圍外調找刪除值。
用法示例:
<% request.setAttribute("age",20); // 刪除age request.removeAttribute("age"); %> <c:set var="age" value="20" scope="request"></c:set> <c:remove var="age" scope="request"/>
在WebRoot/jstl目錄下新建remove.jsp
實例代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>傳統方式</h4> <% request.setAttribute("name", "美美"); request.removeAttribute("name"); %> <c:set var="name" value="小鳳" scope="page"></c:set> ${ name } <c:remove var="name" scope="page"/> ${name } </body> </html>
<c:catch>標簽
關鍵代碼:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <c:catch var="myex“ > <% 10/0; %> </c:catch>
異常:<c:out value="${myex}" /> ${myex}<br />
異常 myex.getMessage:<c:out value="${myex.message}" /><br />
異常 myex.getCause:<c:out value="${myex.cause}" /><br />
異常 myex.getStackTrace:<c:out value="${myex.stackTrace}" />
在WebRoot/jstl下新建catch.jsp
實例代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>傳統方式</h4> <% try{ }catch(Exception e){ e.printStackTrace(); } %> <h4>JSTL的方式</h4> <c:catch var="e"> <% int a = 10/0; %> </c:catch> ${ e.message } </body> </html>
<c:if>標簽
<c:if test=""> 標簽可以結構復雜的"if-then"構造的條件表達式
屬性名 能否支持EL 屬性類型 屬性描繪 test true boolean 決議能否處置標簽體中的內容的條件表達式 var false String 用於指定將test屬性的執行後果保管到某個Web域中的某個屬性的稱號 scope false String 指定將test屬性的執行後果保管到哪個Web域中
留意:沒有<c:else>
在WebRoot/jstl下新建if.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>傳統方式</h4> <% int a = 10; if(a >= 10){ out.print("a >= 10"); }else{ out.print("a < 10"); } %> <h4>JSTL方式</h4> <c:set var="i" value="10" scope="page"></c:set> <c:if test="${ i ge 10 }" var="x" scope="page"> i >= 10 </c:if> <c:if test="${ i lt 10 }"> i < 10 </c:if> ${ x } </body> </html>
<c:choose> <c:choose>標簽用於指定多個條件選擇的組合邊界,它必需與<c:when>和<c:otherwise>標簽一同運用。運用<c:choose>,<c:when>,<c:otherwise>三個標簽,可以結構相似於"if-else if-else"的復雜條件判別構造 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <c:set value="${param.count}" var="count“ /> pageContext(count,2) <c:choose> <c:when test="${count == 0}">
對不起,沒有契合您要求的記載。
</c:when>
<c:otherwise>
契合您要求的記載共有${count}條.
</c:otherwise>
</c:choose>
在WebRoot/jstl目錄下新建choose.jsp
代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>獲取參數</h4> <%= request.getParameter("username") %> <h4>傳統方式</h4> <% int a = 10; if(a >= 10 ){ out.print("a >= 10"); }else if(a < 10){ out.print("a < 10"); }else{ out.print("其他"); } %> <h4>JSTL方式</h4> <c:set var="i" value="10" scope="page"></c:set> <c:choose> <c:when test="${ i ge 10 }"> i >= 10 </c:when> <c:when test="${ i lt 10 }"> i < 10 </c:when> <c:otherwise> 其他 </c:otherwise> </c:choose> </body> </html>
<c:forEach>標簽
<c:forEach>標簽用於對一個集合對象中的元素停止循環迭代操作,或許按指定的次數反復迭代執行標簽體中的內容
屬性名
能否支持EL
屬性類型
屬性描繪
var
false
String
指定將以後迭代到的元素保管到page這個域中的屬性稱號
varStatus
false
String
記住用於保管迭代信息的對象
items
true
任何支持的類型
將要迭代的集合對象
begin
true
int
假如指定items屬性,就從集合中的第begin個元素開端停止迭代
,begin的索引值從0開端編號,假如沒有指定items屬性,就從
begin指定的值開端迭代,直到end值時完畢迭代
end
true
int
與begin屬性相似
step
true
int
指定迭代的步長,即迭代因子的迭代增量
<c:forEach>遍歷集合
遍歷數組或許集合:
var:代表遍歷的每一個元素
items:要迭代的集合對象
獲取遍歷的內容:${ xxx }
遍歷Map集合:
var:代表key與value的關系entry
items:要迭代的map集合
獲取遍歷的內容:${ xxx.key } ----${ xxx.value }
遍歷對象集合:
var:代表遍歷的每一個對象
items:要迭代的集合
獲取遍歷的內容: ${ xxx.對象的屬性 }
<c:forEach>迭代數據
從1遍歷到10:
var:定義變量
begin:從哪開端
end:到哪完畢
step:迭代步長(相當於x+=step)
計算從1加到10的和:
定義變量sum,值為0
經過forEach循環1到10,每循環一次加到另一個變量中
在循環兩頭定義變量,每次計算到該變量中
<c:set var="sum" value="0" scope="page"></c:set> <c:forEach begin="1" end="10" step="1" var="i"> <c:set var="sum" value="${sum + i}" scope="page"></c:set> </c:forEach> ${sum }
varStatus屬性:
記載迭代相關的信息:
屬性 類型 意義 index number 如今指到成員的索引 count number 總共指到成員的總數 first boolean 如今指到的成員能否是第一個成員 last boolean 如今指到的成員能否是最後一個成員
遍歷10到100的偶數,每到第三個數,顯示白色:
<c:forEach begin="10" end="100" step="2" var="i" varStatus="status"> <c:if test="${status.count % 3 == 0}"> <font color="red">${i }</font> </c:if> <c:if test="${status.count % 3 != 0}"> <font color="blue">${i }</font> </c:if> </c:forEach>
在WebRoot/jstl目錄下新建forEach.jsp
實例代碼如下:
<%@page import="cn.itcast.vo.User"%> <%@page import="java.util.HashMap"%> <%@page import="java.util.Map"%> <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>遍歷數組</h4> <% String [] arrs = {"美美","小鳳","芙蓉","小蒼"}; request.setAttribute("arrs", arrs); %> <!-- for(String s : arrs){ } --> <c:forEach var="s" items="${ arrs }"> ${ s } </c:forEach> <h4>遍歷集合</h4> <% List<String> list = new ArrayList<String>(); list.add("美美"); list.add("小鳳"); list.add("芙蓉"); list.add("小澤"); request.setAttribute("list", list); %> <c:forEach var="s" items="${ list }"> ${ s } </c:forEach> <h4>遍歷Map集合</h4> <% Map<String,String> map = new HashMap<String,String>(); map.put("aa", "美美"); map.put("bb", "小鳳"); map.put("cc", "芙蓉"); request.setAttribute("map", map); %> <c:forEach var="entry" items="${ map }"> ${ entry.key } -- ${ entry.value } </c:forEach> <h4>遍歷對象的集合</h4> <% List<User> uList = new ArrayList<User>(); uList.add(new User("美美","123")); uList.add(new User("小風","234")); uList.add(new User("芙蓉","345")); request.setAttribute("uList", uList); %> <c:forEach var="user" items="${ uList }"> ${ user.username } -- ${ user.password } </c:forEach> <h4>迭代數據</h4> <h4>迭代從1到10</h4> <c:forEach var="i" begin="1" end="10" step="2"> ${ i } </c:forEach> <h4>計算從1加到100的和</h4> <c:set var="sum" value="0" scope="page"></c:set> <c:forEach var="i" begin="1" end="100" step="1" varStatus="status"> <c:set var="sum" value="${ sum + i }"></c:set> </c:forEach> ${ sum } <h4>遍歷10到100的偶數,每到第3個數,顯示白色</h4> <c:forEach var="i" begin="10" end="100" step="2" varStatus="status"> <c:choose> <c:when test="${ status.first }"> <font color="blue">${ i }</font> </c:when> <c:when test="${ status.count % 3 eq 0 }"> <font color="red">${ i }</font> </c:when> <c:otherwise> ${ i } </c:otherwise> </c:choose> </c:forEach> </body> </html>
<c:forTokens>
用來切分字符串
稱號 闡明 EL 類型 必需 默許值 var 用來寄存如今指到的成員 N String 否 無 items 被迭代的字符串 Y String 是 無 delims 定義用來聯系字符串的字符 N String 是 無 varStatus 用來寄存如今指到的相關成員信息 N String 否 無 begin 開端的地位 Y int 否 0 end 完畢的地位 Y int 否 最後一個
<c:set var="s" value="aaa,bbb,ccc" scope="page"></c:set> <c:forTokens items="${s}" delims="," var="e"> ${e } </c:forTokens>
語法格式:
<c:forTokens items=要切分的字符串 delims=按著什麼格式切分 var=定義變量 [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> //body內容 </c:forTokens>
在WebRoot/jstl目錄下新建forTokens.jsp
代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>分隔字符串</h4> <c:set var="i" value="aa,bb,cc" scope="page"></c:set> <c:forTokens items="${i }" delims="," var="x"> ${ x } </c:forTokens> </body> </html>
<c:param>標簽
在JSP頁面停止URL的相關操作時,常常要在URL地址前面附加一些參數。<c:param>標簽可以嵌套在<c:import>、<c:url>或<c:redirect>標簽內,為這些標簽所運用的URL地址附加參數。 <c:param>標簽在為一個URL地址附加參數時,將自動對參數值停止URL編碼,例如:假如傳的參數值為“中國”,則將其轉換為“%d6%d0%b9%fa”後再附加到URL地址前面,這也就是運用<c:param>標簽的最大益處 示例:<c:param name="name" value="value" /><c:import>標簽
稱號 闡明 EL 類型 必需 默許值 url 一文件被包括的地址 Y String 是 無 context 項目虛擬途徑 Y String 否 無 var 貯存被包括的文件的內容(以String類型存入) Y String 否 無 scope var變量的JSP范圍 N String 否 page charEncoding 被包括文件的內容的編碼方式 Y String 否 無 varReader 貯存被包括的文件的內容(以Reader類型存入) N String 否
<!-- 引入foreach.jsp 效果相似包括--> <c:import url="/jstl/foreach.jsp" context="/day8"></c:import> <hr/> <!-- 引入不顯示,將內容保管另一個變量中 --> <c:import url="/jstl/foreach.jsp" context="/day8" var="content" scope="page"></c:import> ${content } <c:import url="http://java.sun.com" > <c:param name="test" value="1234" /> </c:import>
在WebRoot/jstl/下新建 import.jsp(包括choose.jsp 並在choose.jsp 中獲取參數)
實例代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>JSTL方式</h4> <c:import url="/jstl/choose.jsp" context="/day13" var="i" scope="page"> <c:param name="username" value="meimei"></c:param> </c:import> ${ i } </body> </html>
<c:url>標簽
<c:url>標簽用於在JSP頁面中結構一個URL地址,其次要目的是完成URL重寫。URL重寫就是將會話標識以參數方式附加在URL地址前面。(相似於Session追蹤 尤其是當閱讀器禁用cookie後,就是說完成了session追蹤的功用)
屬性名 能否支持EL 屬性類型 屬性描繪 value true String 指定要結構的URL var false String 指定將結構出的URL後果保管到Web域中的屬性稱號 scope false String 指定將結構出的URL後果保管在哪個域中
在WebRoot/jstl/下新建url.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>JSTL方式</h4> <c:url var="i" value="/jstl/choose.jsp" scope="request" context="/day13"> <c:param name="username" value="xiaofeng"></c:param> </c:url> <c:set var="s" value="劉勳" scope="session"></c:set> <a href="${ i }">choose</a> <br> i= ${i } <br> <% String url = "/day12/index.jsp"; url = response.encodeURL(url); %> <!-- 將/day8/index.jsp 停止url重寫,保管page范圍 myurl中 --> <c:url value="/index.jsp" context="/day13" var="myurl" scope="page" /> url= <%=url %> <br> myurl= ${myurl } <br> <!-- 經過c:url 結合 c:param 對中文完成URL編碼 --> <c:url value="/login" context="/day13" var="myurl2" scope="page"> <c:param name="username" value="張三"></c:param> </c:url> myurl2= ${myurl2 } <br> </body> </html>
修正choose.jsp 如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <c:out value="${s }"></c:out> <h4>獲取參數</h4> <%= request.getParameter("username") %> <h4>傳統方式</h4> <% int a = 10; if(a >= 10 ){ out.print("a >= 10"); }else if(a < 10){ out.print("a < 10"); }else{ out.print("其他"); } %> <h4>JSTL方式</h4> <c:set var="i" value="10" scope="page"></c:set> <c:choose> <c:when test="${ i ge 10 }"> i >= 10 </c:when> <c:when test="${ i lt 10 }"> i < 10 </c:when> <c:otherwise> 其他 </c:otherwise> </c:choose> </body> </html>
禁用閱讀器的cookie後,運轉如下:
點擊choose跳轉到choose.jsp
<c:redirect>標簽
<c:redirect>標簽用於完成懇求重定向
屬性名
能否支持EL
屬性類型
屬性描繪
url
true
String
指定要轉發或重定向到的目的資源的URL地址
context
true
String
當要運用絕對途徑重定向到同一個服務器下的其他WEB使用順序中的
資源時,context屬性指定其他WEB使用順序的稱號
留意:假如重定向第三方的網站時要運用相對途徑(不能再運用Context)
<% // 以前重定向 // response.sendRedirect("/day12/index.jsp"); %> <c:redirect url="/index.jsp" context="/day12"></c:redirect> 在WebRoot/jstl下新建redirect.jsp [html] view plain copy 在CODE上檢查代碼片派生到我的代碼片 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>JSTL方式</h4> <c:redirect url="/jstl/choose.jsp" context="/day13"> <c:param name="username" value="furong"></c:param> </c:redirect> </body> </html>
EL函數庫
JSTL中的常用EL函數
EL函數是用來操作字符串的
由於在JSP頁面中顯示數據時,常常需求對顯示的字符串停止處置,SUN公司針對一些罕見處置定義了一套EL函數庫供開發者運用。
這些EL函數在JSTL開發包中停止描繪,因而在JSP頁面中運用SUN公司的EL函數庫,需求導入JSTL開發包,並在頁面中導入EL函數庫,如下所示:
在頁面中運用JSTL定義的EL函數:
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> (可以在fn.tld文件中檢查)
fn:toLowerCase
fn:toLowerCase函數將一個字符串中包括的一切字符轉換為小寫方式,並前往轉換後的字符串,它接納一個字符串類型的參數,例如:
fn:toLowerCase("Www.IT315.org")的前往值為字符串"www.it315.org"
fn.toLowerCase("") 的前往值為空字符串
fn:toUpperCase
fn:toUpperCase函數將一個字符串中包括的一切字符轉換為大寫方式,並前往轉換後的字符串,它接納一個字符串類型的參數。例如:
fn:toUpperCase("www.IT315.org")的前往值為字符串"WWW.IT315.ORG"
fn:toUpperCase("")的前往值為空字符串
fn:trim
fn:trim函數刪除一個字符串的首尾的空格,並前往刪除空格後的後果字符串,它接納一個字符串類型的參數。需求留意的是,
fn:trim函數不能刪除字符串兩頭地位的空格
例如:fn:trim(" www.it3 15.org ")的前往值字符串是"www.it 315.org"
fn:length
fn:length函數前往一個集合或數組大小,或前往一個字符串中包括的字符的個數,前往值是int類型。fn:length函數接納一個參數,這個參數可以是<c:forEach>標簽的items屬性支持的任何類型,包括恣意類型的數組、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等類的實例對象和字符串。
假如fn:length函數的參數為null或許是元素個數為0的集合或數組對象,則函數前往0;假如參數是空字符串,則函數前往0;
fn:split
fn:split函數以指定字符串作為分隔符,將一個字符串聯系成數組並前往這個字符串數組。
fn:split函數接納兩個字符串類型的參數,第一個參數表示要聯系的字符串,第二個參數表示作為分隔符的字符串。
例如:fn:split("www.it315.org",".")[1]的前往值為字符串"it315"
fn:join
fn:join函數以一個字符串作為分隔符,將一個字符串數組中的一切元素兼並為一個字符串並前往兼並後的後果字符串。fn:join函數接納兩個參數,第一個參數是要操作的字符串數組,第二個參數是作為分隔符的字符串。
假如fn:join函數的第二個參數是空字符串,則fn:join函數的前往值直接將元素銜接起來。例如:
假定stringArray是保管在Web域中的一個屬性,它表示一個值為{"www","it315","org"}的字符串數組,則fn:join(stringArray,".")返
回字符串"www.it315.org"
fn:join(fn:split("www,it315,org",","),".") 的前往值為字符串"www.it315.org"
fn:indexOf
fn:indexOf 函數前往指定字符串在一個字符串中第一次呈現的索引值,前往值為int類型。fn:indexOf函數接納兩個字符串類型的參數,假如第一個參數字符串中包括第二個參數字符串,那麼不論第二個參數字符串在第一個參數字符串中呈現幾次,
fn:indexOf函數總是前往第一次呈現的索引值;假如第一個參數中不包括第二個參數,則fn:indexOf函數前往-1。假如第二個參數為空字符串,則fn:indexOf函數總是前往0。
例如:fn:indexOf("www.it315.org","t3") 的前往值為5
fn:contains
fn:contains函數檢測一個字符串中能否包括指定的字符串,前往值為布爾類型。fn:contains函數在比擬兩個字符串能否相等時是大小寫敏感的。
fn:contains函數接納兩個字符串類型的參數,假如第一個字符串中包括第二個參數字符串前往true,否則前往false。假如第二個參數的值為空字符串,則fn:contains函數總是前往true。實踐上,fn:contains(string,substring)等價於fn:indexOf(string,sunstring)!= -1
疏忽大小寫的EL函數:fn:containsIgnoreCase
fn:startsWith
fn:startsWith 函數用於檢測一個字符串能否以指定的字符串開端的,前往值為布爾類型。
fn:startsWith 函數接納兩個字符串類型的參數,假如第一個參數字符串以第二個參數字符串開端,則函數前往true,否則函數前往false。假如第二個參數為空字符串,則fn:startsWith函數總是前往true。例如:
fn:startsWith("www.it315.org","it315")的前往值為false
與之對應的EL函數:fn:endsWith
fn:replace
fn:replace函數將一個字符串中包括的指定字符串交換為其他的指定字符串,並前往交換後的後果字符串。fn:replace("www it315 org"," ",".")的前往值為字符串"www.it315.org"
fn:substring
fn:substring 函數用於截取一個字符串的子字符串並前往截取到的子字符串。fn:substring函數接納三個參數,第一個參數是用於指定要操作的源字符串,第二個參數是用於指定截取子字符串開端的索引值,第三個參數是用於指定截取子字符串完畢的索引值,第二個參數和第三個參數都是int類型,其值都從0開端例如:
fn:substring("www.it315.org",4,9)的前往值為字符串"it315"
fn:substringAfter
fn:substringAfter函數用於截取並前往一個字符串中的指定字符串第一次呈現之後的子字符串。fn:substringAfter函數接納兩個字符串類型的參數,第一個參數表示要操作的源字符串,第二個參數表示指定的子字符串。
fn:substringAfter("www.it315.org",".")的前往值為字符串"it315.org"
與之對應的EL函數為:fn:substringBefore
自定義EL函數開發步驟
EL自定義函數開發與使用包括以下三個步驟:
編寫一個Java類,辦法必需是靜態辦法。
在WEB-INF目錄下新建一個tld的文件。
沒有標簽的提示,復制http://java.sun.com/xml/ns/j2ee , 兼並稱號
設置2.0,設置url和shortname
編寫標簽庫描繪符(tld)文件,在tld文件配置自定義函數
運用function標簽配置自定義函數。
運用name標簽配置辦法名(可以恣意)
運用function-class標簽配置類的全途徑
運用function-signature 標簽配置前往值類型(兩頭有空格)辦法稱號(參數類型)
在JSP頁面中導入和自定義函數
開發EL function留意事項
編寫標簽庫描繪文件後,需求將它放置到<web使用>\WEB-INF目錄中或WEB-INF目錄下的除了classes和lib目錄之外的恣意子目錄中。
TLD文件中的<uri>元素用指定該TLD文件的URI,在JSP文件中需求經過這個URI來引入該標簽庫描繪文件。
<function>元素用於描繪一個EL自定義函數,其中:
<name>子元素用於指定EL自定義函數的稱號。
<funtion-class>子元素用於指定完好的Java類名。
<function-signature>子元素用於指定Java類中的靜態辦法的簽名,辦法簽名必需指明辦法的前往類型以及各個參數的類型,
各個參數之間用逗號分隔。
實例如下:
在src下新建一個cn.itcast.el的包,在包內新建ElDemo1.java
代碼如下:
package cn.itcast.el; public class ElDemo1 { public static String sayHello(String name){ return "hello "+name; } }
在WebRoot/WEB-INF下新建myfn的tld文件 並停止配置:
配置後的代碼如下:
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>myfn</short-name> <uri>http://www.itcast.cn/1110/myfn</uri> <!-- 配置自定義的EL函數 --> <function> <!-- 配置辦法稱號 --> <name>sayHi</name> <!-- 辦法所在的類 --> <function-class>cn.itcast.el.ElDemo1</function-class> <!-- 配置辦法的簽名 --> <function-signature>java.lang.String sayHello(java.lang.String)</function-signature> </function> </taglib>
在WebRoot根目錄下新建el文件夾,在外面新建demo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib uri="http://www.itcast.cn/1110/myfn" prefix="myfn" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> ${ fn:length("abcdefg") } ${ fn:toUpperCase("abcdefg") } ${ myfn:sayHi("小風") } </body> </html>
自定義標簽
自定義標簽簡介
自定義標簽次要用於移除JSP頁面中的Java代碼,進步代碼的復用性
運用自定義標簽移除jsp頁面在奇偶那個的Java代碼,只需求完成以下步驟:
編寫一個完成Tag接口的Java類(標簽處置器) 編寫標簽庫描繪符(tld)文件,在tld文件中對標簽處置器類描繪成一個標簽 參考Tomcat中example項目中的JSP局部由於企業業務需求是多種多樣的,所以罕見開源框架只能提供通用的Java代碼功用,假如完成既定業務邏輯功用,需求自定義標簽。經過自定義標簽(簡化復雜業務開發)
復雜標簽
由於傳統標簽運用三個標簽接口來完成不同的功用,顯得過於繁瑣,不利於標簽技術的推行,SUN公司為降低標簽技術的學習難度,在JSP2.0中定義了一個更為復雜、便於編寫和調用的SimpleTag接口來完成標簽的功用。完成SimpleTag接口的標簽通常稱為復雜標簽。
SimpleTag辦法引見
setJspContext辦法:用於把JSP頁面的pageContext對象傳遞給標簽處置器對象。 setParent辦法:用於把父標簽處置器對象傳遞給以後標簽處置器對象。 getParent辦法:用於取得以後標簽的父標簽處置對象。 setJspBody辦法:用於把代表標簽體的JspFragment對象傳遞給標簽處置器對象。即傳入標簽體緩存對象(封裝了標簽體內容) doTag辦法:用於完後一切標簽邏輯,包括輸入、迭代、修正標簽體內容等。在doTag辦法中可以拋出 javax.servlet.jsp.SkipPageException異常,用於告訴WEB容器不再執行JSP頁面中位於完畢標志前面的內容,這等效於在傳統標簽的doEndTag辦法中前往Tag.SKIP_PAGE常量的狀況。復雜標簽庫開發常用功用,完成SimpleTag接口標簽類(SimpleTag JSP2.0 之後為了簡化標簽開發提供的)
編寫復雜的標簽類,只需求承繼SimpleTagSupport類
setJspContext 傳入pageContext對象
setParent 傳入父標簽對象
setJSPBody 傳入標簽體緩存對象(封裝了標簽體內容)
doTag (執行標簽,在該辦法中編寫標簽代碼邏輯)
在setJSPBody辦法中傳入對象JSPFragment,該對象封裝了標簽體內容,控制標簽體內容輸入
最重要辦法invoke(Writer out) 意義將標簽體內容輸入到指定字符輸入流中。
留意:在復雜標簽庫中<bodyContent>不能寫JSP,而必需寫scriptless
SimpleTag接口辦法的執行順序:
當web容器開端執行標簽時,會調用如下辦法完成標簽的初始化:
WEB容器調用標簽處置器對象的setJspContext辦法,將代表JSP頁面的pageContext對象傳遞給標簽處置器對象。 WEB容器調用標簽處置器對象的setParent辦法,將父標簽處置器對象傳遞給這個標簽處置器對象。留意,只要在標簽存在父標簽的狀況下,WEB容器才會調用這個辦法。 假如調用標簽時設置了屬性,容器將調用每個屬性對應的setter辦法把屬性值傳遞給標簽處置器對象。假如標簽的屬性值是EL表達式,則WEB容器首先計算表達式的值,然後把值傳遞給標簽處置器對象。 假如復雜標簽有標簽體,容器將調用setJSPBody辦法把代表標簽體的JspFragment對象傳遞出去。執行標簽時:
容器調用標簽處置器的doTag() 辦法,開發人員在辦法內經過操作JspFragment對象,就可以完成能否執行、迭代、修正標簽體的目的。JSPFragment類
(1)javax.servlet.jsp.tagext.JspFragment類是在JSP2.0中定義的,它的實例對象代表JSP頁面中的一段契合JSP語法標准的JSP片段,這段JSP片段中不能包括JSP腳本元素。
(2)WEB容器在處置復雜標簽的標簽體時,會把標簽體內容用一個JspFragment對象表示,並調用標簽處置器對象的setJSPBody辦法把JspFragment對象傳遞給標簽處置器對象。JspFragment類中只定義了兩個辦法,如下所示:
getJspContext辦法:用於前往代表調用頁面的JspContext對象——pageContext
public abstract void invoke(java.io.Writer out) 輸入標簽內容
用於執行JspFragment對象所代表的JSP代碼片段
參數out用於指定將JspFragment對象的執行後果寫入到哪個輸入流對象中,假如傳遞給參數out的值為null,則將執行後果寫入到JspContext.getOut()辦法前往的輸入流對象中。(簡而言之,可以了解為寫給閱讀器)
invoke辦法詳解
JspFragment.invoke辦法是JspFragment最重要的辦法,應用這個辦法可以控制能否執行和輸入標簽體的內容、能否迭代執行標簽體的內容或對標簽體的執行後果停止修正後再輸入。例如:
在標簽處置器中假如沒有調用JspFragment.invoke辦法,其後果就相當於疏忽標簽體內容; 在標簽體處置器中反復調用JspFragment.invoke辦法,則標簽體內容會被反復執行; 若想在標簽處置器中修正標簽體內容,只需在調用invoke辦法時指定一個可取出後果數據的輸入流對象(例如:StringWriter),讓標簽體的執行後果輸入到該輸入流對象中,然後從該輸入流對象中取出數據停止修正後在輸入到目的設備,即可到達修正標簽體的目的。例:控制標簽後的jsp頁面能否執行
doTag
throw new SkipPageException
TLD配置
<tag> <name>demo2</name> <tag-class>simple.MyTag2</tag-class> <body-content>empty</body-content> </tag>
自定義標簽入門
需求:自定義標簽<myc:print>在頁面中輸入hello
步驟一:編寫標簽類
編寫一個類,承繼SimpleTagSupport
重寫兩個辦法,doTag()和setJspContext(JspContext pc)
經過JspContext 對象可以獲取out對象向外輸入內容
步驟二:提供tld文件停止配置
經過<tag>標簽配置自定義標簽
配置標簽稱號<name>print</name>
配置標簽的類<tag-class>xxx.xxx.xxx</tag-class>
配置標簽體的內容<body-content>empty</body-content>
步驟三:在JSP頁面中引入該標簽庫
自定義帶有標簽體的標簽
需求:自定義標簽<myc:out>在頁面中輸入內容
步驟一:編寫標簽類
編寫一個類,承繼SimpleTagSupport
重寫兩個辦法,doTag()和setJspContext(JspContext pc)
在doTag()中經過getJspBody()獲取JspFragment標簽體,調用invoke(null)
步驟二:提供tld文件停止配置
經過<tag>標簽配置自定義標簽
配置標簽稱號<name>out</name>
配置標簽的類<tag-class>xxx.xxx.xxx</tag-class>
配置標簽體的內容<body-content>scriptless</body-content>
步驟三:在JSP的頁面中引入該標簽庫
Body-content的配置
<body-content>元素的可選值有:
empty:不能有標簽體內容 JSP:標簽體內容可以是任何東西:EL、JSTL、<%= %>、<%%>,以及HTML;但不建議運用Java代碼段,SimpleTag曾經不再支持運用<body-content>JSP</body-content> scriptless:標簽體內容不能是Java代碼段,但可以是EL、JSTL等。 tagdependent:標簽體內容不做運算,由標簽處置類自行處置,無論標簽體內容是EL、JSP、JSTL,都不會做運算。自定義帶有屬性的標簽
需求:自定義標簽<myc:if>在頁面中輸入內容
步驟一:編寫標簽類
編寫一個類,承繼SimpleTagSupport類。
提供頁面的屬性,設置成boolean類型。並提供set辦法,頁面的屬性與類中的屬性稱號必需相反。
重寫doTag()辦法,判別屬性能否為true,經過getJspBody()獲取JspFragment標簽體,調用invoke(null)
步驟二:提供tld文件停止配置
經過<tag>標簽配置自定義標簽
配置標簽稱號<name>if</name>
配置標簽的類<tag-class>xxx.xxx.xxx</tag-class>
配置標簽體的內容<body-content>scriptless</body-content>
配置屬性<attribute>在屬性中配置其他信息</attribute>
步驟三:在JSP頁面中引入標簽庫
attribute的配置
(1)配置屬性稱號
<name>test</name>
(2)屬性能否是必需的
<required>true</required>
(3)配置能否支持EL表達式
<rtexprvalue>true</rtexprvalue>
(4)配置屬性的類型
<type>boolean</type>
在TLD中描繪標簽屬性attribute
元素名
能否必需指定
描繪
description
否
用於指定屬性的描繪信息
name
是
用於指定屬性的稱號。屬性稱號是大小寫敏感的,並且不能以jsp、
_jsp、java和sun掃尾
required
否
用於指定在JSP頁面中調用自定義標簽時能否必需設置這個屬性。其
取值包括true和false,默許值是false,true表示必需設置,否則可以
設置也可以不設置該屬性。
rtexprvalue
否
rtexprvalue是runtime expression value(運轉時表達式)的英文簡寫,
用於指定屬性值是一個靜態值或靜態值。其取值包括true和false,默許值
是false,false表示只能為該屬性指定靜態文本值,例如"123"; true表示可
以為該屬性指定一個JSP靜態元素,靜態元素的後果作為屬性值,例如
JSP表達式<%=value %>
type
否
用於指定屬性值的Java類型。默許是String
<tag>元素的<attribute>子元素用於描繪自定義
標簽的一個屬性,自定義標簽所具有的每個屬性
都要對應一個<attribute>元素 。
<attribute> <description>description</description> <name>aaaa</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>ObjectType</type> </attribute>
實例如下:
在WEB項目的src目錄下新建cn.itcast.tag包,在包內新建三個標簽完成類
TagDemo1.java (沒有標簽體的自定義標簽)
package cn.itcast.tag; import java.io.IOException; import javax.servlet.jsp.JspContext; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * 對外輸入Hello * @author Administrator * */ public class TagDemo1 extends SimpleTagSupport{ private PageContext pc; public void doTag() throws JspException, IOException { pc.getOut().write("Hello"); } /** * 服務器默許先執行該辦法 */ public void setJspContext(JspContext pc) { this.pc = (PageContext) pc; } }
TagDemo2.java (有標簽體 處置標簽體內容)
package cn.itcast.tag; import java.io.IOException; import java.io.StringWriter; import javax.servlet.jsp.JspContext; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * 帶有標簽主體 * @author Administrator * */ public class TagDemo2 extends SimpleTagSupport{ private PageContext pc; public void doTag() throws JspException, IOException { JspFragment jf = getJspBody(); StringWriter sw = new StringWriter(); //經過invoke辦法將標簽體內容寫入到參數Writer對象sw中 jf.invoke(sw); // 獲取標簽體內容 String content = sw.toString().toUpperCase(); pc.getOut().print(content); } public void setJspContext(JspContext pc) { this.pc = (PageContext)pc; } }
TagDemo3.java (有屬性 有標簽體的自定義標簽)
package cn.itcast.tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * 相似<c:if>標簽,帶有屬性的 * @author Administrator * */ public class TagDemo3 extends SimpleTagSupport{ private boolean test; public void setTest(boolean test) { this.test = test; } public void doTag() throws JspException, IOException { if(test){ getJspBody().invoke(null); } } }
在WebRoot/WEB-INF 目錄下新建myc.tld文件
配置內容如下:
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>myc</short-name> <uri>http://www.itcast.cn/1110/myc</uri> <!-- 配置自定義標簽 --> <tag> <!-- 配置標簽稱號 --> <name>print</name> <!-- 配置標簽的類 --> <tag-class>cn.itcast.tag.TagDemo1</tag-class> <!-- 配置標簽主體 --> <body-content>empty</body-content> </tag> <!-- 配置自定義標簽 --> <tag> <!-- 配置標簽稱號 --> <name>out</name> <!-- 配置標簽的類 --> <tag-class>cn.itcast.tag.TagDemo2</tag-class> <!-- 配置標簽主體 --> <body-content>scriptless</body-content> </tag> <!-- 配置自定義標簽 --> <tag> <!-- 配置標簽稱號 --> <name>if</name> <!-- 配置標簽的類 --> <tag-class>cn.itcast.tag.TagDemo3</tag-class> <!-- 配置標簽主體 --> <body-content>scriptless</body-content> <!-- 配置屬性 --> <attribute> <!-- 配置屬性稱號 --> <name>test</name> <!-- 屬性能否是必需的 --> <required>true</required> <!-- 能否支持EL表達式 --> <rtexprvalue>true</rtexprvalue> <!-- 屬性的類型 --> <type>boolean</type> </attribute> </tag> </taglib>
在WebRoot下新建tag文件夾,新建tag.jsp 測試自定義標簽內容
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.itcast.cn/1110/myc" prefix="myc" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <myc:print/> <myc:out> liuxun1993 </myc:out> <c:set var="i" value="10"></c:set> <myc:if test="${ i eq 10 }"> 美美 </myc:if> </body> </html>
啟動服務器,運轉後果如下:
以上所述是給大家引見的JavaWeb開發之JSTL標簽庫的運用、 自定義EL函數、自定義標簽(帶屬性的、帶標簽體的),希望對大家有所協助,假如大家有任何疑問請給我留言,會及時回復大家的。在此也十分感激大家對網站的支持!