自定義標籤主要有兩種方式:html
方式1:定義一個類繼承TagSupport或它的子類,重寫相關方法以及本身的方法,固然也能夠不繼承上述類,本身寫類;其次是編寫tld文件,進行標籤和方法的描述;在web.xml中進行註冊。上篇以簡要介紹過。
java
方式2:在WEB-INF下建一個tags文件夾,存放本身的標籤;建一個jsp文件,將後綴名改成tag,文件名改成這個標籤的功能名稱,下面舉個列子:
web
在WEB-INF下的tags建一個jsp命名爲hello.tag,將page指令改成tag指令裏面具體內容以下:session
<%@ tag pageEncoding="UTF-8" import="java.util.*"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ attribute name="name" type="java.lang.String" required="true"%> <%@ attribute name="items" type="java.util.List" required="true"%> //attribute有一rtexprvalue默認值爲true,表示能夠用EL表達式給這個屬性賦值。 //required爲true表示必填的屬性,其默認值爲false //type 爲前面name屬性的類型 <div class="nav dropdown pull-right"> <font color="red">${name}</font> <br> <c:forEach var="s" items="${items}" varStatus="ind"> ${ind.index+1}, <b>${s}</b> <br> </c:forEach> </div>
接下看看在index.jsp中的引用,代碼以下:
app
<%@ page language="java" pageEncoding="UTF-8" import="java.util.*"%> <%@ taglib prefix="kzw" tagdir="/WEB-INF/tags" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <% List<String> ss = new ArrayList<String>(){{ add("hello"); add("world"); add("你好"); }}; //request.setAttribute("ss", ss); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> </head> <body> <kzw:hello name="${1+233}" items="<%=ss%>"/> <br> </body> </html>
值得注意的:
jsp
當咱們在index.jsp中用<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>存儲一個值時,咱們的hello.tag標籤中是拿不到的,由於值的範圍在pageContext,能夠在<c:set/>標籤中將存儲範圍改成request。解析時,tag變爲jsp的一部分,因此request能夠。
函數
我的對這份理解,這個自定義的hello.tag就像是html的函數!
ui
有不正之處還請指正!Thank you!spa