1、標(biāo)簽的作用
自定義標(biāo)簽是屬于JSP規(guī)范的。
開(kāi)發(fā)原則:JSP中不要使用<%%>(標(biāo)簽替換)和<%=%>(EL表達(dá)式)
自定義標(biāo)簽的作用:替換掉JSP中的JSP腳本(<%%>)肯污,實(shí)現(xiàn)一些簡(jiǎn)單的邏輯運(yùn)算。
2、標(biāo)簽的開(kāi)發(fā)步驟
a渐裂、編寫(xiě)一個(gè)類(lèi)豺旬,實(shí)現(xiàn)一個(gè)接口javax.servlet.jsp.tagext.SimpleTag.或者繼承javax.servlet.jsp.tagext.SimpleTagSupport。
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
//繼承? SimpleTagSupport
public class GetCurrentTime extends SimpleTagSupport {
@Override
//實(shí)現(xiàn) ?dotag方法
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
super.doTag();
Date now = new Date();
DateFormat formate = new SimpleDateFormat();
String str = formate.format(now);
//獲取content
PageContext content? = (PageContext)getJspContext();
//輸出
content.getOut().write(str);
}
}
b柒凉、在WEB-INF目錄下族阅,建立一個(gè)擴(kuò)展名為tld(Tag Libary
Definition)的xml文件。
注:tld如果在WEB-INF或者在jar包的META-INF目錄下膝捞,都能自動(dòng)找到坦刀。
<?xml version = "1.0" encoding="UTF-8" ?>
<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 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>名字</short-name>
<uri>http://www.jiangjianli.com/Demo1</uri>
<tag>
//description否用于指定屬性的描述信息。
<description>demo1</description>
//name 必須有 ?用于指定屬性的名稱(chēng)蔬咬。屬性名稱(chēng)是大小寫(xiě)敏感的鲤遥,并且不能以jsp、_jsp林艘、java和sun開(kāi)頭盖奈。
<name></name>
//完整類(lèi)名
<tag-class></tag-class>
//?empty:沒(méi)有標(biāo)簽體
//scriptless:標(biāo)簽體可以包含el表達(dá)式和JSP動(dòng)作元素,但不能包含JSP的腳本元素? <前綴名:tagname></前綴名:tagname> ? ? ? ? ? ? ? ?這種方式調(diào)用
//如果是empty 在JSP可<前綴名:tagname/>調(diào)用
<body-content>scriptless</body-content>
<attribute>//標(biāo)簽中有參數(shù)是需配置參數(shù)名
<name></name>
<required>true</required>
//是否支持el表達(dá)式
<rtexprvalue>true</rtexprvalue>
</attribtue>
</tag>
在標(biāo)簽調(diào)用時(shí)傳遞了內(nèi)容如<demo:demo1>abcdef</demo:demo1>將會(huì)調(diào)用setJspBody方法
/*. 若存在標(biāo)簽體, JSP 引擎將把標(biāo)簽體封裝成一個(gè) JspFragment
對(duì)象狐援,調(diào)用setJspBody方法將JspFragment對(duì)象傳遞給標(biāo)
簽處理器對(duì)象钢坦。若標(biāo)簽體為空,這setJspBody將不會(huì)被
JSP引擎調(diào)用
*/
可以通過(guò)在dotag方法中通過(guò)下面代碼獲取到內(nèi)容
StringWriter sw = new StringWriter();
//將內(nèi)容寫(xiě)到SW中
getJspBody().invoke(sw);
//轉(zhuǎn)換為字符串
String str = sw.getBuffer().toString();
//輸出到瀏覽器
PageContext page = (PageContext)getJspContext();
page.getOut().write(str);