自定义标签主要有两种方式: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