自定義標簽需要實現SimpleTag接口,在定義標簽的時候,只需要實現該接口的幾個方法就可以了.
在調用自定義標簽的時候,會默認調用者幾個方法.而且執行是有順序的,順序就是上面這個樣子.
其中:
JspFragment代表某個對象中的部分JSP代碼,在simpleTag接口中,就是JSP標簽的正文部分.
JspFragment對象中有一個void invoke(Writer out)
可以執行該片段,並將所有輸出定向到給定 Writer,如果 out 為 null,則將輸出定向到與該片段關聯的 JspContext 的 getOut() 方法返回的 JspWriter
S1:實現一個類
java ee提供了一個SimpleTag的實現類,在使用的時候,可以直接繼承這個類,然後選擇需要的方法重寫就可以了.
package userDefinedJspTag;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class TagDemo1 extends SimpleTagSupport {
private PageContext pc;
@Override
public void setJspContext(JspContext pc) {
this.pc = (PageContext) pc;
}
@Override
public void doTag() throws JspException, IOException {
pc.getOut().print("hello");
}
}
S2:編輯TLD配置文件
跟自定義el函數差不多,只是這裡使用的是tag標簽.
<?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>myfn</short-name>
<uri>http://www.thecatcher/mytag</uri>
<!-- 配置自定義標簽 -->
<tag>
<name>printHi</name>
<tag-class>userDefinedJspTag.TagDemo1</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
S3:JSP文件中引入並使用
...
<%@ taglib uri="http://www.thecatcher/mytag" prefix="mytag"%>
...
<mytag:printHi/>
帶有主體的標簽,跟不帶主題的標簽差不多.
doTag()方法裡,聲明一個JspFragment,然後invoke一下就可以了
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
// jf.invoke(pc.getOut());
//把這裡寫成null的話,服務器底還是會自動給丫傳入一個out的.
jf.invoke(null);
}
TLD的配置也有點不同,body-content這裡不能再寫empty了.
body-content有四個值可選:
使用EL表達式,jsp標簽的主要目的就是減少java代碼的使用. 所以帶主體的標簽最常用的這個屬性就是scriptless.
<tag>
<name>out</name>
<tag-class>userDefinedJspTag.TagDemo2</tag-class>
<body-content>scriptless</body-content>
</tag>
使用的時候也很簡單,這樣就可以了. <mytag:out>你好啊.</mytag:out>