[Tag] TagSupport 模板和使用Attribute

實作Tag的java都可以成為jsp用的tag。不過每一次都需要自己實作Tag很麻煩,因此TagSupport是一個已經實作Tag的java class,讓我們更容易實作tag。

同時我們介紹如何自定義Attribute。

前言

實作Tag的java都可以成為jsp用的tag。不過每一次都需要自己實作Tag很麻煩,因此TagSupport是一個已經實作Tag的java class,讓我們更容易實作tag。

同時我們介紹如何自定義Attribute。

TagSupport

TagSupport幫我們直接實作了tag,如果我們要做一個簡單的自定義tag,我們可以使用TagSupport作為我們的base java class。

因此我們只需要override我們想要控制的部份即可。

自定義Tag包括Attribute

像在core jstl裡面的if有test attribute一樣,我們也可以自定義Attribute。

一個Attribute其實就是一個variable,因此我們的Tag class需要包括一個和attribute一樣名稱的variable,此variable要有對應的getter和setter。

範例:


private String name;

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

@Override
public int doEndTag()
{
		try {
			this.pageContext.getOut().println("name is : " + name);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	return EVAL_PAGE;
}

這邊我們定義了一個參數叫做name,然後在doEndTag()把它輸出來。

有了這個參數以後,我們需要在tld告知我們這個tag多了一個name Attribute,而做法就是在<tag>裡面增加一個<attribute>。

範例:


... 
<tag>
<name>test</name>
<tag-class>tag.TestTagSupport</tag-class>
<body-content>JSP</body-content>
<attribute>
	<name>name</name>
	<required>true</required>
	<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
...

最後呼叫就很簡單了:


<hello2:test name="AT" />

相信注意到了attribute有三個設定,前兩個應該都滿好理解,不過什麼是rtexprvalue?其實就是說是否接受用Scriptlet或者el方式assign值給這個 attribute。

動態attribute

剛剛定義tag Attribute的方式是先定義好了名稱,不過如果今天我要允許動態attribute,應該如何做呢?

我們只需要實作DynamicAttributes這個interface,然後在tld設定允許dynamic-attributes就可以了。

實作DynamicAttributes需要實作setDynamicAttributes來把動態attribute存起來,之後使用。下面是一個直接輸出的簡單範例:


...
public class TestTagSupport extends TagSupport implements DynamicAttributes {
private Map dynamicAttribute = new HashMap();
...
@Override
public void setDynamicAttribute(String uri, String key, Object value)
		throws JspException {
	dynamicAttribute.put(key, value.toString());
}
...
上面定義了一個map來儲存我們的動態的attribute。而在doEndTag()則把dynamicAttributefor一圈把內容輸出來而已。

現在要在我們tld定義<tag>的地方增加<dynamic-attributes>是true就okay了:


  <tag>
    <name>test</name>
    <tag-class>tag.TestTagSupport</tag-class>
    <body-content>JSP</body-content>
	<dynamic-attributes>true</dynamic-attributes>
    <attribute>
    	<name>name</name>
    	<required>true</required>
    	<rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

最後我們使用起來:


<hello2:test name="AT" a="123" b="456" />

a和b是動態attribute。

結語

這一篇介紹了tag裡面的attribute,並且介紹如何使用動態attribute。

透過attribute我們可以設定不同參數來達到修改程式邏輯。

Dotblogs 的標籤: ,

Google+

創用 CC 授權條款
Alan Tsai 的隨手筆記Alan Tsai製作,以創用CC 姓名標示 4.0 國際 授權條款釋出。