天天看點

JavaEE jsp自定義标簽

閫氳繃浣跨敤jsp鐨勮嚜瀹氫箟鏍囩锛屽彲浠ュ湪绠€鍗曠殑鏍囩涓皝瑁呭鏉傜殑鍔熻兘锛屽彲浠ョ敤浠ュ彇浠sp鑴氭湰銆?

寮€鍙慾sp2鑷畾涔夋爣绛劇殑姝ラ濡備笅锛?

- 瀹氫箟鏍囩澶勭悊绫夥紱

- 瀹氫箟

*.tld

鏂囦歡锛?

- 鍦╦sp椤甸潰涓嬌鐢ㄨ嚜瀹氫箟鏍囩銆?

绠€鍗曟爣绛懼畾涔?/h2>

璇村埌鏍囩锛屽彲浠ヨ仈鎯沖埌鏍囩鐨勫睘鎬у拰鏍囩浣撱€備負浜嗛噸鐐瑰睍绀鴻嚜瀹氫箟鏍囩鐨勭紪鍐欙紝鎴戜滑鍏堝畾涔変竴涓渶绠€鍗曠殑鏍囩锛屽嵆鏃犲睘鎬ф棤鏍囩浣撶殑鏍囩銆傝繖涓畝鍗曟爣绛懼皢鏄劇ず褰撳墠鐨勬棩鏈熷拰鏃堕棿銆?

瀹氫箟鏍囩澶勭悊绫?/h3>

灏卞儚涓€寮€濮嬫墍璇寸殑閭f牱锛屾垜浠渶瑕佸厛瀹氫箟鏍囩澶勭悊绫夥紝杩欎釜绫婚渶瑕佺戶鎵胯嚜

javax.servlet.jsp.tagext.SimpleTagSupport

锛屽苟閲嶅啓

doTag

鏂規硶锛?
// DateTimeTag.java

public class DateTimeTag extends SimpleTagSupport {
    private static final SimpleDateFormat sdf=
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public void doTag() throws JspException, IOException {
        super.doTag();
        getJspContext().getOut().write(sdf.format(new Date()));
    }
}
           
DateTimeTag绫誨緢绠€鍗曪紝瀹冪戶鎵胯嚜SimpleTagSupport锛屽苟閲嶅啓浜?code>doTag鏂規硶銆?code>doTag鏂規硶涓幏鍙栦簡jsp椤甸潰涓婁笅鏂囩殑杈撳嚭娴佹潵杈撳嚭褰撳墠鐨勬棩鏈熷拰鏃堕棿銆?

瀹氫箟TLD鏂囦歡

鎺ョ潃锛屾垜浠渶瑕佸畾涔?code>*.tld鏂囦歡銆俆LD鏄?code>Tag Library Definition鐨勭緝鍐欙紝鍗蟲爣绛懼簱瀹氫箟銆傛瘡涓猅LD鏂囦歡瀵瑰簲涓€涓爣绛懼簱锛屾爣绛懼簱涓彲浠ュ畾涔夊涓爣绛俱€俆LD鏂囦歡闇€瑕佹斁鍦?code>WEB-INF鐩綍鎴栧叾浠繪剰瀛愮洰褰曚笅锛岃繖閲屾垜浠皢鍏舵斁鍦?code>WEB-INF/jsp2鐩綍涓嬨€?

涓嬮潰鎴戜滑鍦╡clipse涓垱寤轟竴涓猅LD鏂囦歡銆傚厛鍦?code>WEB-INF鐩綍涓嬪垱寤?code>jsp2鐩綍锛屽啀鍙沖嚮

jsp2

鐩綍閫夋嫨

New

-

Other

-

XML

-

XML File

锛岃緭鍏ユ枃浠跺悕锛堟垜浠緭鍏ytaglib.tld锛夛紝

Next

锛岄€夋嫨

Creat XML file from a DTD file

锛?code>Next锛岄€夋嫨

Select XML Catalog entry

锛屽湪鍑虹幇鐨刋ML鏂囨湰閫夋嫨涓嬫媺妗嗕腑閫夋嫨

-//Sun Microsystems,Inc.//DTD JSP Tag Library 1.2//EN

锛?code>Next锛?code>Finish銆?

鍦ㄦ柊鍒涘緩鐨凾LD鏂囦歡涓彲浠ョ湅鍒幫紝瀹冪殑鏍瑰厓绱犳槸

taglib

锛岄噷闈㈠彲浠ュ寘鍚涓?code>tag瀛愬厓绱狅紝鎴戜滑灏辨槸閫氳繃

tag

鍏冪礌鏉ュ畾涔夋爣绛劇殑銆備笅闈㈡垜浠湪

mytaglib.tld

