天天看點

JSP 自定義标簽的學習

? 椤圭??涓?????椤墊??绛?璧?婧?????绛?杩?绋?璧?婧?璺?寰???绛??????у?舵??绛劇??浣跨??瀛????绛劇??????????绛?.

?

?

?

?

?

?

?

?

?Scriptlet瀵逛?蹇?????(fast-and-dirty)??缂????ヨ?存??涓?绉?涓????????╋?浣???浠??胯??ョ??锛??ㄩ??瑕?涓烘?ㄧ??JSP椤甸?㈤???╀?绉?涓??d???涔辯??瑙e?蟲?規?,???╀?缁存?ゃ??

浠?涔?浣跨??aglib锛?

??璋? ??璁闆?锛?tag library锛?锛??????卞??SP椤甸??腑浣跨?ㄧ????璁版??缁?????搴???JSP瀹瑰?ㄦ?ㄥ?烘?跺甫??涓?涓?灏???????榛?璁ょ????璁闆????? ??瀹?涔???璁闆???浜轟滑涓轟???绉??瑰?????ㄩ??????????锛?灏?涓?浜???璁版?懼?頒?璧瘋??褰㈡????涓?绉?搴????ㄤ?涓??㈤??涓?????宸ヤ???寮?????浠????戒?涓哄??????椤圭????寤轟?浜???甯哥?瑰????????瀹?涔???璁闆?锛????朵?浼???寤轟?涓????ㄨ??瀹?涔???璁闆?锛?浠ヤ?褰???浣跨?ㄣ??

<tools:usageGraph />

姣?涓???璁伴?藉????浜?????涓?涓?Java绫葷??寮????浣???绫諱腑??浠g??浠??跺?ㄥ??璇ュ?ㄧ???版?癸??ㄦ??绛句?澶?锛?涓?涓?缂?璇?濂界??绫繪??浠朵?涓???

?

?ㄤ?杈??鴻?婧?璺?寰???Tag??绛?

??寤烘??绛懼??姝?

?

??寤烘??绛懼?矽薄??绫?

package com.unutrip.common.web.tag;

import java.io.Writer;

import javax.servlet.jsp.JspException;

@SuppressWarnings("serial")

