Java自定义标签
簡單例子
實現一個標簽分為兩步:(1)繼承SimpleTagSupport或TagSupport實現一個控制器(2)創建一個描述標簽的tld文件。下面是一個簡單例子:
(1)實現一個標簽控制器,向頁面輸出“hello”:
public class Test extends SimpleTagSupport{public void doTag() throws IOException{JspWriter out = getJspContext().getOut();out.write("hello");}}(2)在WEB-INF文件夾下創建一個custom.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 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" %>指令導入標簽庫):
<%@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方式講得非常透徹淺顯易懂,鏈接:jsp自定義標簽教程 .pdf
下面是一些例子:
定義標簽屬性
(1)首先在控制器里填加一個屬性,并生成setter 方法
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>標簽:
<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表達式等)
<!-- 獲取標簽體,輸出 --><tag><name>Hello</name><tag-class>com.huanle.utils.tags.Test</tag-class><body-content>scriptless</body-content></tag>(2)在標簽控制器中獲得標簽體并輸出:
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));} }使用時就可以包含標簽體了:
<my:Hello>hello</my:Hello>繼承TagSupport實現更復雜的標簽
(后面更新。。。)
在標簽內部使用request
標簽屬于其實最終會轉化成一個Servlet,所有Servlet能做的標簽都能做,包括操作request,session等,其中關鍵就在getJspContext()方法上。代碼如下:
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);...}}總結
- 上一篇: nodeJS中的异步编程
- 下一篇: mysql如何创建视图语句_创建视图的语