鏂囦歡涓畾涔夌涓€涓爣绛撅細
<!-- mytaglib.tld -->

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" >
<taglib>
  <tlib-version>tlib-version</tlib-version>
  <jsp-version>jsp-version</jsp-version>
  <short-name>short-name</short-name>
  <uri>http://zzw.com/mytaglib</uri>
  <tag>
    <name>datetime</name>
    <tag-class>com.zzw.DateTimeTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>
           
鍦?code>taglib鍏冪礌涓湁涓€涓?code>uri鍏冪礌锛岃繖涓厓绱犳寚瀹氭爣绛懼簱鐨刄RI锛屾垜浠湪浣跨敤鏍囩搴撴椂灏變緷璧栦簬姝ゅ厓绱犮€傚湪

tag

鍏冪礌涓紝

name

鍏冪礌鎸囧畾鏍囩鐨勫悕瀛楋紝鎴戜滑鍦ㄤ嬌鐢ㄦ爣绛炬椂闇€瑕佹寚瀹氭爣绛懼悕锛?code>tag-class鍏冪礌鎸囧畾鏍囩鐨勫鐞嗙被锛?code>body-content鍏冪礌鍜屾爣绛句綋鏈夊叧锛屽畠鍙互鏄笅闈㈠嚑涓€鹼細

- empty锛氳〃绀烘病鏈夋爣绛句綋锛?

- JSP锛氳〃绀烘爣绛句綋鍙互鍖呭惈JSP浠g爜锛?

- scriptless锛氳〃绀烘爣绛句綋鍙互鍖呭惈EL琛ㄨ揪寮忓拰JSP鍔ㄤ綔鍏冪礌锛屼絾涓嶈兘鍖呭惈JSP鐨勮剼鏈厓绱狅紱

- tagdependent锛氳〃绀烘爣绛句綋浜ょ敱鏍囩鏈韓鍘昏В鏋愬鐞嗭紝鍗沖湪鏍囩浣撲腑鎵€鍐欑殑浠諱綍浠g爜閮戒細鍘熷皝涓嶅姩鍦頒紶缁欐爣绛懼鐞嗗櫒锛?

- dynamic-attributes锛氭寚瀹氳鏍囩鏄惁鏀寔鍔ㄦ€佸睘鎬э紝鍙湁褰撳畾涔夊姩鎬佸睘鎬ф爣绛炬椂鎵嶉渶瑕佹寚瀹氳鍊鹼紝鍏充簬鍔ㄦ€佸睘鎬ф爣绛懼皢鍦ㄥ悗闈粙缁嶃€?

杩欓噷鎴戜滑鍙渶瑕佹寚瀹?code>body-content>鍏冪礌鍊間負

empty

鍗沖彲銆?

鍦╦sp椤甸潰涓嬌鐢ㄨ嚜瀹氫箟鏍囩

鎺ヤ笅鏉ユ垜浠氨鍙互鍦╦sp椤甸潰涓嬌鐢ㄨ嚜瀹氫箟鏍囩浜嗭細
<!-- mytag.jsp -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://zzw.com/mytaglib" prefix="mytag"%>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>鑷畾涔夋爣绛?lt;/title>
</head>
<body>
    褰撳墠鏃堕棿<mytag:datetime/><hr>
</body>
</html>
           
鍙互鐪嬪埌锛岃浣跨敤鑷畾涔夋爣绛撅紝闇€瑕佸厛瀵煎叆鑷畾涔夋爣绛懼簱锛岃繖鍙互鍊熷姪jsp缂栬瘧鎸囦護

taglib

瀹屾垚銆傚湪

taglib

涓渶瑕佹寚瀹氳嚜瀹氫箟鏍囩搴撶殑URI鍜屾爣绛懼簱鍓嶇紑锛孶RI鍗沖湪TLD鏂囦歡涓殑

taglib

鍏冪礌鐨勫瓙鍏冪礌

uri

锛屽墠缂€鎸囧畾鍦ㄦ鏍囩搴撲腑瀹氫箟鐨勬墍鏈夋爣绛劇殑鍓嶇紑銆?

浣跨敤鑷畾涔夋爣绛劇殑璇硶鏍煎紡涓猴細

<prefix:tagname attribute="expression" ...>
    <tag-body>
</prefix:tagname>
           
鐢變簬

datetime

鏍囩娌℃湁灞炴€э紝涔熶笉闇€瑕佹爣绛句綋锛屾垜浠彲浠ョ畝鍗曞啓鎴?code><mytag:datetime/>锛屽墠缂€

mytag

琛ㄧず姝ゆ爣绛懼睘浜嶶RI涓?code>"http://zzw.com/mytaglib"鐨勬爣绛懼簱銆?

杩愯鏁堟灉濡備笅锛?