public class ResourceTag extends BodyTagSupport {

?private String url;//瀵瑰???灞??у?椤繪???稿???getter????setter灞????

?@Override

?public int doEndTag() throws JspException {

??try {

???Writer out = pageContext.getOut();

??????out.write(url);

???out.flush();

??} catch (Exception e) {

???e.printStackTrace();

??}

??return EVAL_PAGE;//寤鴻?????ㄥ父????绉?涓?寤鴻?????ㄥ父?????}

?

?@Override

?public int doStartTag() throws JspException {

??return SKIP_BODY;

?}

?public String getUrl() {

??return url;

?}

?public void setUrl(String url) {

??this.url = url;

?}

}

?變?涓???瑕??ㄦ?瘋??ワ???涓?璇ユ??璁頒?娌℃??灞??ф????宓??ョ????瀹癸???浠???涓???瑕??沖???涓?涓??版?規?灏辨??

doEndTag()

()锛??ㄨ?涓??規?涓?璇ユ??璁闆??浠ヨ??哄??瀹癸??ㄨ?涓?渚?瀛?涓???????淇??規?版??锛???SP椤甸????

?

??????JSP??璁伴?藉?璇ユ?╁?JSP绫?

javax.servlet.jsp.tagext.TagSupport

锛?杩?涓?绫諱負JSP??璁版??渚?浜??烘??妗??躲?????芥?ㄨ?娉ㄦ???幫?璇ユ??璁拌?????

EVAL_PAGE

.

EVAL_PAGE

??涓?涓?棰?瀹?涔????村??甯擱??锛?瀹???绀哄?瑰?ㄥ???椤甸?㈢???╀??ㄥ???????绉???椤瑰氨??浣跨??

SKIP_PAGE

锛?瀹?灏?涓?姝㈠?歸〉?㈠?╀??ㄥ????澶?????濡????ㄨ?灏??у?惰漿绉誨?闆???涓?椤甸???渚?濡??ㄨ???杩?锛?forward锛???????瀹???锛?redirect锛??ㄦ?鳳??d?????瑕?浣跨??

SKIP_PAGE

???╀??ョ??缁????芥??涓??堕?存?寵??韬????崇??浜?????

??寤?LD

?ヤ??ョ??涓?姝ユ????寤轟?涓? ??璁闆???杩扮???tag library descriptor 锛?TLD锛???浠躲??TLD??瀹瑰?ㄥ??浠諱?瑕?浣跨?ㄨ?ユ??璁闆???JSP椤甸?㈡??杩版?ㄧ????璁闆???娓??? 2 ?劇ず浜?涓?涓???甯告??????TLD锛??朵腑??????浜?涓?涓???璁般??褰??ㄥ??村?????璁版坊???闆?涓??訛?TLD??浠剁???垮害??澶????у???涔?澧??褲??

?

<?xml version="1.0" encoding="UTF-8"?>

<taglib version="2.0" 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">

?<display-name>"Unutrip Tags"</display-name>

?<tag>

? <name>resource</name>

? <tag-class>com.unutrip.common.web.tag.ResourceTag</tag-class>

? <body-content>empty</body-content>

? <attribute>

?? <name>url</name>

?? <required>true</required>

?? <rtexprvalue>true</rtexprvalue>

? </attribute>

?</tag>

</taglib>

??渚?浜?涓?涓?????锛?杩?瀵逛?璺?韪???涓???璁闆???JSP??寤鴻???ユ????涓?????寰??????灏ゅ?舵???ㄦ?ㄩ??瑕?缁?甯鎬慨?規??璁闆??????典??存??濡?姝わ?锛?璇ユ??璁闆???渚?璧???JSP????锛?涓?涓?涓鴻?ユ??璁闆??ㄨ??????缂?锛?浠ュ???ㄤ?寮??ㄨ?涓???璁闆???URI??娉ㄦ??锛???浣跨?ㄤ???缂?

short-name

浣?涓?RI??涓??ㄥ??锛?杩???姣?杈?瀹規??灏???缂?????璁闆???URI????涓?涓??翠???

?╀???淇℃???ㄤ?涓?涓??瑰??????璁幫?杩?浜?淇℃????

tag

??绱?琛ㄧず??????瀹?浜?璇ユ??璁扮????绉般???ㄤ?璇ユ??璁扮??绫夥?杩?涓?绫誨?璇ヨ?缂?璇?濂藉苟?懼?ㄩ??褰????版?癸?浠ヤ究瀹瑰?ㄨ?藉?瑁?杞斤?锛?????杩???瀹?浜?璇ユ??璁版??????宓??ョ????瀹廣????璁版病??宓??ョ????瀹癸???姝や嬌??empty"??

?

? 淇?瀛?杩?涓???浠訛?骞跺??舵?懼??EB-INF/tlds??褰?涓?锛??ㄥ???介??瑕??ㄦ?ㄧ??瀹瑰?ㄤ腑??寤鴻?涓???褰?锛?????灏?杩?涓???浠朵?瀛?涓?ite-utils.tld锛?骞跺?ㄨ?ユ??璁闆???URI锛??ㄨ??????缂?锛???TLD??浠舵??韬?涔??村??娆″??寤轟?涓?骞插?????炬?ャ??瀵逛?杩?涓??瑰??????璁闆?锛?瑕?浣垮?跺??浠ヤ嬌???????涓?姝ヨ???????璁╂?ㄧ??Web搴??ㄧ?ラ??濡?浣?杩??ヤ?涓?JSP椤甸??腑??URI锛?濡?浣?璇鋒?浣跨?ㄤ?涓???璁闆???杩???浠ラ??杩?搴??ㄧ??web.xml??浠舵?ュ????

jsp???╂????????瑕???缃?,????涓?????缃?

?

<taglib>

????? <taglib-uri>http://www.newInstance.com/taglibs/site-utils</taglib-uri>

????? <taglib-location>/WEB-INF/tlds/site-utils.tld</taglib-location>

??? </taglib>

??浠???杩?浣跨??eb.xml??浠朵腑??URI?ュ??ㄨ?涓???璁闆?锛?涓轟?????涓?涓???缂?锛??ヨ??TLD??

short-name

濮?缁?????濂界?????╋?锛??跺??灏卞??浣跨?ㄤ換浣??朵?JSP??璁頒??蜂嬌?ㄨ?涓???璁般????缁?寰??扮????涓?涓?绠?娲??????村ソ??JSP椤甸???杩?涓?JSP椤甸?㈣?琛?璧鋒?ヤ?姣??? scriptlet ???跺??宸?.

?

?

绠???????绛句嬌???

package com.easyway.tags;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * 涓?涓?tag灏辨??涓?涓???????java绫夥?瀹???涓??瑰??涔?澶???瀹?蹇?椤葷戶??agSupport????BodyTagSupport绫彙??杩?涓や釜绫繪??渚?浜?涓?浜??規?锛?
 * 璐?璐?sp椤甸?㈠??浣?缂?????绫諱??寸??浜や?锛?渚?濡?杈??ワ?杈??恒????杩?涓や釜绫繪????sp瀹瑰?ㄦ??渚???锛???椤誨???浜哄????宸卞???般???㈠?ヨ??璇達?浣?????
 * ??瀹??頒?涓??¢?昏???绫葷戶??agSupport????BodyTagSupport锛?????涓?浜??瑰????宸ヤ?锛?浣???绫誨氨??涓?涓?Tag??骞朵?瀹???宸辮?璐e??jsp
 * 椤甸?㈢??浜や?锛?涓??ㄤ?澶???蹇???
 * 
 * ???瑰????宸ヤ?????甯告??浠ヤ???涓?姝ラ?わ?
 * 
 * [1]??渚?灞??х??set?規?锛?姝ゅ??杩?涓?灞??у氨??浠ュ??sp椤甸?㈣?劇疆??浠?stl??绛句負渚? c:out
 * value=""/锛?杩?涓?value灏辨??jsp?版????ag涔??寸???ュ?c??
 * ??浠?ag???㈠?椤繪??涓?涓?setValue?規?锛??蜂???灞??у??浠ヤ???value??渚?濡?setValue(String data){this.data =
 * data;} 杩?涓???value??????绉版????ld??浠?ttribute??绱?瀛??ㄧ???? ??浠?涔???瀛??藉??浠ワ?????tag????渚??稿???set?規??沖????
 * 
 * [2]澶??? doStartTag ?? doEndTag ??杩?涓や釜?規??? TagSupport??渚????? 杩???浠?:out
 * value=""/涓轟?锛?褰?jsp瑙f??杩?涓???绛劇???跺??锛? ?ㄢ??<??澶?瑙??? doStartTag 浜?浠訛??ㄢ??>???惰Е?? doEndTag 浜?浠躲????甯稿?? * doStartTag ??杩?琛???濮???,娴?绋????╂??浣?锛???doEndTag ????缁?椤甸?㈣??烘?у?躲??
 * [3]缂???tld??浠?灏辨????缂?????tag缁?浠剁??淇℃??浠?xl褰㈠???璇?瀹瑰??瀹???濂戒互涓?瀹?姝ラ?よВ??tag缁?浠? * [4]??sp椤甸?㈠?煎??ld??杩??鳳?浣???jsp椤甸?㈠氨??浠ヤ嬌?ㄨ??宸辯??tag缁?浠朵???
 * 
 * ??甯鎬?浼????拌??宸辯?澶у??版椿?ㄩ?介??涓???doStartTag ??
 * doEndTag?規???,濡????ㄦ???″?ㄧ??澶?????绛句腑??姝f????????宓?濂???绛炬?剁??璇?,杩???杩???涓?涓?doAfterBody?? 涓?涓?绠?????渚?瀛?锛?OutputTag
 * 
 * ???ㄦ???″???濡???涓??????т??㈡?ラ?ょ??璇?锛?灏辮?界????Test Tag: Hello! TEST 瀛??楓????绠?????tag灏辮?涔??烘?ヤ???骞朵?????涓????
------------------------------------------------------------------
Tag绯誨????Interface??瀹?涔???????int,??杩?浠?浠?涔??戒?绐?ag缁??????ц?娴?绋?,杩???涓??????煎??????锛?
SKIP_BODY 锛? 璺寵?浜?寮?濮???缁?????绛句??寸??浠g??,涓???????oStartTag涓?浣跨??EVAL_BODY_INCLUDE 锛?澶???宓?濂?????绛?涓???????oStartTag涓?浣跨???辮?璐e?????绛炬?f????tag?ュ?f??渚?
EVAL_BODY_BUFFERED :瀵瑰????????瀹矽?琛?瑙f??涓???????oStartTag涓?浣跨???辮?璐e?????绛炬?f????bodyTag?ュ?f??渚?,??????????sp瀹瑰?ㄤ?
濂借?誨??姝f????宸ヤ?(??寤轟?涓?body-content??瑁?姝f?????峰??瀛??炬??浣?缁?????out瀵矽薄,渚誇?浠ュ??????浣???杈???.
EVAL_BODY_AGAIN:澶?????绛炬?f??,宓?濂???绛劇??iteratorTag?ュ?g??浣跨??SKIP_PAGE 锛? 蹇界?ュ?╀???椤甸??涓???????oEndTag涓?浣跨??EVAL_PAGE 锛? 缁х畫?ц?涓??㈢??椤? 涓???????oEndTag涓?浣跨?? 


 * 涓?涓?绠?????杈??烘??绛? * 
 * @author longgangbai
 * 
 */
public class SimpleTag extends TagSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	// 澹版????绛劇??灞??у?椤繪??瀵瑰???getter/setter?規?
	private String name = null;

	/**
	 * 
	 * 绠?瑕?璇存??锛? 1 濡?浣?杈??哄??sp椤甸???璋???spWriter JspWriter out =
	 * pageContext.getOut();out.print......璁頒?杩?涓??規?灏卞??浠ヤ??? 2
	 * 杈??哄??濡?浣?浣?澶???锛??芥?頒?杩?????涓??間?涓???EVAL_PAGE 琛ㄧずtag宸插???瀹?姣?锛?杩???jsp椤甸????
	 * 杩?????涓??鹼?渚?濡? EVAL_BODY_AGAIN
	 * ??EVAL_BODY_INCLUDE绛? 璺?娴?绋??у?舵????
	 */
	@Override
	public int doEndTag() throws JspException {
		try {
			JspWriter out = pageContext.getOut();
			out.print("hello world ," + name);
		} catch (Exception e) {
			throw new JspException(e);
		}
		return EVAL_PAGE;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	};
}
           

?

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 
??EB-INF涓??闆緩tlds??浠跺す锛???杩?涓???浠跺????涓?est.tld锛??懼??lds??浠跺す涓???寮??ㄦ?剁??璺?寰?搴?璇ヨ??鳳?WEB-INF\tlds\test.tld

?充?tld??绠???璇存??锛?
short-name锛?taglib????绉幫?涔?绉頒負??缂???姣?濡???c:out value=""/?? ??????c??
name锛?tag????瀛???渚?濡???c:out value=""/?? ????"out??锛???浠???绫諱?????涓?ut锛??變?????缂?浣??哄??锛?涓?浼????朵?搴???????tag缁?浠舵販娣?
tag-class锛?瀹??寸??tag缁?浠惰礬寰?,璁扮??甯?????
body-content锛???tag涔??寸????瀹廣??渚?濡?c:out value="" ...... /c 璧峰????抽????绛句??村氨??body-content???變?娌℃??澶???body-content 锛?
??浠ヤ??㈣?句負empty,濡?????宓?濂???绛???????瑕??ㄦ???″?ㄧ??澶?????绛句???璇?,灏辨??jsp浜?
??attribute??????name锛?灞??у??瀛???渚?濡?c:out value=""/????value????瀛???浠繪????锛???瑕?绫婚????渚??稿???set?規??沖????
required锛??????濉?灞??с??
rtexprvalue锛?????????杩?琛??惰〃杈懼????煎氨????????浠?lt;%=%>??????${}?瑰?浼??箋??
杩???tag??寮哄ぇ???姐??

