日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java自定义标签

發布時間:2023/12/10 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);...}}

總結

以上是生活随笔為你收集整理的Java自定义标签的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。