JavaEE jsp自定義标簽
鐪嬶紝鎴戜滑鍙湪jsp椤甸潰涓嬌鐢ㄤ簡涓€涓畝鍗曠殑鏍囩锛屽氨鍙互鏄劇ず鍑哄綋鍓嶆椂闂達紝鏄笉鏄姣攋sp鑴氭湰鏂逛究澶氫簡銆傜湅鍒拌繖锛岀浉淇′綘涔熷熀鏈簡瑙d簡鑷畾涔夋爣绛劇殑寮€鍙戯紝涓嶈繃杩欏彧鏄渶绠€鍗曠殑鏍囩锛屼笅闈㈡垜浠皢浠嬬粛鑷畾涔夋爣绛劇殑鏇村鍐呭銆?

甯﹀睘鎬х殑鏍囩

涓婇潰鎴戜滑浠嬬粛鐨勭畝鍗曟爣绛炬病鏈変換浣曞睘鎬э紝浣嗛€氬父鎯呭喌涓嬪ぇ澶氭暟鏍囩閮芥湁涓€涓垨澶氫釜灞炴€э紝鐜闆湪鎴戜滑灏變粙缁嶅甫灞炴€ф爣绛劇殑寮€鍙戙€?

鍩烘湰姝ラ鍜屼箣鍓嶄竴鏍鳳紝鎴戜滑鍏堢紪鍐欐爣绛懼鐞嗙被锛?

// EmailTag.java

public class EmailTag extends SimpleTagSupport {
    private String from;
    private String to;
    private Date date;
    private String message;
    private static final SimpleDateFormat sdf=
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public String getFrom() { return from; }
    public String getTo() { return to; }
    public Date getDate() { return date; }
    public String getMessage() { return message; }

    public void setFrom(String f) { from=f; }
    public void setTo(String t) { to=t; }
    public void setDate(Date d) { date=d; }
    public void setMessage(String m) { message=m; }

    public void doTag() throws JspException, IOException {
        super.doTag();
        JspWriter out=getJspContext().getOut();
        out.write("<div style=\"padding:10px;border:1px solid;border-color:#ff7f00;color:#ff7f00\">");
        out.write("<b>FROM</b>: "+from+"<br>");
        out.write("<b>TO</b>&nbsp;&nbsp: "+to+"<br>");
        out.write("<b>DATE</b>: "+sdf.format(date)+"<br>");
        out.write("<p>"+message+"</p>");
        out.write("</div>");
    }

}
           

EmailTag绫誨拰DatetimeTag绫葷殑涓嶅悓涔嬪鍦ㄤ簬锛屽畠澶氫簡鍑犱釜鈥滃睘鎬р€濓紝鑰屼笖杩欎簺鈥滃睘鎬р€濋兘鏈夊搴旂殑get鍜宻et鏂規硶銆傚疄闄呬笂jsp椤甸潰姝f槸閫氳繃get/set鏂規硶鏉ヨ幏鍙?璁劇疆鏍囩鐨勫睘鎬х殑銆?

鎴戜滑鍦?code>mytaglib.tld鏂囦歡涓坊鍔犺繖涓柊鏍囩锛?

<!-- mytaglib.tld -->

  <tag>
    <name>email</name>
    <tag-class>com.zzw.EmailTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
      <name>from</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
    <attribute>
      <name>to</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
    <attribute>
      <name>date</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.util.Date</type>
    </attribute>
    <attribute>
      <name>message</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
  </tag>
           
鍙互鐪嬪埌锛岃繖涓柊鐨?code>tag鍏冪礌澶氫簡鍑犱釜

attribute

瀛愬厓绱狅紝鎴戜滑姝f槸閫氳繃

attribute

鍏冪礌鏉ヨ缃爣绛劇殑灞炴€х殑銆?code>attribute鍏冪礌鍙堟湁濡備笅鍑犱釜瀛愬厓绱狅細

- name锛氭寚瀹氬睘鎬у悕锛?

- required锛氭寚瀹氭灞炴€ф槸鍚︽槸蹇呰鐨勶紱

- rtexprvalue锛氬叏绉版槸

Run-time Expression Value

锛屽畠琛ㄧず鏄惁鍙互浣跨敤JSP琛ㄨ揪寮忥紱

- type锛氭寚瀹氭灞炴€х殑绫誨瀷銆?

鐜闆湪鎴戜滑灏卞彲浠ヤ嬌鐢ㄨ繖涓柊鏍囩浜嗭細

<!-- mytag.jsp -->

鍙戦€侀偖浠?lt;mytag:email date="<%=new Date()%>" message="hello, client" to="client" from="server"/>
           
娉ㄦ剰锛岀敱浜庢垜浠箣鍓嶅凡缁忛€氳繃

taglib

鎸囦護瀵煎叆浜嗘爣绛懼簱锛屽洜姝ゆ墠鑳界洿鎺ヤ嬌鐢ㄦ鏍囩锛涘惁鍒欓渶瑕佸厛瀵煎叆鏍囩搴撱€?

杩愯涓€涓嬶紝鍙戠幇鍑虹幇浜嗕竴涓紓甯革細

JavaEE jsp自定義标簽
澶ц嚧鏄

jsp-version

鍦ㄨ漿鎹㈡垚

double

