傳統(tǒng)標(biāo)簽技術(shù)復(fù)雜
寫一個(gè)類實(shí)現(xiàn)Tag接口
寫一個(gè)tld文件蜕着,描述寫好的類
在JSP頁(yè)面引入tld文件龟梦,就可以在JSP文件使用自定義標(biāo)簽了
生命周期傳統(tǒng)標(biāo)簽處理類在標(biāo)簽被第一次使用時(shí)創(chuàng)建實(shí)例募胃,從此駐留內(nèi)存為后續(xù)請(qǐng)求提供服務(wù),其中每次標(biāo)簽執(zhí)行都會(huì)依次執(zhí)行setPageContext(PageContext pc) 、setParent(Tag t) 、doStartTag() 龄句、doEndTag() 、~在服務(wù)器停止之前調(diào)用release()
tld文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">//修改此路徑才能智能提示
1.0
MyTag
http://www.itheima.com/MyTag
showip
com.itheima.tag.ShowIpTag
empty//標(biāo)簽體內(nèi)容JSP表示任意jsp內(nèi)容散罕,empty代表只能為空分歇、scriptless帶表不能包含腳本內(nèi)容、tagdependent代表其中的內(nèi)容是用來給服務(wù)器用的欧漱,不是輸出到瀏覽器的內(nèi)容
Demo1
com.itheima.tag.Demo1Tag
JSP
SimpleShowIp類
package com.itheima.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class ShowIpTag implements Tag {
private PageContext pc = null;
public intdoEndTag()throws JspException {
//EVAL_PAGE -- 結(jié)束標(biāo)簽之后的剩余頁(yè)面需要去執(zhí)行
//SKIP_PAGE -- 結(jié)束標(biāo)簽之后的剩余頁(yè)面不要去執(zhí)行
return 0;
}
public intdoStartTag()throws JspException {
try {
String ip = pc.getRequest().getRemoteAddr();
pc.getOut().write(ip);
} catch (IOException e) {
e.printStackTrace();
}
//Eval_Body_Include -- 開始標(biāo)簽之后的標(biāo)簽體需要執(zhí)行
//Skip_Body -- 開始標(biāo)簽之后的標(biāo)簽體不需要執(zhí)行
return 0;
}
public Tag getParent() {
return null;
}
public void release() {
}
public voidsetPageContext(PageContext pc) {
this.pc = pc;
}
public void setParent(Tag t) {
}
}
在JSP頁(yè)面使用
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.itheima.com/MyTag" prefix="MyTag" %>
java輸出的ip:<%=request.getRemoteAddr() %>
標(biāo)簽輸出的ip:
簡(jiǎn)單標(biāo)簽輸出的ip:
簡(jiǎn)單標(biāo)簽技術(shù)
寫一個(gè)類繼承SimpleTag接口(或者繼承SimpleTag默認(rèn)實(shí)現(xiàn)類)
寫一個(gè)tld文件职抡,描述寫好的類
在JSP頁(yè)面引入tld文件,就可以在JSP文件使用自定義標(biāo)簽了
生命周期?setJspContext(JspContext pc) 误甚、setParent(JspTag parent) 如果沒有父標(biāo)簽就不調(diào)用缚甩、如果有屬性就調(diào)用對(duì)應(yīng)的setXXX方法如果有el表達(dá)式谱净,則計(jì)算結(jié)果后傳入、如果有標(biāo)簽體調(diào)用setJspBody(JspFragment jspBody)? 蹄胰、doTag() 執(zhí)行標(biāo)簽體處理.每次訪問該標(biāo)簽時(shí)都創(chuàng)建簡(jiǎn)單標(biāo)簽實(shí)例岳遥,每次使用后銷毀該實(shí)例。
SimpleShowIp類
package com.itheima.simletag;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;
public class SimpleShowIp implements SimpleTag {
private JspContext pc = null;
public void doTag() throws JspException, IOException {
PageContext pcx = (PageContext) pc; //需要強(qiáng)轉(zhuǎn)
String ip = pcx.getRequest().getRemoteAddr();
pcx.getOut().write(ip);
}
public JspTag getParent() {
return null;
}
public void setJspBody(JspFragment jspBody) {
}
public void setJspContext(JspContext pc) {//是PageContext的父親
this.pc = pc;
}
public void setParent(JspTag parent) {
}
}
tld文件
//定義TAG
simpleshowip
com.itheima.simletag.SimpleShowIp//所使用的類
empty//標(biāo)簽體內(nèi)容JSP表示任意jsp內(nèi)容裕寨,empty代表只能為空、scriptless帶表不能包含腳本內(nèi)容派继、tagdependent代表其中的內(nèi)容是用來給服務(wù)器用的宾袜,不是輸出到瀏覽器的內(nèi)容
SimpleDemo1類
package com.itheima.simletag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleDemo1 extends SimpleTagSupport {
private int times;
public void setTimes(int times) {
this.times = times;
}
@Override
public void doTag() throws JspException, IOException {
//--控制標(biāo)簽體是否執(zhí)行
//----控制標(biāo)簽體不執(zhí)行,什么都不做標(biāo)簽體就不會(huì)執(zhí)行
//----控制標(biāo)簽體執(zhí)行,只要調(diào)用封裝著標(biāo)簽體的JSPFragment對(duì)象的invoke方法就可以執(zhí)行標(biāo)簽體
//JspFragment fragment = getJspBody();
//fragment.invoke(getJspContext().getOut());
//fragment.invoke(null);
//--控制標(biāo)簽之后的內(nèi)容是否執(zhí)行
//----控制標(biāo)簽之后的內(nèi)容執(zhí)行:什么都不做,標(biāo)簽之后的內(nèi)容就會(huì)執(zhí)行
//----控制標(biāo)簽之后的內(nèi)容不執(zhí)行:拋出SkipPageException這樣的一個(gè)異常就可以控制標(biāo)簽之后的內(nèi)容不執(zhí)行
//throw new SkipPageException();
//--控制標(biāo)簽體重復(fù)執(zhí)行
for(int i=0;i
getJspBody().invoke(null);
//--修改標(biāo)簽體后進(jìn)行輸出
//StringWriter writer = new StringWriter();
//JspFragment fragment = getJspBody();
//fragment.invoke(writer);
//String str = writer.toString();
//str = str.toUpperCase();
//getJspContext().getOut().write(str);
}
}
tld文件
simpleDemo1
com.itheima.simletag.SimpleDemo1
scriptless //標(biāo)簽體內(nèi)容JSP表示任意jsp內(nèi)容,empty代表只能為空驾窟、scriptless帶表不能包含腳本內(nèi)容、tagdependent代表其中的內(nèi)容是用來給服務(wù)器用的,不是輸出到瀏覽器的內(nèi)容
times
true//是否為必須
true//是否支持EL表達(dá)式
int//屬性的JAVA類型
用法
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.itheima.com/MyTag" prefix="MyTag"%>
標(biāo)簽之前
x
標(biāo)簽之后