|
在jsp開發(fā)時,當jsp內(nèi)置標簽以及JSTL標簽庫都滿足不了需求時,可以根據(jù)自己的需求來自定義標簽。其實在jsp頁面使用標簽就等同于調(diào)用某個對象的某個方法。 自定義標簽步驟:先定義標簽處理類(如繼承SimpleTagSupport類),再編寫TLD文件(標簽庫描述庫文件)。 定義標簽類可以編寫一個實現(xiàn)SimpleTag接口的類, public class MyTag1 implements SimpleTag { private PageContext context; private JspFragment body; @Override public void doTag() throws JspException, IOException { context.getOut().print("這是一個自定義標簽"); } @Override public JspTag getParent() { return null; } //下面三個方法都在doTag方法之前被tomcat之前調(diào)用,所以在doTag方法中就可以使用傳遞過來的對象 //設(shè)置標簽體 @Override public void setJspBody(JspFragment body) { this.body =body; } //設(shè)置jsp上下文對象,它子類是PageContext @Override public void setJspContext(JspContext context) { this.context = (PageContext) context; } //設(shè)置父標簽 @Override public void setParent(JspTag arg0) { } } 上面代碼中的doTag()的方法是每次執(zhí)行標簽都會調(diào)用的方法,在這個方法之前有setJspBody()、setJspContext()以及setParent()方法都會比doTag先給Tomcat(服務器)調(diào)用,所以把傳遞過來的對象賦值給成員變量后,就可以在doTag方法里面就可以使用傳過來的對象了(這里沒有用到父標簽所以setParent方法體沒寫代碼),其中在doTag方法里面使用PageContext對象獲取輸出流輸出了一句字符串。 編寫好標簽處理類后,還需要在配置tld文件。 一般tld文件都放在WEB-INF下,這樣可以保證客戶端訪問不到 tld文件代碼(其實是一個xml) <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java./xml/ns/javaee" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://java./xml/ns/javaee http://java./xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1">
<tlib-version>1.0</tlib-version><!-- 自定義標簽庫的版本號 --> <short-name>tag</short-name><!-- 自定義標簽庫的簡稱 --> <uri>http://www./tag1.0</uri><!-- 自定義標簽庫的uri -->> <tag> <name>MyTag1</name><!—指定當前標簽名稱 --> <tag-class>cn.tianye.tag.MyTag1</tag-class><!—指定當前對應標簽出處理類 --> <body-content>empty</body-content><!-- 標簽體內(nèi)容格式 --> </tag> </taglib> 上面需要這注意的是<body-content>元素的可選值有 empty:也就是沒有標簽體(如果在這里設(shè)置的是empty,那么在jsp頁面上就不能有標簽體。) JSP:傳統(tǒng)標簽支持它,SimpleTag已經(jīng)不支持使用<body-content>JSP</body-content> (標簽內(nèi)容是可以有任何東西,比如EL,JSTL,HTML以及<%%>等) scriptless:標簽體內(nèi)容不能是java腳本,可以是EL,JSTL,字符串等,在SimpleTag中需要標簽體可以使用這選項。 tagdependent:標簽體內(nèi)容不作運算,全由標簽處理類自行處理,無論標簽體內(nèi)容是EL,JSTL等,都不會作運算。(這個基本沒有人會使用,因為用起來太麻煩,什么都要自己處理) 配置好tld文件后就可以在jsp頁面上使用了,在使用自定義標簽之前,需要先使用指令導入標簽庫。 使用taglib導入標簽庫,uri是tld文件的存放位置 <%@taglib prefix="t" uri="/WEB-INF/tlds/tianye.tag.tld" %> 使用自定義標簽 <hr> <h1><t:MyTag1/></h1> <hr>
效果
自定義有標簽體的標簽 首先需要獲取標簽體對象(JspBody)、把標簽體內(nèi)容輸出到頁面、tld中指定標簽內(nèi)容格式為scriptless。 標簽處理類代碼 public class MyTag3 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { this.getJspContext().getOut().print("***************<br>"); //執(zhí)行標簽體的內(nèi)容,把結(jié)果輸出到頁面 Writer writer = this.getJspContext().getOut(); this.getJspBody().invoke(writer); this.getJspContext().getOut().print("<br>***************"); } }注:上面的類繼承了SimpleTagSupport類(SimpleTagSupport類實現(xiàn)了SimpleTag接口,也就是它已經(jīng)把所有Tomcat(服務器)傳遞的對象保存了,不需要我們自己操作保存?zhèn)鬟f過來的對象了,同時也提供了get方法供子類調(diào)用),重寫了doTag()方法,然后調(diào)用對象獲取當前jsp輸出流,執(zhí)行標簽體內(nèi)容,把結(jié)果寫入指定流中即輸出到頁面上。 tld文件(也就是<body-content>可選項改為scriptless,其他跟前面的一樣) <tag> <name>MyTag3</name> <tag-class>cn.tianye.tag.MyTag3</tag-class> <body-content>scriptless</body-content> </tag> 在jsp頁面上使用標簽(可以標簽體可以是EL,也可以是字符串) <%request.setAttribute("title", "It doesn't matter where you came from,"); %> <h1><t:MyTag3>${requestScope.title }</t:MyTag3></h1> <h1><t:MyTag3>what matters is who you choose to be.</t:MyTag3></h1> 效果 其中還可以自定義帶有屬性的標簽,這里就不過多描述 |
|
|