绫誨瀷鏃跺彂鐢熻漿鎹㈤敊璇€傛鏌ユ垜浠殑浠g爜锛屽彂鐜闆彧鏈夊湪

mytaglib.tld

鏂囦歡鐨?code>taglib鍏冪礌涓嚭鐜頒簡

jsp-version

锛?
<jsp-version>jsp-version</jsp-version>
           
鎶?code>jsp-version淇敼涓?code>2.0锛屽啀娆¤繍琛屾椂鍙互姝e父鏄劇ず锛?
JavaEE jsp自定義标簽
濡傛灉淇敼

jsp-version

鍚庤繕鏄笉鑳芥甯歌繍琛岋紝鍙互灏?code>%TOMCAT_HOME%\webapps\examples\WEB-INF\jsp2鐩綍涓嬬殑浠繪剰TLD鏂囦歡涓殑

taglib

鍏冪礌鎷瘋礉鍒拌嚜宸辯殑TLD鏂囦歡涓紝濡傛灉浣跨敤eclipse鍒欎細鎶LD鏂囦歡鏈夎娉曢敊璇紝涓嶈繃涓嶇敤绠″畠锛岀収鏍峰彲浠ユ垚鍔熻繍琛屻€?

甯︽爣绛句綋鐨勬爣绛?/h2>

鏈変簺鏍囩闄や簡鍏鋒湁灞炴€у锛岃繕鏈夋爣绛句綋锛屾垜浠篃鍙互寮€鍙戝叿鏈夋爣绛句綋鐨勬爣绛俱€?

鎴戜滑瀹氫箟涓€涓凱浠e櫒鏍囩锛屽畠浼氫緷娆¤緭鍑哄鍣ㄤ腑鐨勫厓绱犮€傝繕鏄厛瀹氫箟鏍囩澶勭悊绫夥細

// IteratorTag.java

public class IteratorTag extends SimpleTagSupport {
    private String collection;
    private String item;

    public String getCollection() { return collection; }
    public String getItem() { return item; }
    public void setCollection(String c) { collection=c; }
    public void setItem(String i) { item=i; }

    public void doTag() throws JspException, IOException {
        super.doTag();
        // 浠庡綋鍓峧sp椤甸潰涓婁笅鏂囪幏鍙栧睘鎬?        Collection<?> items=(Collection<?>) getJspContext().getAttribute(collection);
        for(Object i : items) {
            // 缁欏綋鍓峧sp椤甸潰涓婁笅鏂囪缃睘鎬?            getJspContext().setAttribute(item, i);
            // 杈撳嚭鏍囩浣?            getJspBody().invoke(null);
        }
    }
}
           

鍦?code>doTag鏂規硶涓湁涓€鍙?code>getIspBody().invoke(null);锛屽畠璐熻矗杈撳嚭鏍囩浣撱€傞€氬父鏍囩浣撴槸涓€绯誨垪EL琛ㄨ揪寮忔垨jsp鍔ㄤ綔鎸囦護锛屾垜浠笉鎵撶畻鍦ㄨ繖閲岃缁嗕粙缁岴L琛ㄨ揪寮忥紝鏈夊叧EL琛ㄨ揪寮忕殑鍐呭鍙互鍙傝€冭繖涓ょ瘒鏂囩珷锛氥€奅L琛ㄨ揪寮忥紙璇﹁В锛夈€嬪拰銆奅L琛ㄨ揪寮忕畝浠嬨€嬨€?

鐒跺悗鍦═LD鏂囦歡涓畾涔夋爣绛撅細

<!-- mytaglib.tld -->

  <tag>
    <name>iterator</name>
    <tag-class>com.zzw.IteratorTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
      <name>collection</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
    <attribute>
      <name>item</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
  </tag>
           
娉ㄦ剰杩欓噷鐨?code>body-content鍏冪礌鍊間負

scriptless

锛岃〃绀烘爣绛句綋鍙互鍖呭惈EL琛ㄨ揪寮忓拰JSP鍔ㄤ綔鍏冪礌锛屼絾涓嶈兘鍖呭惈JSP鐨勮剼鏈厓绱犮€?

鏈€鍚庡湪jsp椤甸潰涓嬌鐢ㄦ鏍囩锛?

<!-- mytag.jsp -->

<%
    ArrayList<String> list=new ArrayList<String>();
    for(int i=; i<; i++)
        list.add("item "+i);
    pageContext.setAttribute("list", list);
%>
    杩唬鍣?lt;br><mytag:iterator item="item" collection="list">
        ${pageScope.item}<br>
    </mytag:iterator>
           
鎴戜滑鍏堢敤jsp鑴氭湰灏嗗鍣ㄥ璞℃坊鍔犲埌page浣滅敤鍩熶腑锛孖teratorTag绫繪墠鑳藉彇寰楁瀹瑰櫒瀵矽薄锛岀劧鍚庡湪

doTag

