本文實例講述了Java自定義標簽用法。分享給大家供大家參考,具體如下:
簡單例子
實現一個標簽分為兩步:(1)繼承SimpleTagSupport或TagSupport實現一個控制器(2)創建一個描述標簽的tld文件。下面是一個簡單例子:
(1)實現一個標簽控制器,向頁面輸出“hello”:
1
2
3
4
5
6
|
public class Test extends SimpleTagSupport{ public void doTag() throws IOException{ JspWriter out = getJspContext().getOut(); out.write( "hello" ); } } |
(2)在WEB-INF文件夾下創建一個custom.tld文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<? 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 web-jsptaglibrary_2_0.xsd" > < tlib-version >1.0</ tlib-version > < jsp-version >2.0</ jsp-version > < short-name >my</ short-name > <!-- 直接顯示hello --> < tag > < name >Hello</ name > < tag-class >com.huanle.utils.tags.Test</ tag-class > < body-content >empty</ body-content > </ tag > </ taglib > |
上面代碼通過<tag>標簽描述一個自定義標簽,<body-content>empty</body-content>表示這個標簽沒有標簽體,也就是開始標簽和結束標簽之間沒有內容。
接下就可以在jsp文件中使用這個標簽了(記得使用<%@taglib prefix="my" uri="/WEB-INF/custom.tld" %>指令導入標簽庫):
1
2
3
4
5
6
7
8
9
10
11
|
<%@taglib prefix="my" uri="/WEB-INF/custom.tld" %> <!DOCTYPE html> < html > < head > < title >標簽</ title > </ head > < body > < p >沒有標簽體,直接輸出內容的標簽</ p > < my:Hello /> </ body > </ html > |
繼承SimpleTagSupport定義簡單標簽
繼承SimpleTagSupport,然后實現doTag()方法就可以自定義一個標簽。這里有份英文教程,對繼承SimpleTagSupport方式講得非常透徹淺顯易懂,本站下載鏈接。
下面是一些例子:
定義標簽屬性
(1)首先在控制器里填加一個屬性,并生成setter 方法
1
2
3
4
5
6
7
8
9
10
|
public class Test extends SimpleTagSupport{ private String name; public void doTag() throws IOException{ JspWriter out= getJspContext().getOut(); out.write( "hello" ); } public void setName(String name) { this .name = name; } } |
(2)在tld文件里添加這個屬性的描述,用<attribute>標簽:
1
2
3
4
5
6
7
8
|
< tag > < name >Hello</ name > < tag-class >com.huanle.utils.tags.Test</ tag-class > < body-content >empty</ body-content > < attribute > < name >name</ name > </ attribute > </ tag > |
<attribute>標簽有多個子標簽可以用來定義該屬性的限制:
名稱 | 用處 |
---|---|
name | 定義屬性名 |
required | 定義該屬性是否是必須的,默認是false |
rtexprvalue | 定義是否允許使用一個運行時表達式的值作為該屬性的值,默認為false。比如要支持EL表達式,這個屬性應該置為true |
type | 定義屬性的值類型,默認是String |
fragment | 聲明這個變量是否應該被看做JspFragment. |
定義標簽體
之前定義的標簽標簽體一直都是空的,如果要支持標簽體:
(1)修改tld文件的<body-content>值為scriptless,表示有標簽體,并且標簽體不含腳本(指jsp腳本,EL表達式等)
1
2
3
4
5
6
|
<!-- 獲取標簽體,輸出 --> < tag > < name >Hello</ name > < tag-class >com.huanle.utils.tags.Test</ tag-class > < body-content >scriptless</ body-content > </ tag > |
(2)在標簽控制器中獲得標簽體并輸出:
1
2
3
4
5
6
7
|
public class Test extends SimpleTagSupport { private StringWriter sw = new StringWriter(); public void doTag() throws JspException, IOException{ getJspBody().invoke(sw); getJspContext().getOut().write(sw.toString().trim().substring( 0 , length)); } } |
使用時就可以包含標簽體了:
1
|
< my:Hello >hello</ my:Hello > |
繼承TagSupport實現更復雜的標簽
(后面更新。。。)
在標簽內部使用request
標簽屬于其實最終會轉化成一個Servlet,所有Servlet能做的標簽都能做,包括操作request,session等,其中關鍵就在getJspContext()
方法上。代碼如下:
1
2
3
4
5
6
7
8
9
|
public class DispalyErrorMessageTag extends SimpleTagSupport { public void doTag() throws IOException{ JspWriter out = getJspContext().getOut(); PageContext pageContext = (PageContext)getJspContext(); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); String value = request.getParameter(param); ... } } |
希望本文所述對大家java程序設計有所幫助。
原文鏈接:http://blog.csdn.net/ruangong1203/article/details/51101043