JavaWeb開發(fā)之JSTL標簽庫的使用、 自定義EL函數(shù)、自定義標簽(帶屬性的、帶標簽體的)
JSTL
JSTL簡介:
JSTL的全稱:JSP Standard Tag Library,JSP標準標簽庫
JSTL的作用:
提供給Java Web開發(fā)人員一個標準通用的標簽函數(shù)庫
和EL來取代傳統(tǒng)直接在頁面上嵌入Java程序(Scripting)的做法,以提高程序可讀性、維護性和方便性
JSTL的版本:
JSTL的主要版本是1.0、1.1和1.2(區(qū)別不大)
1.0版本EL表達式還沒有納入官方規(guī)范
1.1和1.2版本EL表達式已經(jīng)納入了官方規(guī)范
JSTL1.1 下載相應的jar包
JSTL的下載
JSTL主要由Apache組織的Jakarta Project實現(xiàn)
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函數(shù)(EL函數(shù))el
JSTL快速入門
導入jar包(jstl.jar和standard.jar)
其中jstl.jar是編譯后的Java類文件,standard.jar定義的是標準接口
新建JSP的頁面
在頁面中引入核心標簽庫
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL標簽庫關(guān)于導入版本的問題
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標簽不轉(zhuǎn)義(escapeXml)
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
value | true | Object | 指定要輸出的內(nèi)容 |
escapeXml | true | Boolean | 指定是否將>、<、&、'、" 等 特殊字符進行HTML編碼轉(zhuǎn)換 后再進行輸出。默認值是true。 |
default | true | Object | 指定如果value屬性的值為null時所輸出的默認值 |
<!-- c:out 輸出數(shù)據(jù)到瀏覽器 --> <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 } <!-- 轉(zhuǎn)義HTML 默認轉(zhuǎn)義,通過設置escapeXml 為false 不進行轉(zhuǎn)義--> <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>傳統(tǒng)方式</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域?qū)傩缘拿Q |
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>傳統(tǒng)方式</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域范圍內(nèi)查找刪除值。
用法示例:
<% 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>傳統(tǒng)方式</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>標簽
- <c:catch>標簽用于捕獲嵌套在標簽中的內(nèi)容拋出的異常,其語法格式如下:<c:catch [var="varName"]> nested actions </c:catch>
- var屬性用于標識<c:catch>標簽捕獲的異常對象,它將保存在page這個web域中。
關(guān)鍵代碼:
<%@ 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>傳統(tǒng)方式</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=""> 標簽可以構(gòu)造簡單的"if-then"結(jié)構(gòu)的條件表達式
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
test | true | boolean | 決定是否處理標簽體中的內(nèi)容的條件表達式 |
var | false | String | 用于指定將test屬性的執(zhí)行結(jié)果保存到某個Web域中的某個屬性的名稱 |
scope | false | String | 指定將test屬性的執(zhí)行結(jié)果保存到哪個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>傳統(tǒng)方式</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>三個標簽,可以構(gòu)造類似于"if-else if-else"的復雜條件判斷結(jié)構(gòu) <%@ 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>獲取參數(shù)</h4> <%= request.getParameter("username") %> <h4>傳統(tǒng)方式</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>標簽用于對一個集合對象中的元素進行循環(huán)迭代操作,或者按指定的次數(shù)重復迭代執(zhí)行標簽體中的內(nèi)容
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
var | false | String | 指定將當前迭代到的元素保存到page這個域中的屬性名稱 |
varStatus | false | String | 記住用于保存迭代信息的對象 |
items | true | 任何支持的類型 | 將要迭代的集合對象 |
begin | true | int | 如果指定items屬性,就從集合中的第begin個元素開始進行迭代 ,begin的索引值從0開始編號,如果沒有指定items屬性,就從 begin指定的值開始迭代,直到end值時結(jié)束迭代 |
end | true | int | 與begin屬性類似 |
step | true | int | 指定迭代的步長,即迭代因子的迭代增量 |
<c:forEach>遍歷集合
遍歷數(shù)組或者集合:
var:代表遍歷的每一個元素
items:要迭代的集合對象
獲取遍歷的內(nèi)容:${ xxx }
遍歷Map集合:
var:代表key與value的關(guān)系entry
items:要迭代的map集合
獲取遍歷的內(nèi)容:${ xxx.key } ----${ xxx.value }
遍歷對象集合:
var:代表遍歷的每一個對象
items:要迭代的集合
獲取遍歷的內(nèi)容: ${ xxx.對象的屬性 }
<c:forEach>迭代數(shù)據(jù)
從1遍歷到10:
var:定義變量
begin:從哪開始
end:到哪結(jié)束
step:迭代步長(相當于x+=step)
計算從1加到10的和:
定義變量sum,值為0
通過forEach循環(huán)1到10,每循環(huán)一次加到另一個變量中
在循環(huán)中間定義變量,每次計算到該變量中
<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屬性:
記錄迭代相關(guān)的信息:
屬性 | 類型 | 意義 |
index | number | 現(xiàn)在指到成員的索引 |
count | number | 總共指到成員的總數(shù) |
first | boolean | 現(xiàn)在指到的成員是否是第一個成員 |
last | boolean | 現(xiàn)在指到的成員是否是最后一個成員 |
遍歷10到100的偶數(shù),每到第三個數(shù),顯示紅色:
<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>遍歷數(shù)組</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>迭代數(shù)據(jù)</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的偶數(shù),每到第3個數(shù),顯示紅色</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 | 用來存放現(xiàn)在指到的成員 | N | String | 否 | 無 |
items | 被迭代的字符串 | Y | String | 是 | 無 |
delims | 定義用來分割字符串的字符 | N | String | 是 | 無 |
varStatus | 用來存放現(xiàn)在指到的相關(guān)成員信息 | N | String | 否 | 無 |
begin | 開始的位置 | Y | int | 否 | 0 |
end | 結(jié)束的位置 | 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內(nèi)容 </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的相關(guān)操作時,經(jīng)常要在URL地址后面附加一些參數(shù)。<c:param>標簽可以嵌套在<c:import>、<c:url>或<c:redirect>標簽內(nèi),為這些標簽所使用的URL地址附加參數(shù)。
- <c:param>標簽在為一個URL地址附加參數(shù)時,將自動對參數(shù)值進行URL編碼,例如:如果傳的參數(shù)值為“中國”,則將其轉(zhuǎn)換為“%d6%d0%b9%fa”后再附加到URL地址后面,這也就是使用<c:param>標簽的最大好處
- 示例:<c:param name="name" value="value" />
<c:import>標簽
名稱 | 說明 | EL | 類型 | 必須 | 默認值 |
url | 一文件被包含的地址 | Y | String | 是 | 無 |
context | 項目虛擬路徑 | Y | String | 否 | 無 |
var | 儲存被包含的文件的內(nèi)容(以String類型存入) | Y | String | 否 | 無 |
scope | var變量的JSP范圍 | N | String | 否 | page |
charEncoding | 被包含文件的內(nèi)容的編碼方式 | Y | String | 否 | 無 |
varReader | 儲存被包含的文件的內(nèi)容(以Reader類型存入) | N | String | 否 |
<!-- 引入foreach.jsp 效果類似包含--> <c:import url="/jstl/foreach.jsp" context="/day8"></c:import> <hr/> <!-- 引入不顯示,將內(nèi)容保存另一個變量中 --> <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 中獲取參數(shù))
實例代碼如下:
<!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頁面中構(gòu)造一個URL地址,其主要目的是實現(xiàn)URL重寫。URL重寫就是將會話標識以參數(shù)形式附加在URL地址后面。(類似于Session追蹤 尤其是當瀏覽器禁用cookie后,就是說實現(xiàn)了session追蹤的功能)
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
value | true | String | 指定要構(gòu)造的URL |
var | false | String | 指定將構(gòu)造出的URL結(jié)果保存到Web域中的屬性名稱 |
scope | false | String | 指定將構(gòu)造出的URL結(jié)果保存在哪個域中 |
在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 結(jié)合 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>獲取參數(shù)</h4> <%= request.getParameter("username") %> <h4>傳統(tǒng)方式</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跳轉(zhuǎn)到choose.jsp
<c:redirect>標簽
<c:redirect>標簽用于實現(xiàn)請求重定向
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
url | true | String | 指定要轉(zhuǎn)發(fā)或重定向到的目標資源的URL地址 |
context | true | String | 當要使用相對路徑重定向到同一個服務器下的其他WEB應用程序中的 資源時,context屬性指定其他WEB應用程序的名稱 |
注意:如果重定向第三方的網(wǎng)站時要使用絕對路徑(不能再使用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函數(shù)庫
JSTL中的常用EL函數(shù)
EL函數(shù)是用來操作字符串的
由于在JSP頁面中顯示數(shù)據(jù)時,經(jīng)常需要對顯示的字符串進行處理,SUN公司針對一些常見處理定義了一套EL函數(shù)庫供開發(fā)者使用。
這些EL函數(shù)在JSTL開發(fā)包中進行描述,因此在JSP頁面中使用SUN公司的EL函數(shù)庫,需要導入JSTL開發(fā)包,并在頁面中導入EL函數(shù)庫,如下所示:
在頁面中使用JSTL定義的EL函數(shù):
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> (可以在fn.tld文件中查看)
fn:toLowerCase
fn:toLowerCase函數(shù)將一個字符串中包含的所有字符轉(zhuǎn)換為小寫形式,并返回轉(zhuǎn)換后的字符串,它接收一個字符串類型的參數(shù),例如:
fn.toLowerCase("") 的返回值為空字符串
fn:toUpperCase
fn:toUpperCase函數(shù)將一個字符串中包含的所有字符轉(zhuǎn)換為大寫形式,并返回轉(zhuǎn)換后的字符串,它接收一個字符串類型的參數(shù)。例如:
fn:toUpperCase("")的返回值為空字符串
fn:trim
fn:trim函數(shù)刪除一個字符串的首尾的空格,并返回刪除空格后的結(jié)果字符串,它接收一個字符串類型的參數(shù)。需要注意的是,
fn:trim函數(shù)不能刪除字符串中間位置的空格
例如:fn:trim(" www.it3 15.org ")的返回值字符串是"www.it 315.org"
fn:length
fn:length函數(shù)返回一個集合或數(shù)組大小,或返回一個字符串中包含的字符的個數(shù),返回值是int類型。fn:length函數(shù)接收一個參數(shù),這個參數(shù)可以是<c:forEach>標簽的items屬性支持的任何類型,包括任意類型的數(shù)組、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等類的實例對象和字符串。
如果fn:length函數(shù)的參數(shù)為null或者是元素個數(shù)為0的集合或數(shù)組對象,則函數(shù)返回0;如果參數(shù)是空字符串,則函數(shù)返回0;
fn:split
fn:split函數(shù)以指定字符串作為分隔符,將一個字符串分割成數(shù)組并返回這個字符串數(shù)組。
fn:split函數(shù)接收兩個字符串類型的參數(shù),第一個參數(shù)表示要分割的字符串,第二個參數(shù)表示作為分隔符的字符串。
fn:join
fn:join函數(shù)以一個字符串作為分隔符,將一個字符串數(shù)組中的所有元素合并為一個字符串并返回合并后的結(jié)果字符串。fn:join函數(shù)接收兩個參數(shù),第一個參數(shù)是要操作的字符串數(shù)組,第二個參數(shù)是作為分隔符的字符串。
如果fn:join函數(shù)的第二個參數(shù)是空字符串,則fn:join函數(shù)的返回值直接將元素連接起來。例如:
假設stringArray是保存在Web域中的一個屬性,它表示一個值為{"www","it315","org"}的字符串數(shù)組,則fn:join(stringArray,".")返
fn:join(fn:split("www,it315,org",","),".") 的返回值為字符串"
fn:indexOf
fn:indexOf 函數(shù)返回指定字符串在一個字符串中第一次出現(xiàn)的索引值,返回值為int類型。fn:indexOf函數(shù)接收兩個字符串類型的參數(shù),如果第一個參數(shù)字符串中包含第二個參數(shù)字符串,那么不管第二個參數(shù)字符串在第一個參數(shù)字符串中出現(xiàn)幾次,
fn:indexOf函數(shù)總是返回第一次出現(xiàn)的索引值;如果第一個參數(shù)中不包含第二個參數(shù),則fn:indexOf函數(shù)返回-1。如果第二個參數(shù)為空字符串,則fn:indexOf函數(shù)總是返回0。
fn:contains
fn:contains函數(shù)檢測一個字符串中是否包含指定的字符串,返回值為布爾類型。fn:contains函數(shù)在比較兩個字符串是否相等時是大小寫敏感的。
fn:contains函數(shù)接收兩個字符串類型的參數(shù),如果第一個字符串中包含第二個參數(shù)字符串返回true,否則返回false。如果第二個參數(shù)的值為空字符串,則fn:contains函數(shù)總是返回true。實際上,fn:contains(string,substring)等價于fn:indexOf(string,sunstring)!= -1
忽略大小寫的EL函數(shù):fn:containsIgnoreCase
fn:startsWith
fn:startsWith 函數(shù)用于檢測一個字符串是否以指定的字符串開始的,返回值為布爾類型。
fn:startsWith 函數(shù)接收兩個字符串類型的參數(shù),如果第一個參數(shù)字符串以第二個參數(shù)字符串開始,則函數(shù)返回true,否則函數(shù)返回false。如果第二個參數(shù)為空字符串,則fn:startsWith函數(shù)總是返回true。例如:
與之對應的EL函數(shù):fn:endsWith
fn:replace
fn:replace函數(shù)將一個字符串中包含的指定字符串替換為其他的指定字符串,并返回替換后的結(jié)果字符串。fn:replace("www it315 org"," ",".")的返回值為字符串"
fn:substring
fn:substring 函數(shù)用于截取一個字符串的子字符串并返回截取到的子字符串。fn:substring函數(shù)接收三個參數(shù),第一個參數(shù)是用于指定要操作的源字符串,第二個參數(shù)是用于指定截取子字符串開始的索引值,第三個參數(shù)是用于指定截取子字符串結(jié)束的索引值,第二個參數(shù)和第三個參數(shù)都是int類型,其值都從0開始例如:
fn:substringAfter
fn:substringAfter函數(shù)用于截取并返回一個字符串中的指定字符串第一次出現(xiàn)之后的子字符串。fn:substringAfter函數(shù)接收兩個字符串類型的參數(shù),第一個參數(shù)表示要操作的源字符串,第二個參數(shù)表示指定的子字符串。
與之對應的EL函數(shù)為:fn:substringBefore
自定義EL函數(shù)開發(fā)步驟
EL自定義函數(shù)開發(fā)與應用包括以下三個步驟:
編寫一個Java類,方法必須是靜態(tài)方法。
在WEB-INF目錄下新建一個tld的文件。
沒有標簽的提示,復制http://java.sun.com/xml/ns/j2ee , 合并名稱
設置2.0,設置url和shortname
編寫標簽庫描述符(tld)文件,在tld文件配置自定義函數(shù)
使用function標簽配置自定義函數(shù)。
使用name標簽配置方法名(可以任意)
使用function-class標簽配置類的全路徑
使用function-signature 標簽配置返回值類型(中間有空格)方法名稱(參數(shù)類型)
在JSP頁面中導入和自定義函數(shù)
開發(fā)EL function注意事項
編寫標簽庫描述文件后,需要將它放置到<web應用>\WEB-INF目錄中或WEB-INF目錄下的除了classes和lib目錄之外的任意子目錄中。
TLD文件中的<uri>元素用指定該TLD文件的URI,在JSP文件中需要通過這個URI來引入該標簽庫描述文件。
<function>元素用于描述一個EL自定義函數(shù),其中:
<name>子元素用于指定EL自定義函數(shù)的名稱。
<funtion-class>子元素用于指定完整的Java類名。
<function-signature>子元素用于指定Java類中的靜態(tài)方法的簽名,方法簽名必須指明方法的返回類型以及各個參數(shù)的類型,
各個參數(shù)之間用逗號分隔。
實例如下:
在src下新建一個cn.itcast.el的包,在包內(nèi)新建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函數(shù) --> <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代碼,只需要完成以下步驟:
- 編寫一個實現(xiàn)Tag接口的Java類(標簽處理器)
- 編寫標簽庫描述符(tld)文件,在tld文件中對標簽處理器類描述成一個標簽
- 參考Tomcat中example項目中的JSP部分
因為企業(yè)業(yè)務需求是多種多樣的,所以常見開源框架只能提供通用的Java代碼功能,如果實現(xiàn)既定業(yè)務邏輯功能,需要自定義標簽。通過自定義標簽(簡化復雜業(yè)務開發(fā))
簡單標簽
由于傳統(tǒng)標簽使用三個標簽接口來完成不同的功能,顯得過于繁瑣,不利于標簽技術(shù)的推廣,SUN公司為降低標簽技術(shù)的學習難度,在JSP2.0中定義了一個更為簡單、便于編寫和調(diào)用的SimpleTag接口來實現(xiàn)標簽的功能。實現(xiàn)SimpleTag接口的標簽通常稱為簡單標簽。
SimpleTag方法介紹
- setJspContext方法:用于把JSP頁面的pageContext對象傳遞給標簽處理器對象。
- setParent方法:用于把父標簽處理器對象傳遞給當前標簽處理器對象。
- getParent方法:用于獲得當前標簽的父標簽處理對象。
- setJspBody方法:用于把代表標簽體的JspFragment對象傳遞給標簽處理器對象。即傳入標簽體緩存對象(封裝了標簽體內(nèi)容)
- doTag方法:用于完后所有標簽邏輯,包括輸出、迭代、修改標簽體內(nèi)容等。在doTag方法中可以拋出
- javax.servlet.jsp.SkipPageException異常,用于通知WEB容器不再執(zhí)行JSP頁面中位于結(jié)束標記后面的內(nèi)容,這等效于在傳統(tǒng)標簽的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。
簡單標簽庫開發(fā)常用功能,實現(xiàn)SimpleTag接口標簽類(SimpleTag JSP2.0 之后為了簡化標簽開發(fā)提供的)
編寫簡單的標簽類,只需要繼承SimpleTagSupport類
setJspContext 傳入pageContext對象
setParent 傳入父標簽對象
setJSPBody 傳入標簽體緩存對象(封裝了標簽體內(nèi)容)
doTag (執(zhí)行標簽,在該方法中編寫標簽代碼邏輯)
在setJSPBody方法中傳入對象JSPFragment,該對象封裝了標簽體內(nèi)容,控制標簽體內(nèi)容輸出
最重要方法invoke(Writer out) 意義將標簽體內(nèi)容輸出到指定字符輸出流中。
注意:在簡單標簽庫中<bodyContent>不能寫JSP,而必須寫scriptless
SimpleTag接口方法的執(zhí)行順序:
當web容器開始執(zhí)行標簽時,會調(diào)用如下方法完成標簽的初始化:
- WEB容器調(diào)用標簽處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標簽處理器對象。
- WEB容器調(diào)用標簽處理器對象的setParent方法,將父標簽處理器對象傳遞給這個標簽處理器對象。注意,只有在標簽存在父標簽的情況下,WEB容器才會調(diào)用這個方法。
- 如果調(diào)用標簽時設置了屬性,容器將調(diào)用每個屬性對應的setter方法把屬性值傳遞給標簽處理器對象。如果標簽的屬性值是EL表達式,則WEB容器首先計算表達式的值,然后把值傳遞給標簽處理器對象。
- 如果簡單標簽有標簽體,容器將調(diào)用setJSPBody方法把代表標簽體的JspFragment對象傳遞進來。
執(zhí)行標簽時:
- 容器調(diào)用標簽處理器的doTag() 方法,開發(fā)人員在方法內(nèi)通過操作JspFragment對象,就可以實現(xiàn)是否執(zhí)行、迭代、修改標簽體的目的。
JSPFragment類
(1)javax.servlet.jsp.tagext.JspFragment類是在JSP2.0中定義的,它的實例對象代表JSP頁面中的一段符合JSP語法規(guī)范的JSP片段,這段JSP片段中不能包含JSP腳本元素。
(2)WEB容器在處理簡單標簽的標簽體時,會把標簽體內(nèi)容用一個JspFragment對象表示,并調(diào)用標簽處理器對象的setJSPBody方法把JspFragment對象傳遞給標簽處理器對象。JspFragment類中只定義了兩個方法,如下所示:
getJspContext方法:用于返回代表調(diào)用頁面的JspContext對象——pageContext
public abstract void invoke(java.io.Writer out) 輸出標簽內(nèi)容
用于執(zhí)行JspFragment對象所代表的JSP代碼片段
參數(shù)out用于指定將JspFragment對象的執(zhí)行結(jié)果寫入到哪個輸出流對象中,如果傳遞給參數(shù)out的值為null,則將執(zhí)行結(jié)果寫入到JspContext.getOut()方法返回的輸出流對象中。(簡而言之,可以理解為寫給瀏覽器)
invoke方法詳解
JspFragment.invoke方法是JspFragment最重要的方法,利用這個方法可以控制是否執(zhí)行和輸出標簽體的內(nèi)容、是否迭代執(zhí)行標簽體的內(nèi)容或?qū)撕烍w的執(zhí)行結(jié)果進行修改后再輸出。例如:
- 在標簽處理器中如果沒有調(diào)用JspFragment.invoke方法,其結(jié)果就相當于忽略標簽體內(nèi)容;
- 在標簽體處理器中重復調(diào)用JspFragment.invoke方法,則標簽體內(nèi)容會被重復執(zhí)行;
- 若想在標簽處理器中修改標簽體內(nèi)容,只需在調(diào)用invoke方法時指定一個可取出結(jié)果數(shù)據(jù)的輸出流對象(例如:StringWriter),讓標簽體的執(zhí)行結(jié)果輸出到該輸出流對象中,然后從該輸出流對象中取出數(shù)據(jù)進行修改后在輸出到目標設備,即可達到修改標簽體的目的。
例:控制標簽后的jsp頁面是否執(zhí)行
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對象向外輸出內(nèi)容
步驟二:提供tld文件進行配置
通過<tag>標簽配置自定義標簽
配置標簽名稱<name>print</name>
配置標簽的類<tag-class>xxx.xxx.xxx</tag-class>
配置標簽體的內(nèi)容<body-content>empty</body-content>
步驟三:在JSP頁面中引入該標簽庫
自定義帶有標簽體的標簽
需求:自定義標簽<myc:out>在頁面中輸出內(nèi)容
步驟一:編寫標簽類
編寫一個類,繼承SimpleTagSupport
重寫兩個方法,doTag()和setJspContext(JspContext pc)
在doTag()中通過getJspBody()獲取JspFragment標簽體,調(diào)用invoke(null)
步驟二:提供tld文件進行配置
通過<tag>標簽配置自定義標簽
配置標簽名稱<name>out</name>
配置標簽的類<tag-class>xxx.xxx.xxx</tag-class>
配置標簽體的內(nèi)容<body-content>scriptless</body-content>
步驟三:在JSP的頁面中引入該標簽庫
Body-content的配置
<body-content>元素的可選值有:
- empty:不能有標簽體內(nèi)容
- JSP:標簽體內(nèi)容可以是任何東西:EL、JSTL、<%= %>、<%%>,以及HTML;但不建議使用Java代碼段,SimpleTag已經(jīng)不再支持使用<body-content>JSP</body-content>
- scriptless:標簽體內(nèi)容不能是Java代碼段,但可以是EL、JSTL等。
- tagdependent:標簽體內(nèi)容不做運算,由標簽處理類自行處理,無論標簽體內(nèi)容是EL、JSP、JSTL,都不會做運算。
自定義帶有屬性的標簽
需求:自定義標簽<myc:if>在頁面中輸出內(nèi)容
步驟一:編寫標簽類
編寫一個類,繼承SimpleTagSupport類。
提供頁面的屬性,設置成boolean類型。并提供set方法,頁面的屬性與類中的屬性名稱必須相同。
重寫doTag()方法,判斷屬性是否為true,通過getJspBody()獲取JspFragment標簽體,調(diào)用invoke(null)
步驟二:提供tld文件進行配置
通過<tag>標簽配置自定義標簽
配置標簽名稱<name>if</name>
配置標簽的類<tag-class>xxx.xxx.xxx</tag-class>
配置標簽體的內(nèi)容<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頁面中調(diào)用自定義標簽時是否必須設置這個屬性。其 取值包括true和false,默認值是false,true表示必須設置,否則可以 設置也可以不設置該屬性。 |
rtexprvalue | 否 | rtexprvalue是runtime expression value(運行時表達式)的英文簡寫, 用于指定屬性值是一個靜態(tài)值或動態(tài)值。其取值包括true和false,默認值 是false,false表示只能為該屬性指定靜態(tài)文本值,例如"123"; true表示可 以為該屬性指定一個JSP動態(tài)元素,動態(tài)元素的結(jié)果作為屬性值,例如 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包,在包內(nèi)新建三個標簽實現(xiàn)類
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"); } /** * 服務器默認先執(zhí)行該方法 */ public void setJspContext(JspContext pc) { this.pc = (PageContext) pc; } }
TagDemo2.java (有標簽體 處理標簽體內(nèi)容)
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方法將標簽體內(nèi)容寫入到參數(shù)Writer對象sw中 jf.invoke(sw); // 獲取標簽體內(nèi)容 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文件
配置內(nèi)容如下:
<?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 測試自定義標簽內(nèi)容
<%@ 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>
啟動服務器,運行結(jié)果如下:
以上所述是小編給大家介紹的JavaWeb開發(fā)之JSTL標簽庫的使用、 自定義EL函數(shù)、自定義標簽(帶屬性的、帶標簽體的),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java定義棧結(jié)構(gòu),并實現(xiàn)入棧、出棧操作完整示例
這篇文章主要介紹了Java定義棧結(jié)構(gòu),并實現(xiàn)入棧、出棧操作,結(jié)合完整實例形式分析了java數(shù)據(jù)結(jié)構(gòu)中棧的定義、以及入棧、出棧、棧是否為空判斷、棧大小計算、打印棧元素等相關(guān)操作技巧,需要的朋友可以參考下2020-02-02springsecurity實現(xiàn)攔截器的使用示例
Spring Security 可以替代攔截器,同時還可以提供更加細粒度的權(quán)限控制和身份認證,本文就來介紹一下springsecurity實現(xiàn)攔截器的使用示例,感興趣的可以了解一下2023-10-10