鏂規硶涓張灏嗘瀹瑰櫒瀵矽薄涓殑鍏冪礌娣誨姞鍒皃age浣滅敤鍩熶腑锛岀劧鍚庢爣绛句綋

${pageScope.item}

锛堣繖鏄竴涓狤L琛ㄨ揪寮忥級璐熻矗鍙栧緱鍏冪礌瀵矽薄寮曠敤锛屾渶鍚?code>getJspBody().invoke(null);璇彞杈撳嚭姝ゅ厓绱犲璞°€?

缁撴灉濡備笅锛?

JavaEE jsp自定義标簽
璇村埌杩欙紝鎴戜滑宸茬粡浠嬬粛浜嗙畝鍗曟爣绛俱€佸甫灞炴€ф爣绛懼拰甯︽爣绛句綋鏍囩鐨勫紑鍙戯紝涓嬮潰鎴戜滑鍐嶄粙缁嶅嚑绉嶇壒娈婄殑鑷畾涔夋爣绛俱€?

灞炴€т負椤甸潰鐗囨鐨勬爣绛?/h2>

涔嬪墠鎴戜滑宸茬粡浠嬬粛浜嗗甫灞炴€ф爣绛劇殑寮€鍙戯紝鍏跺疄鏍囩鐨勫睘鎬т篃鍙互鏄竴涓〉闈㈢墖娈點€傝繖绉嶆爣绛劇殑澶勭悊绫諱腑蹇呴』鏈変竴涓被鍨嬩負

javax.servlet.jsp.tagext.JspFragment

鐨勫睘鎬э紝鎴戜滑灏嗕竴寮€濮嬬殑datetime鏍囩浣滀負鐗囨鏉ヨ繘琛屽甫灞炴€ф爣绛劇殑寮€鍙戙€?

瀹氫箟鏍囩澶勭悊绫夥細

// FragmentTag.java

public class FragmentTag extends SimpleTagSupport {
    private JspFragment fragment;

    public JspFragment getFragment() { return fragment; }
    public void setFragment(JspFragment f) { fragment=f; }

    public void doTag() throws JspException, IOException {
        super.doTag();
        JspWriter out=getJspContext().getOut();
        out.println("<div style=\"padding:10px;border:1px solid;border-color:#000000\">");
        fragment.invoke(null);
        out.println("</div>");
    }

}
           
FragmentTag绫諱篃閬靛驚甯﹀睘鎬ф爣绛懼鐞嗙被鐨勭紪鍐欒鑼冿紝鍙笉杩囧畠鐨勨€滃睘鎬р€濈被鍨嬩負

JspFragment

銆傚湪

doTag

鏂規硶涓?code>fragment.invoke(null);璇彞璐熻矗杈撳嚭鍖呭惈鐨勯〉闈㈢墖娈點€?

鐒跺悗鍦═LD鏂囦歡涓畾涔夋鏍囩锛?

<!-- mytaglib.tld -->

  <tag>
    <name>fragment</name>
    <tag-class>com.zzw.FragmentTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
      <name>fragment</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <fragment>true</fragment>
    </attribute>
  </tag>
           
娉ㄦ剰鍒幫紝

attribute

鍏冪礌涓浜嗕竴鏉″瓙鍏冪礌

fragment

锛屽鏋滀嬌鐢╡clipse鍒欎細鎶ラ敊锛屾垜浠緷鐒朵笉鐢ㄧ瀹冦€傚鏋滀笉璁劇疆

fragment

鍏冪礌鎴栬缃?code>fragment鍏冪礌涓?code>false锛屽垯杩愯鏃朵細鍙戠敓寮傚父锛?
JavaEE jsp自定義标簽
鎴戜滑鍦╦sp椤甸潰涓嬌鐢ㄦ鏍囩锛?
<!-- mytag.jsp -->

    椤甸潰鐗囨<mytag:fragment>
              <jsp:attribute name="fragment">
                  <mytag:datetime/>
              </jsp:attribute>
          </mytag:fragment>
           
鎴戜滑鍦ㄦ爣绛句綋涓嬌鐢?code>jsp:attribute鍔ㄤ綔鎸囧畾浜唂ragment鏍囩鐨勫睘鎬э紝娉ㄦ剰鍦═LD鏂囦歡涓璮ragment鏍囩鐨?code>body-content鍏冪礌鍊間負

empty

銆?

杩愯缁撴灉濡備笅锛?

JavaEE jsp自定義标簽

鍔ㄦ€佸睘鎬ф爣绛?/h2>

鏈夋椂锛屾垜浠笉鑳界‘瀹氭爣绛炬湁澶氬皯涓睘鎬ф垨鑰呮垜浠笉鐭ラ亾灞炴€х殑鍚嶅瓧锛岃繖绉嶆儏鍐典笅鍙互浣跨敤鍔ㄦ€佸睘鎬ф爣绛俱€傚姩鎬佸睘鎬ф爣绛劇殑澶勭悊绫誨繀椤誨疄鐜?code>javax.servlet.jsp.tagext.DynamicAttributes鎺ュ彛锛屽苟閲嶅啓

