?? jsp(day03).txt
字號:
2,寫標(biāo)簽庫定義文件,也就是定義標(biāo)簽的格式規(guī)范,也要符合自定義標(biāo)簽的規(guī)范 xxx.tld
3,建上述兩步中的相應(yīng) 文件進行部署。web.xml
tld文件中的配置
<tag>
<name>loop</name>
<tag-class>com.tag.LoopTag</tag-class>
<body-content>jsp</body-content>
<!--設(shè)定自定義標(biāo)簽體內(nèi)的內(nèi)容,可以置為empty,也就是只能寫空標(biāo)簽-->
<attribute>
<name>counter</name><!--配置自定義標(biāo)簽的屬性名-->
<required>true</required><!--配置屬性是否必須出現(xiàn)-->
<rtexprvalue>true</rtexprvalue><!--允許使用表達(dá)式作為屬性的值-->
<type>int<type><!--配置屬性的類型-->
</attribute>
</tag>
簡單的標(biāo)簽處理程序類
1,必須實現(xiàn)Tag接口的doStartTag()和doEndTag()方法;
2,因為不存在Body,doStartTag()方法必須返回SKIP_BODY;
3,如其余頁面要執(zhí)行,doEndTag()方法返回EVAL_PAGE, 否則返回SKIP_PAGE;
4,對于每一個標(biāo)簽屬性,你必須在標(biāo)簽處理程序類里定義一個特性以及get和set方法以一致于JavaBeans 體系慣例
帶Body的自定義標(biāo)簽
1,必須實現(xiàn)Tag接口的doStartTag()和doEndTag()方法;
2,可以實現(xiàn)IterationTag接口的doAfterBody()方法;
3,可以實現(xiàn)BodyTag接口的doInitBody和setBodyContent方法;
4,doStartTag方法可以返回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(當(dāng)你想使用 BodyContent);
5,doEndTag方法可以返回SKIP_PAGE或EVAL_PAGE;
6,doAfterBody方法可以返回EVAL_BODY_AGAIN, SKIP_BODY;
定義腳本變量的標(biāo)簽(迭代標(biāo)簽)
1,定義腳本標(biāo)簽的二個步驟:
. 在標(biāo)記庫描述符(TLD)文件中列明腳本變量;
. 定義標(biāo)簽擴展信息類(TEI)并且在TLD文件中包括這個類元素(tei-class);
2,變量必須在標(biāo)簽處理程序類中使用pageContext.setAttribute()方法設(shè)置;
3,標(biāo)簽擴展信息類(TEI)必須繼承TagExtraInfo以及覆蓋getVariableInfo()方法;
4,變量的范圍可以是AT_BEGIN, NESTED, AT_END(標(biāo)簽擴展信息類(TEI)的VariableInfo中定義)之一;
腳本變量的有效性
變量 | 有效性
---------------------------------------
NESTED | 標(biāo)簽中的參數(shù)在starttag到endtag之間是有效的
AT_BEGIN | 標(biāo)簽中的參數(shù)在標(biāo)簽的開始到JSP頁面結(jié)束是有效的
AT_END | 標(biāo)簽中的參數(shù)在標(biāo)簽的結(jié)束到JSP頁面結(jié)束是有效的
Tag接口的方法
interface javax.servlet.jsp.tagext.Tag
------------------------------------------------------
+EVAL_BODY_INCLUDE:int
+EVAL_PAGE:int//繼續(xù)執(zhí)行頁面
+SKIP_BODY:int//跳出標(biāo)簽體
+SKIP_PAGE:int//跳出頁面,也就是整個JSP不會再運行
------------------------------------------------------
+release():void
+getParent():javax.servlet.jsp.tagext.Tag
+setParent(javax.servlet.jsp.tagext.Tag):void
+doEndTag():int
+doStartTag():int
+setPageContext(javax.servlet.jsp.PageContext):void
Tag的生命周期
1,setPageContext(javax.servlet.jsp.PageContext):void
2,setParent(javax.servlet.jsp.tagext.Tag):void
3,setAttribute:void
4,doStartTag():int
5,doEndTag():int
6,release():void
BodyTag和Tag接口的關(guān)系
interface javax.servlet.jsp.tagext.BodyTag-->interface javax.servlet.jsp.tagext.Tag
------------------------------------------
+EVAL_BODY_AGAIN:int//繼續(xù)執(zhí)行標(biāo)簽體
-----------------------------------------
+doInitBody():void
+setBodyContent(javax.servlet.jsp.tagext.BodyContext):void
+doAfterBody():int
BodyTag的處理過程
1,setPageContext(javax.servlet.jsp.PageContext):void
2,setParent(javax.servlet.jsp.tagext.Tag):void //設(shè)置此標(biāo)簽的父標(biāo)簽,也就是上一層標(biāo)簽
3,setParent()
4,doStartTag():int
5,setBodyContent(javax.servlet.jsp.tagext.BodyContent):void//設(shè)置方法體
6,doInitBody():void//
7,doAfterBody():int
/* 這個方法會被不斷的調(diào)用直到不再滿足條件,通過這個方法來控制返回,從而控制循環(huán)是否中斷
SKIP_BODY是跳出標(biāo)簽體的,EVAL_BODY_INCLUDE是繼續(xù)執(zhí)行標(biāo)簽體,通過返回這兩個值來控制循環(huán)是否*/
8,doEndTag():int
9,release():void
SimpleTag接口的方法
javax.servlet.jsp.tagext.SimpleTag
------------------------------------------
+doTag():void
+getParent():JspTag
+setJspBody(JspFragment jspBody):void
+setJspContext(JspContext pc):void
+setParent(JspTag parent):void
SimpleTage接口的生命周期(JSP2.0的自定義標(biāo)簽接口)
1,new:
每次遇到標(biāo)簽,容器構(gòu)造一個SimpleTag的實例,這個構(gòu)造方法沒有參數(shù)。和紅典的標(biāo)簽一樣, SimpleTag不能緩沖,故不能重用,每次都需要構(gòu)造新的實例。
2,setJspContext()、setParent(): 只有這個標(biāo)簽在另一個標(biāo)簽之,才調(diào)用setParent()方法;
3,設(shè)置屬性:調(diào)用每個屬性的setter方法;
4,setJspBody();
5,doTag(): 所有標(biāo)簽的邏輯、迭代和Body計算,都在這個方法中;
6,return
例:
package com.tag;
public class HelloTag implements Tag
{
private PageContext pageContext;
private Tag parent;
public HelloTag(){
super();
}
/**
*設(shè)置標(biāo)簽的頁面的上下文
*/
public void setPageContext(final PageContext pageContext) {
this.pageContext=pageContext;
}
/**
*設(shè)置上一級標(biāo)簽
*/
public void setParent(final Tag parent) {
this.parent=parent;
}
/**
*開始標(biāo)簽時的操作
*/
public int doStartTag() throws JspTagException{
return SKIP_BODY; //返回SKIP_BODY,表示不計算標(biāo)簽體
}
/**
*結(jié)束標(biāo)簽時的操作
*/
public int doEndTag() throws JspTagException{
try{
pageContext.getOut().write("Hello World!你好,世界!");
}
catch(java.io.IOException e){
throw new JspTagException("IO Error: " + e.getMessage());
}
return EVAL_PAGE;
}
/**
*release用于釋放標(biāo)簽程序占用的資源,比如使用了數(shù)據(jù)庫,那么應(yīng)該關(guān)閉這個連接。
*/
public void release() {}
public Tag getParent(){
return parent;
}
}
xxx.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib 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"
version="2.0">
<tag>
<description>Extends TagSupport</description>
<name>hello</name>
<tag-class>com.tag.HelloWorldTag</tag-class>
<body-content>jsp</body-content>
</tag>
</taglib>
web.xml
<web-app>
<taglib-uri>/xxx</taglib-uri>
<taglib-location>/WEB-INF/tlds/xxx.tld</taglib-location>
</web-app>
xxx.jsp
<%@ taglib uri="/xxx" prefix="mytag" %>
<%@ page contentType="text/html; charset=gb2312" %>
<html><head><title>first cumstomed tag</title></head><body>
<p>以下的內(nèi)容從Taglib中顯示: </p>
<p><i><mytag:hello_int/></i>
<br>
<p><mytag:hello_int></mytag:hello_int>
</body></html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -