自定義標籤:用於移除Jsp頁面中的java代碼。
完成自定義標籤的步驟:
JSP文件:
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@tagliburi="http://www.itcast.cn"prefix="itcast"%>
<!DOCTYPEHTMLPUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP '1.jsp' starting page</title>
</head>
<body>
您的IP是:<itcast:viewIP/>
</body>
</html>
1、 編寫一個實現Tag接口的Java類,把頁面java代碼移到這個java類中(標籤處理器類)------一般實現TagSupport
publicclassViewIPTagextends TagSupport{
@Override
publicint doStartTag()throws JspException {
HttpServletRequest request=(HttpServletRequest) this.pageContext.getRequest();
JspWriter out=this.pageContext.getOut();
String ip=request.getRemoteAddr();
try {
out.print(ip);
} catch (IOException e) {
thrownew RuntimeException(e);
}
returnsuper.doStartTag();
}
}
2、 編寫標籤庫描述符(tld)文件,在tld文件中把標籤處理器描述成一個標籤
<?xmlversion="1.0"encoding="UTF-8"?>
<taglibxmlns="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"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>itcast</short-name>
<uri>http://www.itcast.cn</uri>
<tag>
<name>viewIP</name>
<tag-class>cn.itcast.web.tag.ViewIPTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
Tag接口的執行流程:
1、 public void setPageContext(PageContext pc),JSP引擎實例化標籤處理器後,將調用setPageContext方法將JSP頁面的pageContext對象傳遞給標籤處理器,標籤處理器以後可以通過這個pagContext對象與JSP頁面進行通信
2、 public void setParent(Tag t),如果當前標籤沒有父標籤,則傳遞給setParent方法的參數值爲null
3、 public int doStartTag(),web容器執行到自定義標籤的開始標記時,就會調用標籤處理器的doStartTag方法
4、 public int doEndTag(),web容器執行完自定義標籤的標籤體後,就會接着去執行自定義標籤的結束標記,此時,web容器就會調用標籤處理器的doEndTag方法
5、 public void release(),通常web容器執行完自定義標籤後,標籤處理器會駐留在內存中,爲其他請求服務器,直至停止web應用時,web容器纔會調用release方法。
自定義標籤功能擴展:
1、 控制JSP頁面某一部分內容是否執行;à改變doStartTag( )的返回值(Tag.EVAL_BODY_INCLUDE和SKIP_BODY)
2、 控制整個JSP頁面是否執行à改變doEndTag( )的返回值(Tag.SKIP_PAGE和Tag.EVAL_PAGE)
3、 控制JSP頁面重複執行[IterationTagàdoAfterBody( )à標籤體之後,結束標籤執行之前執行àEVAL_BODY_AGAIN、SKIP_BODY]--à繼承TagSupport,先覆蓋doStartTag( ),設置爲EVAL_BODY_INCLUDE,讓標籤體執行,然後doAfterBody();
4、 修改JSP頁面內容輸出[繼承BodyTagSupport]
(1)、先覆蓋doStartTag(),返回BodyTag.EVAL_BODY_BUFFEREDà將標籤體內容作爲對象返回
(2)、覆蓋doEndTag(),
publicint doEndTag()throws JspException {
BodyContent bc=this.getBodyContent();
String content=bc.getString();
content=content.toUpperCase();
try {
this.pageContext.getOut().write(content);
} catch (IOException e) {
thrownew RuntimeException(e);
}
return Tag.EVAL_PAGE;
}
}
SimpleTag(簡單標籤)
JspFragment jf=this.getJspBody( );
控制整個Jsp不執行:Throw new SkipPageException;
簡單標籤的執行流程:
1、 遇到簡單標籤;
2、 實例化標籤處理器類;
3、 調用setJspContext( ),把頁面pageContext傳遞給標籤處理器類;
4、 調用setParent把父標籤傳遞進去,如果沒有父親,傳null;
5、 調用setJspBody(),把封裝了標籤體JspFragment傳遞給標籤處理器類;
6、 執行頁面中的自定義標籤,執行標籤實際上就是調用doTag()。
開發帶屬性的標籤:
1、 在標籤處理器中編寫每個屬性對應的setter方法
2、 在tld文件中描述標籤的屬性;