setDynamicAttribute

鏂規硶銆?

鎴戜滑瀹氫箟涓€涓畝鍗曠殑鍔ㄦ€佸睘鎬ф爣绛撅紝骞跺湪jsp椤甸潰涓樉绀烘鏍囩鐨勫睘鎬с€?

鏍囩澶勭悊绫夥細

// DynamicTag.java

public class DynamicTag extends SimpleTagSupport implements DynamicAttributes {
    private HashMap<String, Object> attrs=new HashMap<String, Object>();

    public void doTag() throws JspException, IOException {
        super.doTag();
        if(attrs!=null && !attrs.isEmpty()) {
            JspWriter out=getJspContext().getOut();
            out.println("<ol>");
            Set<String> keys=attrs.keySet();
            Iterator<String> iter=keys.iterator();
            while(iter.hasNext()) {
                String key=iter.next();
                out.println("<li>"+key+"="+attrs.get(key)+"</li>");
            }
            out.println("</ol>");
        }
    }

    @Override
    public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
        attrs.put(localName, value);
    }

}
           
鍙互鐪嬪埌锛屾垜浠€氳繃

setDynamicAttribute

鏂規硶鏉ュ姩鎬佹坊鍔犳爣绛劇殑灞炴€с€?

鍦═LD鏂囦歡涓畾涔夋鏍囩锛?

<!-- mytaglib.tld -->

  <tag>
    <name>dynamic</name>
    <tag-class>com.zzw.DynamicTag</tag-class>
    <body-content>empty</body-content>
    <dynamic-attributes>true</dynamic-attributes>
  </tag>
           
姝ゆ爣绛懼浜嗕竴涓?code>dynamic-attributes鍏冪礌锛屽畠鎸囧畾姝ゆ爣绛炬槸鍚︽槸鍔ㄦ€佸睘鎬ф爣绛俱€傚悓鏍風殑锛屽湪eclipse涓缃鍏冪礌浼氭姤閿欙紝浣嗘垜浠悓鏍峰拷鐣ュ畠銆傚鏋滀笉璁劇疆姝ゅ厓绱犳垨璁劇疆姝ゅ厓绱犲€間負

false

锛屽垯鍦ㄨ繍琛屾椂浼氬彂鐢熷紓甯革細
JavaEE jsp自定義标簽
鍦╦sp椤甸潰涓嬌鐢ㄦ鏍囩锛?
<!-- mytag.jsp -->

鍔ㄦ€佸睘鎬?lt;mytag:dynamic user="zzw" password="******" action="signin"/>
           
杩愯缁撴灉濡備笅锛?
JavaEE jsp自定義标簽

Tag File

Tag File鏄嚜瀹氫箟鏍囩鐨勭畝鍖栫敤娉曪紝浣跨敤Tag File鏃犻渶瀹氫箟鏍囩澶勭悊绫誨拰TLD鏂囦歡锛屼絾浠嶇劧鍙互鍦╦sp椤甸潰涓嬌鐢ㄨ嚜瀹氫箟鏍囩銆備笅闈㈡垜浠垱寤轟竴涓猅ag File锛屽疄鐜闆鍥劇殑杩唬銆?

鍒涘緩Tag File

Tag File鐨勫懡鍚嶅繀椤諱互

.tag

缁撳熬锛屾枃浠跺悕灏辨槸姝ゆ爣绛劇殑鏍囩鍚嶃€傝鏂囦歡闇€瑕佹斁鍦╳eb搴旂敤鐨勬煇涓洰褰曚笅锛岄€氬父鏀懼湪

WEB-INF/tags

鐩綍涓紝杩欎釜璺緞鐩稿綋浜庢爣绛懼簱鐨刄RI锛屽湪jsp椤甸潰鐨?code>taglib鎸囦護涓敤

tagdir

灞炴€ф寚瀹氥€?

鍦╡clipse涓紝鍏堝湪

WEB-INF

鐩綍涓嬪垱寤?code>tags鐩綍锛屽啀鍙沖嚮

tags

鐩綍閫夋嫨

New

-

Other

-

Web

-

JSP Tag

锛岃緭鍏ユ枃浠跺悕锛堟垜浠緭鍏terator.tag锛夛紝鍦ㄥ嚭鐜扮殑妯℃澘閫夋嫨妗嗕腑閫夋嫨

New Tag File

锛?code>Finish銆?
<!-- iterator.tag -->

<%@ tag language='java' pageEncoding='GBK' body-content="scriptless"%>
<%@ tag import="java.util.*" %>

<%@ attribute name="bgcolor" required="true"%>
<%@ attribute name="cellcolor" required="true"%>
<%@ attribute name="collection" required="true" type="java.util.HashMap"%>

<%@ variable name-given="end" variable-class="java.util.Date" scope="AT_END"%>

<%
    Set<?> keys=collection.keySet();
    Iterator<?> iter=keys.iterator();
%>
寮€濮嬭凱浠?amp;nbsp;<%=new Date()%><br>
<jsp:doBody/>
<table bgcolor="${bgcolor}" border="1">
<%
    while(iter.hasNext()) {
        String key=(String) iter.next();
%>
    <tr bgcolor="${cellcolor}">
        <td><%=key%></td>
        <td><%=collection.get(key)%></td>
    </tr>
<%}%>
</table>
<%
    jspContext.setAttribute("end", new Date());
%>
           

Tag File鐨勮娉曞拰jsp寰堢浉浼鹼紝瀹冨叿鏈変互涓嬬紪璇戞寚浠わ細

- taglib锛氫綔鐢ㄧ被浼間簬jsp椤甸潰涓殑taglib鎸囦護锛岀敤浜庡鍏ュ叾浠栨爣绛懼簱锛?

- include锛氫綔鐢ㄧ被浼間簬jsp椤甸潰涓殑include鎸囦護锛岀敤浜庡寘鍚叾浠杍sp椤甸潰鎴栭潤鎬侀〉闈紱

- tag锛氫綔鐢ㄧ被浼間簬jsp椤甸潰涓殑page鎸囦護锛岀敤浜庤缃瑷€銆佺紪鐮佺瓑锛?

- attribute锛氱敤浜庤缃爣绛懼睘鎬э紝瀵瑰簲浜嶵LD鏂囦歡涓?code>tag鍏冪礌鐨?code>attribute瀛愬厓绱狅紱

- variable锛氱敤浜庤缃爣绛懼彉閲忥紝杩欎簺鍙橀噺灏嗕紶缁檍sp椤甸潰浣跨敤銆?

鍦═ag File涓篃鍙互浣跨敤jsp鍔ㄤ綔鎸囦護鍜岀紪鍐欓潤鎬佹枃鏈紝鎴戜滑浣跨敤浜?code>jsp:doBody鍔ㄤ綔鎸囦護鏉ヨ緭鍑烘爣绛句綋銆?

鍦═ag File涓繕鍙互瀹氫箟鍙橀噺渚沯sp椤甸潰浣跨敤锛屾鍔熻兘鍙€熷姪

variable

鎸囦護瀹屾垚銆?code>variable鎸囦護鏈夊涓嬪睘鎬э細

- name-given锛氭寚瀹氬彉閲忓悕锛?

- variable-class锛氭寚瀹氬彉閲忕被鍨嬶紝榛樿鏄?code>java.lang.String锛?

- scope锛氭寚瀹氬彉閲忕殑浣滅敤鍩燂紝鏈夊涓?涓€鹼細

-

AT_BEGIN

锛氬湪鏍囩寮€濮嬩嬌鐢ㄥ悗鐨勪換浣曞湴鏂歸兘鍙互浣跨敤姝ゅ彉閲忥紱

-

NESTED

锛氬彧鑳藉湪鏍囩浣撲腑浣跨敤姝ゅ彉閲忥紱

-

AT_END

:鍙兘鍦ㄦ爣绛劇粨鏉熷悗浣跨敤姝ゅ彉閲忋€?

涓嬮潰鍦╦sp椤甸潰涓嬌鐢ㄦtag锛?

<!-- mytag.jsp -->

<%@ taglib tagdir="/WEB-INF/tags" prefix="tags"%>
<%
    HashMap<String, Object> map=new HashMap<String, Object>();
    map.put("name", "寮犱笁");
    map.put("old", );
    map.put("sex", "male");
    map.put("date", new Date());
%>
    TAG杩唬鍣?lt;br>
    <tags:iterator bgcolor="#7f00ff" cellcolor="#ffff00" collection="<%=map%>">
        閿€煎涓猴細
    </tags:iterator>
    缁撴潫杩唬&nbsp;<%=end%>
           
鍦?code>mytag.jsp鏂囦歡涓紝浣跨敤

taglib

鎸囦護瀵煎叆浜員ag File锛?code>tagdir灞炴€ф寚瀹氫簡Tag File鐨勮礬寰勶紝

prefix

鍜屽鍏ヨ嚜瀹氫箟鏍囩搴撴椂鍏鋒湁鐩稿悓鐨勬剰涔夈€傚彟澶栧湪浣跨敤tag鏃訛紝prefix鍚庤窡鐫€鐨勬槸Tag File鐨勫悕瀛椼€?

杩愯鏁堟灉濡備笅锛?

JavaEE jsp自定義标簽

Tag File鐨勫疄璐?/h3>

灏卞鍚宩sp鐨勫疄璐ㄦ槸Servlet涓€鏍鳳紝Tag File鐨勫疄璐ㄥ氨鏄爣绛懼鐞嗙被锛屽畠鏈€鍚庝細琚鐞嗘垚涓€涓?code>xxx_tag.java鏂囦歡锛屽苟琚紪璇戞垚涓€涓?code>xxx_tag.class鏂囦歡銆?

