由於傳統標籤使用三個標籤接口(Tag、IterationTag、BodyTag)來完成不同的功能,顯得過於繁瑣,不利於標籤技術的推廣,SUN公司爲降低標籤技術的學習難度,在JSP 2.0中定義了一個更爲簡單、便於編寫和調用的SimpleTag接口來實現標籤的功能。實現SimpleTag接口的標籤通常稱爲簡單標籤。
SimpleTag接口有5個方法:
用於把JSP頁面的pageContext對象傳遞給標籤處理器對象
(2)setParent方法
用於把父標籤處理器對象傳遞給當前標籤處理器對象
(3)getParent方法
用於獲得當前標籤的父標籤處理器對象
(4)setJspBody方法
用於把代表標籤體的JspFragment對象傳遞給標籤處理器對象
(5)doTag方法
用於完成所有的標籤邏輯,包括輸出、迭代、修改標籤體內容等。在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用於通知WEB容器不再執行JSP頁面中位於結束標記後面的內容,這等效於在傳統標籤的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。
有一個默認實現類:SimpleTagSupport,在簡單標籤裏面,無論做什麼,都是在doTag方法裏面做的
1.控制標籤體是否執行
(1)默認是不執行的(不會輸出標籤體)
public class Demo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
}
}
(2)控制標籤體輸出
public class SimpleTagDemo1 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody(); //得到標籤體
//jf.invoke(this.getJspContext().getOut());//標籤體執行
//jf.invoke(null);//標籤體執行
//上面兩行代碼任意一行都可以控制標籤體的執行
}
}
2.用簡單標籤控制標籤體重複執行
//重複執行標籤體
public class SimpleTagDemo2 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
for(int i=0;i<5;i++){
jf.invoke(null);
}
}
}
3.用簡單標籤修改標籤體
public class SimpleTagDemo3 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
StringWriter sw = new StringWriter();
jf.invoke(sw);
String content = sw.toString();
content = content.toUpperCase();
this.getJspContext().getOut().write(content);
}
}
4.用簡單標籤控制jsp頁面是否執行
public class SimpleTagDemo4 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
throw new SkipPageException();
}
}
5.JspFragment類
javax.servlet.jsp.tagext.JspFragment類是在JSP2.0中定義的,它的實例對象代表JSP頁面中的一段符合JSP語法規範的JSP片段,這段JSP片段中不能包含JSP腳本元素。
WEB容器在處理簡單標籤的標籤體時,會把標籤體內容用一個JspFragment對象表示,並調用標籤處理器對象的setJspBody方法把JspFragment對象傳遞給標籤處理器對象。JspFragment類中只定義了兩個方法,如下所示:
(1)getJspContext方法
用於返回代表調用頁面的JspContext對象.
(2)public abstract void invoke(java.io.Writer out)
用於執行JspFragment對象所代表的JSP代碼片段
參數out用於指定將JspFragment對象的執行結果寫入到哪個輸出流對象中,如果傳遞給參數out的值爲null,則將執行結果寫入到JspContext.getOut()方法返回的輸出流對象中。(簡而言之,可以理解爲寫給瀏覽器)
6.JspFragment類中invoke方法詳解
JspFragment.invoke方法是JspFragment最重要的方法,利用這個方法可以控制是否執行和輸出標籤體的內容、是否迭代執行標籤體的內容或對標籤體的執行結果進行修改後再輸出。例如:
(1)在標籤處理器中如果沒有調用JspFragment.invoke方法,其結果就相當於忽略標籤體內容;
(2)在標籤處理器中重複調用JspFragment.invoke方法,則標籤體內容將會被重複執行;
(3)若想在標籤處理器中修改標籤體內容,只需在調用invoke方法時指定一個可取出結果數據的輸出流對象(例如StringWriter),讓標籤體的執行結果輸出到該輸出流對象中,然後從該輸出流對象中取出數據進行修改後再輸出到目標設備,即可達到修改標籤體的目的。