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函數)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標籤庫關於導入版本號的問題
        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>標籤

  • <c:catch>標籤用於捕獲嵌套在標籤中的內容拋出的異常。其語法格式例如如下:<c:catch [var="varName"]> nested actions </c:catch>
  • var屬性用於標識<c:catch>標籤捕獲的異常對象,它將保存在page這個web域中。
關鍵代碼:
<%@ 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"的複雜條件推斷結構html

<%@ 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>迭代數據java

從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追蹤的功能)web

屬性名 是否支持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 當要使用相對路徑重定向到同一個server下的其它WEB應用程序中的
資源時,context屬性指定其它WEB應用程序的名稱

注意:假設重定向第三方的站點時要使用絕對路徑(不能再使用Context)
<%
// 曾經重定向
// response.sendRedirect("/day12/index.jsp");
%>
<c:redirect url="/index.jsp" context="/day12"></c:redirect>

在WebRoot/jstl下新建redirect.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: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。sql

好比:fn:indexOf("www.it315.org","t3") 的返回值爲5

fn:contains

    fn:contains函數檢測一個字符串中是否包括指定的字符串,返回值爲布爾類型。

fn:contains函數在比較兩個字符串是否相等時是大寫和小寫敏感的。express

    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。好比:apache

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容器首先計算表達式的值。而後把值傳遞給標籤處理器對象。tomcat

  • 假設簡單標籤有標籤體。容器將調用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");
	}
	
	/**
	 * server默認先運行該方法
	 */
	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>
啓動server。執行結果例如如下:
相關文章
相關標籤/搜索