%ECLIPSE_WORKSPACE%\.metadata\.plugins\org.eclipse.wst.server.core\tmpX\work\Catalina\localhost\<PROJECT-NAME>\org\apache\jsp\tag\web

鐩綍涓嬪彲浠ユ壘鍒拌嫢骞?code>xxx_tag.java鍜岀浉搴旂殑CLASS鏂囦歡銆傛煡鐪嬩笂杩癟ag File瀵瑰簲鐨?code>iterator_tag.java鏂囦歡锛?
// iterator_tag.java

public final class iterator_tag
    extends javax.servlet.jsp.tagext.SimpleTagSupport
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {
  // jsp椤甸潰涓婁笅鏂?  private javax.servlet.jsp.JspContext jspContext;

  // 鍦═ag File涓畾涔夌殑灞炴€?  private java.lang.String bgcolor;
  private java.lang.String cellcolor;
  private java.util.HashMap collection;

  // bgcolor銆乧ellcolor鍜宑ollection鐨刧et/set鏂規硶绫諱技
  public java.lang.String getBgcolor() {
    return this.bgcolor;
  }
  public void setBgcolor(java.lang.String bgcolor) {
    this.bgcolor = bgcolor;
    jspContext.setAttribute("bgcolor", bgcolor);
  }

  // 鍦═ag File涓殑jsp鑴氭湰閮戒細鍦╠oTag()鏂規硶涓杞崲涓洪潤鎬佹枃鏈緭鍑?  public void doTag() throws javax.servlet.jsp.JspException, java.io.IOException {
    javax.servlet.jsp.PageContext _jspx_page_context = (javax.servlet.jsp.PageContext)jspContext;
    javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest) _jspx_page_context.getRequest();
    javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse) _jspx_page_context.getResponse();
    javax.servlet.http.HttpSession session = _jspx_page_context.getSession();
    javax.servlet.ServletContext application = _jspx_page_context.getServletContext();
    javax.servlet.ServletConfig config = _jspx_page_context.getServletConfig();
    javax.servlet.jsp.JspWriter out = jspContext.getOut();
    // ...
    try {
      // 鍜屽甫鏍囩浣撴爣绛句竴鏍鳳紝閮芥槸鍦╠oTag()鏂規硶涓皟鐢╣etJspBody().invoke(null);
      _jspx_sout = null;
      if (getJspBody() != null)
        getJspBody().invoke(_jspx_sout);
      // ...
    } catch( java.lang.Throwable t ) {
      // ...
    } finally {
      // ...
    }
  }
}
           

鎴戜滑鍦╥terator_tag绫諱腑鎵懼埌浜嗕笁涓暟鎹垚鍛?code>bgcolor銆?code>cellcolor鍜?code>collection锛屽畠浠兘鏈塯et/set鏂規硶銆傚疄闄呬笂杩欎笁涓暟鎹垚鍛樺氨鏄垜浠湪Tag File涓畾涔夌殑灞炴€э紝鍙鎴戜滑鍦═ag File涓畾涔夌殑灞炴€ч兘浼氭垚涓虹浉搴旀爣绛懼鐞嗙被鐨勬暟鎹垚鍛樸€?

鎴戜滑杩樺彂鐜幫紝鍜宩sp杞崲鎴怱ervlet涓€鏍鳳紝鍦?code>doTag鏂規硶涓篃瀹氫箟浜嗕竴绯誨垪鍐呯疆瀵矽薄锛屽畠浠拰tag绫葷殑鏁版嵁鎴愬憳

jspContext

閮借兘鍦═ag File涓洿鎺ヤ嬌鐢細

瀵矽薄 绫誨瀷 琛ㄧず
jspContext javax.servlet.jsp.JspContext jsp椤甸潰鐨勪笂涓嬫枃
request javax.servlet.http.HttpServletRequest 涓€娆″鎴風璇鋒眰
response javax.servlet.http.HttpServletResponse 涓€娆℃湇鍔″櫒鍝嶅簲
session javax.servlet.http.HttpSession 涓€娆′細璇?/td>
application javax.servlet.ServletContext 鏁翠釜web搴旂敤
config javax.servlet.ServletConfig 搴旂敤閰嶇疆
out javax.servlet.jsp.JspWriter 杈撳嚭娴?/td>

鍏充簬杩欏嚑涓璞$殑浣跨敤鍙互鍙傝€冩垜鐨勫彟涓€绡囨枃绔狅細銆奐avaEE jsp鐨勫唴缃璞″強鍏跺湪Servlet涓殑琛ㄧず銆嬨€?

婧愪唬鐮?/h2>

涓婅堪鎵€鏈変唬鐮佸凡缁忎笂浼犲埌github锛?

https://github.com/jzyhywxz/WebDemo.git