 -->
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>simple</short-name>
	<!--SimpleTag-->
	<tag>
		<name>out</name>
		<tag-class>com.easyway.tags.SimpleTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>name</name>
			<required>false</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>
</taglib>
           

?

?

?

宓?濂???绛劇????寤猴?

1.??寤虹?舵??绛劇被锛?

package com.easyway.tags.foreachs;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * 
??瀹?涔???绛懼???涓轟?缁???绛?绠?????绛?????绛炬??浠?涓????哄???ㄤ?涓?涓?姣?涓?涓?绠???.瀹??扮???澶ц?寸?稿??.瀹??闆????涔?澶ц?寸?稿??.涓??㈢????璇磋?村???拌?绋?.
Tag?ュ????????绛句??ュ??缁ф?誇?JspTag.
??pageContext浼?缁???宸卞???扮????绛劇被. 
璁劇疆??绛劇??灞???(??绛句?琚??跺?,??璋???etParent?規?璁劇疆?舵??绛? 
?ц?doStartTag?規?.?跺???規??杩?涓??規???杩????煎?ゆ??绋?搴???璧闆?? 

EVAL_BODY_INCLUDE :????绛句?杈??哄?版?涓?. 
SKIP_BODY:蹇界?ユ??绛句? 
?ц?doEndTag?規?.杩???涓ょ???EVAL_PAGE ?? SKIP_PAGE 琛ㄧず?ц??╀???jsp浠g??杩???蹇界?ュ?╀???jsp浠g??. 
瀹瑰?ㄧ?瀛???绛懼??渚?.???闆???風????绛?????澶?浣跨?ㄧ?瀛?????绛句?.???炬??绛句?.璋???elease()?規?. 
IterationTag?ュ???ㄤ?寰???瀹??扮???ュ??杩?涓??ュ?g戶?誇?Tag?ュ???闆?浜?涓?涓??規?doAfterBody()??涓?涓?杩????肩??甯擱??EVAL_BODY_AGAIN.

??pageContext浼?缁???宸卞???扮????绛劇被. 
璁劇疆??绛劇??灞???(??绛句?琚??跺?,??璋???etParent?規?璁劇疆?舵??绛? 
?ц?doStartTag?規?.?跺???規??杩?涓??規???杩????煎?ゆ??绋?搴???璧闆??. 

EVAL_BODY_INCLUDE :?ц???绛句? 
SKIP_BODY:蹇界?ユ??绛句? 
濡???涓?涓??ㄨ???EVAL_BODY_INCLUDE,?d??ц?杩?涓?姝?璋??ㄧ???規???doAfterBody().杩???:(娉ㄦ??,涓?绠¤?????浠?涔?,杩?涓???绛懼凡缁??ц?浜?涓?娆?
绫諱技浜?do..while寰???) 

EVAL_BODY_AGAIN:琛ㄧず??澶??ц???绛句?. 
SKIP_BODY:涓??ц???绛句?.杩??ヤ?涓?姝? 
瀹瑰?ㄧ?瀛???绛懼??渚?.???闆???風????绛?????澶?浣跨?ㄧ?瀛?????绛句????炬??绛句?.璋???elease()?規?. 
BodyTag?ュ??缁ф?誇?IterationTag?ュ???闆?涓や釜?規?

setBodyContent():璁劇疆bodyContent灞???瀵逛?绌烘??绛?璇ユ?規?涓?浼?琚?璋???濡???doStartTag()?規?杩???涓?KIP_BODY
????EVAL_BODY_INCLUDE涔?涓?浼?琚?璋???
doInitBody():??etBodyContent()?規?璋??ㄥ??,??绛句?绗?涓?娆¤??ц?涔???,璇ユ?規?璋??? 
EVAL_BODY_BUFFERED杩?????????瀹??頒?BodyTag?ュ??骞朵???oStartTag()?規?涓????借???璇ュ?? 
?ц?娴?绋?:

??pageContext浼?缁???宸卞???扮????绛劇被. 
璁劇疆??绛劇??灞???(??绛句?琚??跺?,??璋???etParent?規?璁劇疆?舵??绛? 
?ц?doStartTag?規?.?跺???規??杩?涓??規???杩????煎?ゆ??绋?搴???璧闆??. 

EVAL_BODY_INCLUDE :?ц???绛句?. 
SKIP_BODY:蹇界?ユ??绛句? 
EVAL_BODY_BUFFERED:??绛句?涓?涓虹┖,杩??ヤ?涓?姝? 
璋???etBodyContent(),濡???绗?涓?娆℃?ц???璋???oInitBody(). 
璋???oAfterBody(). 

EVAL_BODY_AGAIN:琛ㄧず??澶??ц???绛句? 
SKIP_BODY:涓??ц???绛句?.杩??ヤ?涓?姝? 
瀹瑰?ㄧ?瀛???绛懼??渚?.???闆???風????绛?????澶?浣跨?ㄧ?瀛?????绛句?. 
???炬??绛句?.璋???elease()?規?. 
    api宸茬????借薄绫誨ぇ?村???頒?浠ヤ?姝ラ????????????涓???宸遍??瑕????規??沖??.TagSupport瀹??頒?IterationTag?ュ??BodyTagSupport
    瀹??頒?BodyTag?ュ??

绠?????绛懼??SimpleTagSupport瀹??扮戶?誇?JspTag??SimpleTag?ュ??????????doTag?規?灏卞??瀹???绠?????????


    ?寵?浣跨?ㄨ??宸卞??濂界????绛捐???瑕?瀹?涔?tld??绛炬??杩版??浠??跺????sp椤甸?㈠???

??绛句互jar??褰㈠??虹??????绛懼?椤繪?懼??ETA-INF??褰????跺????褰?涓?.濡?????绛劇?存?ラ?ㄧ講??eb绋?搴?涓?,????绛炬??杩版??浠跺?椤誨??EB-INF??褰?????瀛???褰?涓?



 * 
 * 
 * ??绛劇??宓?濂?
 * ????锛?
 瀹?涔?涓や釜??绛撅??舵??绛句腑????瀛?绗?覆锛?"hi {0}, i am {1}. "锛?瀛???绛劇?ㄦ?ヨ?劇疆?舵??绛劇?????闆??浣?绗???
 姝ラ?わ?
 锛?1锛?寮?????绛懼???扮被
 锛?2锛?缂??? tld ??绛炬??杩版??浠? 锛?3锛???web.xml 涓?寮???tld
 锛?4锛???jsp娴?璇?
 * @author longgangbai
 * 
 * 
 */
public class ParentTag extends TagSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private String message = "hi {0}, i am {1}. ";

	private List params;

	public ParentTag() {
		super();
		params = new ArrayList();
	}

	public int doStartTag() throws JspTagException {
		params.clear();
		return EVAL_BODY_INCLUDE;
	}

	public int doEndTag() throws JspTagException {
		if (params != null) {
			Object[] messageArgs = params.toArray();
			MessageFormat formatter = new MessageFormat("");
			formatter.applyPattern(message);
			message = formatter.format(messageArgs);
		}
		try {
			this.pageContext.getOut().write(message);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return EVAL_PAGE;
	}

	public void addParam(Object arg) {
		params.add(arg);
	}
}
           

?

2.??寤哄?濂?瀛???绛?

package com.easyway.tags.foreachs;

import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
/**
 * ??宓???绛? * @author longgangbai
 *
 */
public class SonTag extends TagSupport {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String value = "";

	public void setValue(String value) {
		this.value = value;
	}

	public int doEndTag() throws JspTagException {
		//?峰???舵??绛?		Tag t = findAncestorWithClass(this, ParentTag.class);
		ParentTag parent = (ParentTag) t;
		parent.addParam(value);
		return EVAL_PAGE;
	}
}
           

?

3.??寤虹?稿?崇??tld??绛炬??杩版??浠訛?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
	<tlibversion>1.2</tlibversion>
	<jspversion>1.1</jspversion>
	<shortname>bean</shortname>
	<uri>http://www.aaa.com/tags</uri>

	<tag>
		<name>hello</name>
		<tagclass>com.easyway.tags.foreachs.ParentTag</tagclass>
		<bodycontent>JSP</bodycontent>
	</tag>
	<tag>
		<name>param</name>
		<tagclass>com.easyway.tags.foreachs.SonTag</tagclass>
		<bodycontent></bodycontent>
		<attribute>
			<name>value</name>
			<required>false</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>
</taglib>

           

?

4.web椤甸?㈣???

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/WEB-INF/simple.tld" %>
<%@taglib prefix="r" uri="/WEB-INF/requset.tld" %>
<%@taglib prefix="hello" uri="/WEB-INF/hello-tag.tld" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>" target="_blank" rel="external nofollow" >
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css" target="_blank" rel="external nofollow" >
	-->
  </head>
  
  <body>&nbsp; 
    This is my JSP page. <br>
    <s:out name="test tags "/>
    <r:demo parameter="filename"/>
    <r:value>$date</r:value>
    <hello:hello>
         <hello:param value="abc"/>
         <hello:param value="efg"/>
    </hello:hello>
  </body>
</html>
           

?

?

JSTL?稿???绛???SP椤甸??腑瑕?浣跨?ㄦ?煎?????绛撅?蹇?椤諱嬌??lt;%@ taglib%>??浠わ?

<%@ taglib prefex="c" uri="http://java.sun.com/jsp/jstl/core" %>

?<c:set>??绛捐?藉?灏?????瀛??ㄥ??SP???翠腑??????JavaBean??灞??т腑

???浜?涓??煎?锛?

?1锛?<c:set var="username" value="value"></c:set>//?跺?????????????????2锛?<c:set var="username" value="value" scope="page|request|session|application"></c:set>灏?value?間?瀛??拌???翠負scope??????涓?

?3锛?<c:set var="username" scope="page|request|session|application" >

???? ??????瀹????? </c:set>灏???????瀹圭???版??瀛??ㄥ?拌???翠負scope??????涓?

?4锛?<c:set value="value" target="target" property="propertyName"></c:set>灏?value?煎???ㄥ??arget瀵矽薄??灞??т腑??

?5锛?<c:settarget="target" property="propertyName">

????? ??????瀹????? </c:set>灏???????瀹圭???版??瀛??ㄥ??arget瀵矽薄??灞??т腑

?

?<c:out>??绛劇?ㄦ?ユ?劇ず?版??????瀹癸??舵?煎?璇?娉?????绉?

?1,<c:out value="value"></c:out>??杩?value灞??ф??瀹?瑕??劇ず?????2,<c:out value="value" escapeXml="true|false"></c:out>?????value涓?????瀹規???у???瘋????3,<c:out value="value" default="No Data"></c:out>??杩?Default灞??ф?ヨ?劇疆榛?璁ゅ???4,<c:out value="value" escapeXml="true|false">

??? ??????瀹???? </c:out>??杩???????瀹矽?劇疆榛?璁ょ?????

?<c:remove>?ㄦ?ョЩ?ゆ??瀹????寸??????

?<c:remove var="number" scope="session">

?

<%@page language="java" contentType="text/html;charset=gb2312" %>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>

<html>

??? <head>

??????? <title>remove??绛劇??浣跨??lt;/title>

??? </head>

??? <body>

??????? <h1>remove??绛劇??浣跨??lt;/h1>

??????? <hr />

??????? <%--? 娣誨??????number锛?瀛??ㄥ??age????-%>

??????? <c:set var = "number" value="${1+2}" scope="page" />

??????? <%--? 杈??哄????--%>

??????? number:<c:out value="${pageScope.number}" default="No Data"/>

??????? <%--? 绉婚??age????umber????--%>

??????? <c:remove var="number" scope="page" />

??????? <%--? 杈??哄????--%>

??????? number:<c:out value="${pageScope.number}" default="No Data"/>

??? </body>

</html>

<c:if>??绛劇?ㄦ?ユ?ц?娴?绋??у??<c:if>??绛炬??涓ょ??煎?

?

1锛?娌℃????浣???瀹圭??<c:if test="condition" var = "varName" [scope="{page|request|session|application}"] />

2锛?????浣???瀹圭??<c:if test="condition" var = "varName" [scope="{page|request|session|application}"] >??浣???瀹?lt;/c:if>

?<c:choose><c:when><c:otherwise>??绛??

<%@page language="java" contentType="text/html;charset=gb2312" %>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>

<html>

??? <head>

??????? <title>Choose??绛劇??浣跨??lt;/title>

??? </head>

??? <body>

??????? <h1>Choose??绛劇??浣跨??lt;/h1>

??????? <hr />

??????? <c:choose>

??????????? <c:when test="${4<6}">

??????????????? <c:out value="Yes" />

??????????? </c:when>

??????????? <c:otherwise>

??????????????? <c:out value="No" />

??????????? </c:otherwise>

??????? </c:choose>

??? </body>

</html>

<c:forEach>??绛?涓?绉??ㄦ?ラ????????瀵矽薄??????

<c:forEach [var="username"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"] >

????闆??瀹?</c:forEach>

?

涓?绉????ㄦ?ヤ嬌璇??ュ驚???ц???瀹???娆℃??<c:forEach [var="username"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"] >

????闆??瀹??</c:forEach>

?

<c:forTokens>??绛撅??ㄦ?ユ?規????瀹?????绗????插??绗?覆

?<c:forTokens [var="varname"] items="stringOfTokens" delims="delimiters" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"] >

????闆??瀹??</c:forEach>

?

?<c:import>??绛撅???浠ユ?????????????ㄦ??????浠跺?????版??韬???JSP缃?椤典腑

?<c:import url="url" [context="context"][var="varname"] [scope = "{page|request|session|application}"] [charEncoding="charEncoding"] >

????闆??瀹??</c:import>

?

?<c:param>??绛撅??ㄦ?ヤ????????

<c:url>??绛撅??ㄦ?ョ????URL

?涓?甯????扮??

?<c:url value="value" [context="context"][var="varname"] [scope = "{page|request|session|application}"] />

?甯????扮??

?<c:url url="url" [context="context"][var="varname"] [scope = "{page|request|session|application}"] >

???? <c:param />??绛??</c:url>

?<c:redirect>??绛撅???浠ヤ?涓?涓?JSP椤甸?㈣煩杞??闆???涓??朵???椤甸??????

涓?甯????扮??

?<c:redirect url="url" [context="context"]/>

?甯????扮??

?<c:redirect url="url" [context="context"]>

???? <c:param />??绛??</c:redirect>

?

JSP??缃?瀵矽薄璇?В涔?page??out??exception??config??pageContext??缃?瀵矽薄

?涓???

page??缃?瀵矽薄浠?缁?

??????? page瀵矽薄???圭被浼間?Java缂?绋?涓???this????锛?灏辨????褰???JSP椤甸?㈡??韬???page??java.lang.Object绫葷??瀵矽薄??page瀵矽薄?ㄥ????寮???杩?绋?涓?骞朵?缁?甯鎬嬌?ㄣ??

page瀵矽薄甯哥?ㄦ?規?

??????? getClass()锛?杩???褰???bject??绫彙??

??????? hashCode()锛?杩???姝ゆ??bject????甯?浠g????

??????? toString()锛?灏?姝ゆ?剁??Object绫昏漿?㈡??瀛?绗?覆??

??????? equals(Object ob)锛?姣?杈?姝ゅ?矽薄???????瀹???瀵矽薄?哥????

??????? copy(Object ob)锛?灏?姝ゅ?矽薄澶??跺?版??瀹???瀵矽薄涓???

??????? clone()锛?瀵規?ゅ?矽薄杩?琛???????

浜???

out??缃?瀵矽薄浠?缁?

???????? out瀵矽薄?ㄦ?ュ?ㄩ〉?㈣??烘?版??锛?????SP寮???杩?绋?涓?浣跨?ㄥ???棰?绻???瀵矽薄锛??惰??浣跨?ㄨ搗?ヤ???涓虹??渚跨????

out瀵矽薄甯哥?ㄦ?規?

???????? print()锛??ㄩ〉??腑???闆?哄??绗?覆淇℃??锛?涓??㈣???

???????? print()锛??ㄩ〉??腑???闆?哄??绗?覆淇℃??锛?骞朵??㈣???

???????? clear()锛?娓??ょ??插?轟腑灏?瀛?????瀹廣??

???????? clearBuffer()锛?娓??ゅ???缂??插?轟腑灏?瀛?????瀹廣??

???????? flush()锛?娓??ゆ?版??娴???

???????? getBufferSize()锛?杩???缂??插?虹????瀛?澶у?锛???浣?澶у?涓哄????娴???濡???涓?杩?琛?缂??插?虹??璁劇疆锛?澶у?涓???

???????? getRemaining()锛?杩???缂??插?鴻??╀?澶?灏?瀛????闆??浠ヤ嬌?ㄣ??

???????? isAutoFlush()锛?妫??ュ???缂??插?烘??璁劇疆涓鴻???ㄦ?绌猴?杩???婊′?灏辨??涔?寮?甯搞??

???????? close()锛??抽??杈??烘???

涓???

exception??缃?瀵矽薄浠?缁?

???????? exception??缃?瀵矽薄?ㄦ?ュ???椤甸?㈠?虹?扮??寮?甯擱??璇?锛?瀹???java.lang.Throwable绫葷??涓?涓?瀵矽薄????SP寮???杩?绋?涓?锛???甯告???ㄦ??涓?椤甸???姣?濡?A.jsp锛?涓?????age??浠ょ??errorPage灞??ф?ュ??舵????涓?涓?涓??ㄥ???寮?甯擱??璇???椤甸???doError.jsp锛???濡???杩?涓???璇?澶???椤甸??oError.jsp宸茬?灏?瑁?浜?浠?A.jsp椤甸?㈡?跺?扮????璇?淇℃??锛?骞朵???璇?澶???椤甸??oError.jsp??????isErrorpage灞??ц?劇疆涓?rue锛???杩?涓???璇?澶???椤甸?㈠??浠ヨ???xception??缃?瀵矽薄?ュ???杩?涓?浜???璇?淇℃????

exception瀵矽薄甯哥?ㄦ?規?

??????? getMessage()??getLocalizedMessage()锛?杩?涓ょ??規?????杩???exception瀵矽薄??寮?甯告???瀛?绗?覆?????闆??璇?瑷???寮?甯擱??璇???

??????? printStackTrace()锛??劇ず寮?甯哥????璺?韪?杞ㄨ抗??

??????? toString()锛?杩????充?寮?甯擱??璇???绠???娑?????杩般??

??????? fillInStackTrace()锛?????寮?甯擱??璇??????ц?杞ㄨ抗??

????

config??缃?瀵矽薄浠?缁?

??????? config??缃?瀵矽薄??ServletConfig绫葷??涓?涓?瀹?渚?锛??ㄤ?JSP寮?????ervlet??濮????訛???杩?config??瀹?锛?Servlet锛?浼???淇℃????杩?绉?淇℃????浠ユ??灞??у??/?煎?歸???????幫?涔???浠ユ????杩?ServletContext瀵矽薄浼????????″?ㄧ?????充俊????涓?????SP寮???涓?琛?灏??ㄥ??onfig??缃?瀵矽薄锛??????ㄧ???Servlet?惰?ラ??瑕???杞?ervlet??init()?規??舵??浼??ㄥ?般??

config瀵矽薄甯哥?ㄦ?規?

??????? getServletContext()锛?杩??? 涓?涓????????″?ㄧ?稿?充俊????ServletContext瀵矽薄??

??????? getIntParameter(String name)锛?杩?????濮??????扮???箋??

??????? getIntParameterNames()锛?杩???????浜?Servlet??濮???????瑕??????????幫?杩???绫誨??????涓懼????

浜???

pageContext??缃?瀵矽薄浠?缁?

???????? pageContext??缃?瀵矽薄??涓?涓?姣?杈??規????瀵矽薄锛?瀹??稿?浜?椤甸??腑?????朵?瀵矽薄???界????澶ч??????锛??充嬌?ㄥ????浠ヨ?塊???版??椤甸??腑?????朵???瀵矽薄锛?渚?濡????㈠凡缁???杩扮??request??response??out??page瀵矽薄绛????變???SP涓?request??response绛?瀵矽薄???ュ氨??浠ラ??杩??存?ヨ??ㄦ?規?浣跨?????浠?ageContext瀵矽薄?ㄥ????JSP寮???涓?寰?灏?浣跨?ㄥ?般??

pageContext瀵矽薄甯哥?ㄦ?規?

???????? getRequest()锛?杩???褰???椤甸??腑??request瀵矽薄??

???????? getResponse()锛?杩???褰???椤甸??腑??response瀵矽薄??

???????? getSession()锛?杩???褰???椤甸??腑??session瀵矽薄??

???????? getServletContext()锛?杩???褰???椤甸??腑??application瀵矽薄??

???????? getPage()锛?杩???褰???椤甸??腑??page瀵矽薄??

???????? getOut()锛?杩???褰???椤甸??腑??out瀵矽薄??

???????? getException()锛?杩???褰???椤甸??腑??exception瀵矽薄??

???????? getServletConfig()锛?杩???褰???椤甸??腑??config瀵矽薄??

?????????? setAttribute(String name)锛?缁???瀹???灞??у??璁劇疆灞??у?箋??

???????? getAttribute(String naem)锛??規??灞??у???懼?扮?稿???灞??у?箋??

???????? setAttribute(String name, Object obj, int scope)锛??ㄧ?瀹??????村??璁劇疆?稿???灞??у?箋??

???????? getAttribute(String name, int scope)锛??ㄧ??????村???峰???稿???灞??у?箋??

???????? findAttribute(String name)锛?瀵繪?句?涓?灞??у苟杩???锛?濡????ユ?句??闆??杩???null??

???????? removeAttribute(String name)锛???杩?灞??у?????ゆ????涓?灞??с??

???????? removeAttribute(String name, int scope)锛??ㄦ??瀹?????涓????撮?????ゆ??涓?灞??с??

???????? getAttributeScope(String name scope)锛?杩?????灞??х??浣??ㄥ????

???????? getAttributeNamesInScope(int scope)锛?杩?????瀹????村????????灞??у??????涓俱??

???????

????????? release()锛?????ageContext??????????璧?????

????????? forward(String relativeURLpath)锛?浣跨?ㄥ???椤甸?㈤??瀵煎?闆???涓?椤甸????

????????? include(String relativeURLpath)锛?浣跨?ㄥ???浣?缃??????????涓?椤甸????