天天看點

利用 SimpleTagSupport 開發自定義标簽

锘匡豢

绠€浠嬶細聽

聽聽 缁濆ぇ閮ㄥ垎 Java 棰嗗煙鐨?MVC 妗嗘灦锛屼緥濡?Struts銆丼pring聽聽聽 MVC銆丣SF 绛夛紝涓昏鐢變袱閮ㄥ垎缁勬垚锛氭帶鍒跺櫒缁勪歡鍜岃鍥劇粍浠躲€傚叾涓鍥劇粍浠朵富瑕佺敱澶ч噺鍔熻兘涓闆瘜鐨勬爣绛懼簱鍏呭綋銆傚浜庡ぇ閮ㄥ垎寮€鍙戣€呰€岃█锛屽彲鑳介€氬父鍙嬌鐢ㄨ繖浜涙鏋舵彁渚涚殑鏍囩锛屽緢灏戣嚜宸卞紑鍙戞爣绛撅紱浣嗗鏋滃紑鍙戣€呮帉鎻¢拡瀵圭壒瀹氬簲鐢ㄥ紑鍙戣嚜瀹氫箟鏍囩锛屽垯鍙互澶уぇ绠€鍖?Web 搴旂敤鐨勮〃鐜闆眰寮€鍙戯紝鑰?JSP 2 瑙勮寖鎻愪緵鐨劼?impleTagSupport 涓哄紑鍙戣嚜瀹氫箟鏍囩鎻愪緵浜嗗緢濂界殑鏀寔銆?

鑷畾涔夋爣绛懼簱骞朵笉鏄?JSP 2 鎵嶅嚭鐜扮殑锛孞SP 1.1 鐗堜腑宸茬粡澧炲姞浜嗚嚜瀹氫箟鏍囩搴撹鑼冿紝鑷畾涔夋爣绛懼簱鏄竴绉嶉潪甯鎬紭绉€鐨勮〃鐜闆眰缁勪歡鎶€鏈€傞€氳繃浣跨敤鑷畾涔夋爣绛懼簱锛屽彲浠ュ湪绠€鍗曠殑鏍囩涓皝瑁呭鏉傜殑鍔熻兘銆?

涓轟粈涔堣浣跨敤鑷畾涔夋爣绛懼憿锛熶富瑕佹槸涓轟簡鍙栦唬涓戦檵鐨?JSP 鑴氭湰銆傚湪 HTML 椤甸潰涓彃鍏?JSP 鑴氭湰鏈夊涓嬪嚑涓潖澶勶細

  • JSP 鑴氭湰闈炲父涓戦檵锛岄毦浠ラ槄璇彙€?
  • JSP 鑴氭湰鍜?HTML 浠g爜娣鋒潅锛岀淮鎶ゆ垚鏈珮銆?
  • HTML 椤甸潰涓祵鍏?JSP 鑴氭湰锛屽鑷寸編宸ヤ漢鍛橀毦浠ュ弬涓庡紑鍙戙€?
聽聽聽聽聽聽聽聽聽聽聽聽聽

聽聽

鍑轟簬浠ヤ笂涓夌偣鐨勮€冭檻锛屾垜浠渶瑕佷竴绉嶅彲鍦ㄩ〉闈腑浣跨敤鐨勬爣绛撅紝杩欑鏍囩鍏鋒湁鍜?HTML 鏍囩绫諱技鐨勮娉曪紝浣嗙敱鍙互瀹屾垚 JSP 鑴氭湰鐨勫姛鑳解€斺€旇繖绉嶆爣绛懼氨鏄?JSP 鑷畾涔夋爣绛俱€?

鍦?JSP1.1 瑙勮寖涓紑鍙戣嚜瀹氫箟鏍囩搴撴瘮杈冨鏉傦紝JSP 2 瑙勮寖绠€鍖栦簡鏍囩搴撶殑寮€鍙戯紝鍦?JSP 2 涓紑鍙戞爣绛懼簱鍙渶濡備笅鍑犱釜姝ラ锛?

  1. 寮€鍙戣嚜瀹氫箟鏍囩澶勭悊绫夥紱
  2. 寤虹珛涓€涓?*.tld 鏂囦歡锛屾瘡涓?*.tld 鏂囦歡瀵瑰簲涓€涓爣绛懼簱锛屾瘡涓爣绛懼簱瀵瑰簲澶氫釜鏍囩锛?
  3. 鍦?JSP 鏂囦歡涓嬌鐢ㄨ嚜瀹氫箟鏍囩銆?
寮€鍙戣嚜瀹氫箟鏍囩绫?

鏍囩搴撳拰瀹為檯寮€鍙?/h2>

鏍囩搴撴槸闈炲父閲嶈鐨勬妧鏈紝閫氬父鏉ヨ锛屽垵瀛﹁€呫€佹櫘閫氬紑鍙戜漢鍛樿嚜宸卞紑鍙戞爣绛懼簱鐨勬満浼氬緢灏戯紝浣嗗鏋滃笇鏈涙垚涓洪珮绾х▼搴忓憳锛屾垨鑰呭笇鏈涘紑鍙戦€氱敤妗嗘灦锛屽氨闇€瑕佸ぇ閲忓紑鍙戣嚜瀹氫箟鏍囩浜嗐€傛墍鏈夌殑 MVC 妗嗘灦锛屽 Struts 2銆丼pringMVC銆丣SF 绛夐兘鎻愪緵浜嗕赴瀵岀殑鑷畾涔夋爣绛俱€?

褰撴垜浠湪 JSP 椤甸潰浣跨敤涓€涓畝鍗曠殑鏍囩鏃訛紝搴曞眰瀹為檯涓婄敱鏍囩澶勭悊绫繪彁渚涙敮鎸侊紝浠庤€屽彲浠ヤ嬌鐢ㄧ畝鍗曠殑鏍囩鏉ュ皝瑁呭鏉傜殑鍔熻兘锛屼粠鑰屼嬌鍥㈤槦鏇村ソ鍦闆崗浣滃紑鍙戯紙鑳借缇庡伐浜哄憳鏇村ソ鍦闆弬涓?JSP 椤甸潰鐨勫紑鍙戯級銆?

鏃╂湡 JSP 鑷畾涔夋爣绛劇被寮€鍙戣繃绋嬬暐寰鏉備竴浜涳紝浣?JSP 2 宸茬粡绠€鍖栦簡杩欎釜杩囩▼锛屽畠鍙鑷畾涔夋爣绛劇被閮藉繀椤葷戶鎵誇竴涓埗绫夥細javax.servlet.jsp.tagext.SimpleTagSupport锛岄櫎姝や箣澶栵紝JSP 鑷畾涔夋爣绛劇被杩樻湁濡備笅瑕佹眰銆?

  • 濡傛灉鏍囩绫誨寘鍚睘鎬э紝姣忎釜灞炴€ч兘鏈夊搴旂殑 getter 鍜?setter 鏂規硶銆?
  • 閲嶅啓 doTag() 鏂規硶锛岃繖涓柟娉曡礋璐g敓鎴愰〉闈㈠唴瀹廣€?
涓嬮潰寮€鍙戜竴涓渶绠€鍗曠殑鑷畾涔夋爣绛撅紝璇ユ爣绛捐礋璐e湪椤甸潰涓婅緭鍑?HelloWorld銆?

// 鏍囩澶勭悊绫夥紝缁ф壙 SimpleTagSupport 鐖剁被
public class HelloWorldTag extends SimpleTagSupport 
{ 
    // 閲嶅啓 doTag 鏂規硶锛岃鏂規硶鍦ㄦ爣绛劇粨鏉熺敓鎴愰〉闈㈠唴瀹?    public void doTag()throws JspException, 
        IOException 
    { 
        // 鑾峰彇椤甸潰杈撳嚭娴侊紝骞惰緭鍑哄瓧绗︿覆
        getJspContext().getOut().write("Hello World"); 
    } 
} 
                        

涓婇潰杩欎釜鏍囩澶勭悊绫婚潪甯哥畝鍗曪紝瀹冪戶鎵誇簡 SimpleTagSupport 鐖剁被锛屽苟閲嶅啓 doTag() 鏂規硶锛岃€?doTag() 鏂規硶鍒欒礋璐h緭鍑洪〉闈㈠唴瀹廣€傝鏍囩娌℃湁灞炴€э紝鍥犳鏃犻』鎻愪緵 setter 鍜?getter 鏂規硶銆?

寤虹珛 TLD 鏂囦歡

TLD 鏄?Tag Library Definition 鐨勭緝鍐欙紝鍗蟲爣绛懼簱瀹氫箟锛屾枃浠剁殑鍚庣紑鏄?tld锛屾瘡涓?TLD 鏂囦歡瀵瑰簲涓€涓爣绛懼簱锛屼竴涓爣绛懼簱涓彲鍖呭惈澶氫釜鏍囩锛孴LD 鏂囦歡涔熺О涓烘爣绛懼簱瀹氫箟鏂囦歡銆?

鏍囩搴撳畾涔夋枃浠剁殑鏍瑰厓绱犳槸 taglib锛屽畠鍙互鍖呭惈澶氫釜 tag 瀛愬厓绱狅紝姣忎釜 tag 瀛愬厓绱犻兘瀹氫箟涓€涓爣绛俱€傞€氬父鎴戜滑鍙互鍒?Web 瀹瑰櫒涓嬪鍒朵竴涓爣绛懼簱瀹氫箟鏂囦歡锛屽苟鍦ㄦ鍩虹涓婅繘琛屼慨鏀瑰嵆鍙€備緥濡?Tomcat6.0锛屽湪 webapps\examples\WEB-INF\jsp2 璺緞涓嬪寘鍚簡涓€涓?jsp2-example-taglib.tld 鏂囦歡锛岃繖灏辨槸绀鴻寖鐢ㄧ殑鏍囩搴撳畾涔夋枃浠躲€?

灏嗚鏂囦歡澶嶅埗鍒?Web 搴旂敤鐨?WEB-INF/ 璺緞锛屾垨 WEB-INF 鐨勪換鎰忓瓙璺緞涓嬶紝骞跺璇ユ枃浠惰繘琛岀畝鍗曚慨鏀癸紝淇敼鍚庣殑 mytaglib.tld 鏂囦歡浠g爜濡備笅锛?

<?xml version="1.0" encoding="GBK"?>
<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">
    <tlib-version>1.0</tlib-version>
    <short-name>mytaglib</short-name>
    <!-- 瀹氫箟璇ユ爣绛懼簱鐨刄RI -->
    <uri>http://www.crazyit.org/mytaglib</uri>
    <!-- 瀹氫箟绗竴涓爣绛?-->
    <tag>
        <!-- 瀹氫箟鏍囩鍚?-->
        <name>helloWorld</name>
        <!-- 瀹氫箟鏍囩澶勭悊绫?-->
        <tag-class>lee.HelloWorldTag</tag-class>
        <!-- 瀹氫箟鏍囩浣撲負绌?-->
        <body-content>empty</body-content>
    </tag>
</taglib>
                        

涓婇潰鏍囩搴撳畾涔夋枃浠朵篃鏄竴涓爣鍑嗙殑 XML 鏂囦歡锛岃 XML 鏂囦歡鐨勬牴鍏冪礌鏄?taglib 鍏冪礌锛屽洜姝ゆ垜浠瘡娆$紪鍐欐爣绛懼簱瀹氫箟鏂囦歡閮界洿鎺ユ坊鍔犺鍏冪礌鍗沖彲銆?

taglib 涓嬫湁涓変釜瀛愬厓绱狅細

  • tlib-version锛氭寚瀹氳鏍囩搴撳疄鐜扮殑鐗堟湰锛岃繖鏄竴涓綔涓烘爣璇嗙殑鍐呴儴鐗堟湰鍙鳳紝瀵圭▼搴忔病鏈夊お澶х殑浣滅敤銆?
  • short-name锛氳鏍囩搴撶殑榛樿鐭悕锛岃鍚嶇О閫氬父涔熸病鏈夊お澶х殑鐢ㄥ銆?
  • uri锛氳繖涓睘鎬ч潪甯擱噸瑕侊紝瀹冩寚瀹氳鏍囩搴撶殑 URI锛岀浉褰撲簬鎸囧畾璇ユ爣绛懼簱鐨勫敮涓€鏍囪瘑銆傚涓婄矖浣撳瓧浠g爜鎵€绀猴紝JSP 椤甸潰涓嬌鐢ㄦ爣绛懼簱鏃跺氨鏄牴鎹 URI 灞炴€ф潵瀹氫綅鏍囩搴撶殑銆?
闄ゆ涔嬪锛宼aglib 鍏冪礌涓嬪彲浠ュ寘鍚涓?tag 鍏冪礌锛屾瘡涓?tag 鍏冪礌瀹氫箟涓€涓爣绛撅紝tag 鍏冪礌涓嬭嚦灏戝簲鍖呭惈濡備笅涓変釜瀛愬厓绱狅細
  • name锛氳鏍囩搴撶殑鍚嶇О锛岃繖涓睘鎬у緢閲嶈锛孞SP 椤甸潰涓氨鏄牴鎹鍚嶇О鏉ヤ嬌鐢ㄦ鏍囩鐨勩€?
  • tag-class锛氭寚瀹氭爣绛劇殑澶勭悊绫夥紝姣嬪焊缃枒锛岃繖涓睘鎬ч潪甯擱噸瑕侊紝鎸囧畾浜嗘爣绛劇敱鍝釜 Java 绫繪潵澶勭悊銆?
  • body-content锛氳繖涓睘鎬т篃寰堥噸瑕侊紝瀹冩寚瀹氭爣绛句綋鍐呭銆傝鍏冪礌鐨勫€煎彲浠ユ槸濡備笅鍑犱釜锛?
    • tagdependent锛氭寚瀹氭爣绛懼鐞嗙被鑷繁璐熻矗澶勭悊鏍囩浣撱€?
    • empty锛氭寚瀹氳鏍囩鍙兘浣滅敤绌烘爣绛句嬌鐢ㄣ€?
    • scriptless锛氭寚瀹氳鏍囩鐨勬爣绛句綋鍙互鏄潤鎬?HTML 鍏冪礌锛岃〃杈懼紡璇█锛屼絾涓嶅厑璁稿嚭鐜?JSP 鑴氭湰銆?
    • JSP锛氭寚瀹氳鏍囩鐨勬爣绛句綋鍙互浣跨敤 JSP 鑴氭湰銆?

瀹為檯涓婄敱浜?JSP 2 瑙勮寖涓嶅啀鎺ㄨ崘浣跨敤 JSP 鑴氭湰锛屾墍浠?JSP 2 鑷畾涔夋爣绛劇殑鏍囩浣撲腑涓嶈兘鍖呭惈 JSP 鑴氭湰銆傛墍浠ュ疄闄呬笂 body-content 鍏冪礌鐨勫€間笉鍙互鏄?JSP銆?

瀹氫箟浜嗕笂闈㈢殑鏍囩搴撳畾涔夋枃浠跺悗锛屽皢鏍囩搴撴枃浠舵斁鍦?Web 搴旂敤鐨?WEB-INF 璺緞锛屾垨浠繪剰瀛愯礬寰勪笅锛孞ava Web 瑙勮寖浼氳嚜鍔ㄥ姞杞借鏂囦歡锛屽垯璇ユ枃浠跺畾涔夌殑鏍囩搴撲篃灏嗙敓鏁?

浣跨敤鏍囩搴?

鍦?JSP 椤甸潰涓‘瀹氭寚瀹氭爣绛鵑渶瑕?2 鐐癸細

  • 鏍囩搴?URI锛氱‘瀹氫嬌鐢ㄥ摢涓爣绛懼簱銆?
  • 鏍囩鍚嶏細纭畾浣跨敤鍝釜鏍囩銆?
浣跨敤鏍囩搴撳垎鎴愪互涓嬩袱涓楠わ細
  1. 瀵煎叆鏍囩搴擄細浣跨敤 taglib 缂栬瘧鎸囦護瀵煎叆鏍囩搴擄紝灏辨槸灏嗘爣绛懼簱鍜屾寚瀹氬墠缂€鍏寵仈璧鋒潵銆?
  2. 浣跨敤鏍囩锛氬湪 JSP 椤甸潰涓嬌鐢ㄨ嚜瀹氫箟鏍囩銆?
taglib 鐨勮娉曟牸寮忓涓嬶細
<%@ taglib uri="tagliburi" prefix="tagPrefix" %> 
                        

鍏朵腑 uri 灞炴€х‘瀹氭爣绛懼簱鐨?URI锛岃繖涓?URI 鍙互纭畾涓€涓爣绛懼簱銆傝€?prefix 灞炴€ф寚瀹氭爣绛懼簱鍓嶇紑锛屽嵆鎵€鏈変嬌鐢ㄨ鍓嶇紑鐨勬爣绛懼皢鐢辨鏍囩搴撳鐞嗐€?

浣跨敤鏍囩鐨勮娉曟牸寮忓涓嬶細

<tagPrefix:tagName tagAttribute=鈥漷agValue鈥?鈥?> 
	<tagBody/> 
</tagPrefix:tagName> 
                        
濡傛灉璇ユ爣绛炬病鏈夋爣绛句綋锛屽垯鍙互浣跨敤濡備笅璇硶鏍煎紡锛?
<tagPrefix:tagName tagAttribute=鈥漷agValue鈥?鈥?/> 
                        

涓婇潰浣跨敤鏍囩鐨勮娉曢噷閮藉寘鍚簡璁劇疆灞炴€у€鹼紝鍓嶉潰鎴戜滑浠嬬粛鐨?HelloWorldTag 鏍囩娌℃湁浠諱綍灞炴€э紝鎵€浠ヤ嬌鐢ㄨ鏍囩鍙渶鐢?<mytag:helloWorld/> 鍗沖彲銆傚叾涓?mytag 鏄?taglib 鎸囦護涓烘爣绛懼簱鎸囧畾鐨勫墠缂€锛岃€?helloWorld 鏄爣绛懼悕銆?

涓嬮潰鏄嬌鐢?helloWorld 鏍囩鐨?JSP 椤甸潰浠g爜锛?

<%@ page contentType="text/html; charset=GBK"%>
<!-- 瀵煎叆鏍囩搴擄紝鎸囧畾mytag鍓嶇紑鐨勬爣绛撅紝
	鐢県ttp://www.crazyit.org/mytaglib鐨勬爣绛懼簱澶勭悊 -->
<%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>
<html>
<head>
<title>鑷畾涔夋爣绛劇ず鑼?lt;/title>
</head>
<body bgcolor="#ffffc0">
<h2>涓嬮潰鏄劇ず鐨勬槸鑷畾涔夋爣绛句腑鐨勫唴瀹?lt;/h2>
<!-- 浣跨敤鏍囩 锛屽叾涓璵ytag鏄爣绛懼墠缂€锛屾牴鎹畉aglib鐨勭紪璇戞寚浠わ紝
	mytag鍓嶇紑灏嗙敱http://www.crazyit.org/mytaglib鐨勬爣绛懼簱澶勭悊 -->
<mytag:helloWorld/><BR>
</body>
</html>
                        

涓婇潰椤甸潰涓涓€琛岀矖浣撳瓧浠g爜鎸囧畾浜?http://www.crazyit.org/mytaglib 鏍囩搴撶殑鍓嶇紑涓?mytag锛岀浜岃绮椾綋瀛椾唬鐮佽〃鏄庝嬌鐢?mytag 鍓嶇紑瀵瑰簲鏍囩搴撻噷鐨?helloWorld 鏍囩銆傛祻瑙堣椤甸潰灏嗙湅鍒闆鍥?1 鎵€绀烘晥鏋滐細

鍥?1. 绠€鍗曟爣绛?

利用 SimpleTagSupport 開發自定義标簽

甯﹀睘鎬х殑鏍囩

鍓嶉潰鐨勭畝鍗曟爣绛炬棦娌℃湁灞炴€э紝涔熸病鏈夋爣绛句綋锛岀敤娉曘€佸姛鑳介兘姣旇緝绠€鍗曘€傚疄闄呬笂杩樻湁濡備笅涓ょ甯哥敤鐨勬爣绛撅細

  • 甯﹀睘鎬х殑鏍囩銆?
  • 甯︽爣绛句綋鐨勬爣绛俱€?
姝e鍓嶉潰浠嬬粛鐨勶紝甯﹀睘鎬ф爣绛懼繀椤諱負姣忎釜灞炴€ф彁渚涘搴旂殑 setter 鍜?getter 鏂規硶銆傚甫灞炴€ф爣绛劇殑閰嶇疆鏂規硶涓庣畝鍗曟爣绛句篃鐣ユ湁宸埆锛屼笅闈粙缁嶄竴涓甫灞炴€ф爣绛劇殑绀轟緥锛?
public class QueryTag extends SimpleTagSupport
{
    //鏍囩鐨勫睘鎬?    private String driver;
    private String url;
    private String user;
    private String pass;
    private String sql;
    //鎵ц鏁版嵁搴撹闂殑瀵矽薄 
    private Connection conn = null;
    private Statement stmt = null;
    private ResultSet rs = null;
    private ResultSetMetaData rsmd = null;
    //鏍囩灞炴€river鐨剆etter鏂規硶
    public void setDriver(String driver) {
        this.driver = driver; 
    }
        //鏍囩灞炴€rl鐨剆etter鏂規硶
    public void setUrl(String url) {
        this.url = url; 
    }
        //鏍囩灞炴€ser鐨剆etter鏂規硶
    public void setUser(String user) {
        this.user = user; 
    }
        //鏍囩灞炴€ass鐨剆etter鏂規硶
    public void setPass(String pass) {
        this.pass = pass; 
    }
        //鏍囩灞炴€river鐨刧etter鏂規硶
    public String getDriver() {
        return (this.driver); 
    }
        //鏍囩灞炴€rl鐨刧etter鏂規硶
    public String getUrl() {
        return (this.url); 
    }
        //鏍囩灞炴€ser鐨刧etter鏂規硶
    public String getUser() {
        return (this.user); 
    }
        //鏍囩灞炴€ass鐨刧etter鏂規硶
    public String getPass() {
        return (this.pass); 
    }
        //鏍囩灞炴€ql鐨刧etter鏂規硶
    public String getSql() {
        return (this.sql); 
    }
        //鏍囩灞炴€ql鐨剆etter鏂規硶
    public void setSql(String sql) {
        this.sql = sql; 
    }
    public void doTag()throws JspException,
        IOException
    {
           try
        {
            //娉ㄥ唽椹卞姩
            Class.forName(driver);
            //鑾峰彇鏁版嵁搴撹繛鎺?            conn = DriverManager.getConnection(url,user,pass);
            //鍒涘緩Statement瀵矽薄
            stmt = conn.createStatement();
            //鎵ц鏌ヨ
            rs = stmt.executeQuery(sql);
            rsmd = rs.getMetaData();
            //鑾峰彇鍒楁暟鐩?            int columnCount = rsmd.getColumnCount();
            //鑾峰彇椤甸潰杈撳嚭娴?            Writer out = getJspContext().getOut();
            //鍦ㄩ〉闈㈣緭鍑鴻〃鏍?            out.write("<table  bgColor='9999cc' width='400'>");
            //閬嶅巻缁撴灉闆?            while (rs.next())
            {
                out.write("<tr>");
                //閫愬垪杈撳嚭鏌ヨ鍒扮殑鏁版嵁
                for (int i = 1 ; i <= columnCount ; i++ )
                {
                    out.write("<td>");
                    out.write(rs.getString(i));
                    out.write("</td>");
                }
                out.write("</tr>");
            }
        }
        catch(ClassNotFoundException cnfe)
        {
            cnfe.printStackTrace();
            throw new JspException("鑷畾涔夋爣绛鵑敊璇? + cnfe.getMessage());
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
            throw new JspException("鑷畾涔夋爣绛鵑敊璇? + ex.getMessage());
        }
        finally
        {
            //鍏抽棴缁撴灉闆?            try
            {
                if (rs != null)
                    rs.close();
                if (stmt != null)
                    stmt.close();
                if (conn != null)
                    conn.close();
            }
            catch (SQLException sqle)
            {
                sqle.printStackTrace();
            }
        }
    }
}
      

涓婇潰杩欎釜鏍囩绋嶅井澶嶆潅涓€鐐癸紝瀹冨寘鍚簡 5 涓睘鎬э紝濡傜▼搴忎腑绮椾綋瀛椾唬鐮佹墍绀猴紝鍒欑▼搴忛渶瑕佷負杩?5 涓睘鎬ф彁渚?setter 鍜?getter 鏂規硶銆?

璇ユ爣绛捐緭鍑虹殑鍐呭渚濈劧鐢?doTag() 鏂規硶鍐沖畾锛岃鏂規硶浼氭牴鎹?SQL 璇彞鏌ヨ鏁版嵁搴擄紝骞跺皢鏌ヨ缁撴灉鏄劇ず鍦ㄥ綋鍓嶉〉闈腑銆?

瀵逛簬鏈夊睘鎬х殑鏍囩锛岄渶瑕佷負 tag 鍏冪礌澧炲姞 attribute 瀛愬厓绱狅紝姣忎釜 attribute 瀛愬厓绱犲畾涔変竴涓睘鎬э紝attribue 瀛愬厓绱犻€氬父杩橀渶瑕佹寚瀹氬涓嬪嚑涓瓙鍏冪礌锛?

  • name锛氳缃睘鎬у悕锛屽瓙鍏冪礌鐨勫€兼槸瀛楃涓插唴瀹廣€?
  • required锛氳缃灞炴€ф槸鍚︿負涓嶉渶灞炴€э紝璇ュ瓙鍏冪礌鐨勫€兼槸 true 鎴?false銆?
  • fragment锛氳缃灞炴€ф槸鍚︽敮鎸?JSP 鑴氭湰銆佽〃杈懼紡绛夊姩鎬佸唴瀹癸紝瀛愬厓绱犵殑鍊兼槸 true 鎴?false銆?
涓轟簡閰嶇疆涓婇潰鐨?QueryTag 鏍囩锛屾垜浠渶瑕佸湪 mytaglib.tld 鏂囦歡涓鍔犲涓嬮厤缃墖娈碉細
<!-- 瀹氫箟绗簩涓爣绛?-->
<tag>
    <!-- 瀹氫箟鏍囩鍚?-->
    <name>query</name>
    <!-- 瀹氫箟鏍囩澶勭悊绫?-->
    <tag-class>lee.QueryTag</tag-class>
    <!-- 瀹氫箟鏍囩浣撲負绌?-->
    <body-content>empty</body-content>
    <!-- 閰嶇疆鏍囩灞炴€?driver -->
    <attribute>
        <name>driver</name> 
        <required>true</required>
        <fragment>true</fragment>
    </attribute>
    <!-- 閰嶇疆鏍囩灞炴€?url -->
    <attribute>
        <name>url</name> 
        <required>true</required>
        <fragment>true</fragment>
    </attribute>
    <!-- 閰嶇疆鏍囩灞炴€?user -->
    <attribute>
        <name>user</name> 
        <required>true</required>
        <fragment>true</fragment>
    </attribute>
    <!-- 閰嶇疆鏍囩灞炴€?pass -->
    <attribute>
        <name>pass</name> 
        <required>true</required>
        <fragment>true</fragment>
    </attribute>
    <!-- 閰嶇疆鏍囩灞炴€?sql -->
    <attribute>
        <name>sql</name> 
        <required>true</required>
        <fragment>true</fragment>
    </attribute>
</tag>
      

涓婇潰 5 琛岀矖浣撳瓧浠g爜鍒嗗埆涓鴻鏍囩閰嶇疆浜?driver銆乽rl銆乽ser銆乸ass 鍜?sql 绛?5 涓睘鎬э紝骞舵寚瀹氳繖 5 涓睘鎬ч兘鏄繀濉睘鎬с€佽€屼笖灞炴€у€兼敮鎸佸姩鎬佸唴瀹廣€?

閰嶇疆瀹屾瘯鍚庯紝灏卞彲鍦ㄩ〉闈腑浣跨敤鏍囩锛屽厛瀵煎叆鏍囩搴擄紝鐒跺悗浣跨敤鏍囩銆備嬌鐢ㄦ爣绛劇殑 JSP 椤甸潰鐗囨濡備笅锛?

<!-- 瀵煎叆鏍囩搴擄紝鎸囧畾mytag鍓嶇紑鐨勬爣绛撅紝
    鐢県ttp://www.crazyit.org/mytaglib鐨勬爣绛懼簱澶勭悊 -->
<%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>
...
<!-- 鍏朵粬HTML鍐呭 -->
<!-- 浣跨敤鏍囩 锛屽叾涓璵ytag鏄爣绛懼墠缂€锛屾牴鎹畉aglib鐨勭紪璇戞寚浠わ紝
    mytag鍓嶇紑灏嗙敱http://www.crazyit.org/mytaglib鐨勬爣绛懼簱澶勭悊 -->
<mytag:query
    driver="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/javaee"
    user="root"
    pass="32147"
    sql="select * from newsinf"/>
      

鍦ㄦ祻瑙堝櫒涓祻瑙堣椤甸潰锛屾晥鏋滃鍥?2 鎵€绀恒€?

鍥?2. 浣跨敤甯﹀睘鎬х殑鏍囩鎵ц鏌ヨ

利用 SimpleTagSupport 開發自定義标簽

鍥?2 涓湅鍒頒粠鏁版嵁搴撻噷鏌ヨ鍒?2 鏉¤褰曪紝褰撶劧杩欎篃闇€瑕佸簳灞?javaee 鏁版嵁搴撻噷鍖呭惈 newsinf 鏁版嵁琛紝涓旇鏁版嵁琛ㄩ噷鍖呭惈杩欎袱鏉¤褰曟墠琛屻€?

鍦?JSP 椤甸潰涓彧闇€瑕佷嬌鐢ㄧ畝鍗曠殑鏍囩锛屽嵆鍙畬鎴愨€滃鏉傗€濈殑鍔熻兘锛氭墽琛屾暟鎹簱鏌ヨ锛屽苟灏嗘煡璇㈢粨鏋滃湪椤甸潰涓婁互琛ㄦ牸褰㈠紡鏄劇ず銆傝繖涔熸鏄嚜瀹氫箟鏍囩搴撶殑鐩殑鈥斺€斾互绠€鍗曠殑鏍囩锛岄殣钘忓鏉傜殑閫昏緫銆?

褰撶劧锛屽苟涓嶆帹鑽愬湪鏍囩澶勭悊绫諱腑璁塊棶鏁版嵁搴擄紝鍥犱負鏍囩搴撴槸琛ㄧ幇灞傜粍浠訛紝瀹冧笉搴旇鍖呭惈浠諱綍涓氬姟閫昏緫瀹炵幇浠g爜锛屾洿涓嶅簲璇ユ墽琛屾暟鎹簱璁塊棶锛屽畠鍙簲璇ヨ礋璐f樉绀洪€昏緫

甯︽爣绛句綋鐨勬爣绛?

甯︽爣绛句綋鐨勬爣绛撅紝鍙互鍦ㄦ爣绛懼唴宓屽叆鍏朵粬鍐呭锛堝寘鎷潤鎬佺殑 HTML 鍐呭鍜屽姩鎬佺殑 JSP 鍐呭锛夛紝閫氬父鐢ㄤ簬瀹屾垚涓€浜涢€昏緫杩愮畻锛屼緥濡傚垽鏂拰寰幆绛夈€備笅闈互涓€涓凱浠e櫒鏍囩涓虹ず渚嬶紝浠嬬粛甯︽爣绛句綋鏍囩鐨勫紑鍙戣繃绋嬨€?

涓€鏍峰厛瀹氫箟涓€涓爣绛懼鐞嗙被锛岃鏍囩澶勭悊绫葷殑浠g爜濡備笅锛?

public class IteratorTag extends SimpleTagSupport
{
    //鏍囩灞炴€э紝鐢ㄤ簬鎸囧畾闇€瑕佽杩唬鐨勯泦鍚?    private String collection;
    //鏍囩灞炴€э紝鎸囧畾杩唬闆嗗悎鍏冪礌锛屼負闆嗗悎鍏冪礌鎸囧畾鐨勫悕绉?    private String item;
    //collection灞炴€х殑setter鍜実etter鏂規硶
    public void setCollection(String collection)
    {
        this.collection = collection;
    }
    public String getCollection()
    {
        return this.collection;
    }
    //item灞炴€х殑setter鍜実etter鏂規硶
    public void setItem(String item)
    {
        this.item = item;
    }
    public String getItem()
    {
        return this.item;
    }
    //鏍囩鐨勫鐞嗘柟娉曪紝绠€鍗曟爣绛懼鐞嗙被鍙渶瑕侀噸鍐檇oTag鏂規硶
    public void doTag() throws JspException, IOException
    {
        //浠巔age scope涓幏鍙栧睘鎬у悕涓篶ollection鐨勯泦鍚?        Collection itemList = (Collection)getJspContext().
            getAttribute(collection);
        //閬嶅巻闆嗗悎
        for (Object s : itemList)
        {
            //灏嗛泦鍚堢殑鍏冪礌璁劇疆鍒皃age 鑼冨洿
            getJspContext().setAttribute(item, s );
            //杈撳嚭鏍囩浣?            getJspBody().invoke(null);
        }
    }
}
      

涓婇潰鏍囩澶勭悊绫諱笌鍓嶉潰澶勭悊绫誨苟娌℃湁澶ぇ鐨勪笉鍚岋紝璇ュ鐞嗙被鍖呭惈 2 涓睘鎬э紝骞朵負杩欎袱涓睘鎬ф彁渚涗簡 setter 鍜?getter 鏂規硶銆傛爣绛懼鐞嗙被鐨?doTag 鏂規硶棣栧厛浠?page 鑼冨洿鍐呰幏鍙栦簡鎸囧畾鍚嶇О鐨?Collection 瀵矽薄锛岀劧鍚庨亶鍘?Collection 瀵矽薄鐨勫厓绱狅紝姣忔閬嶅巻閮借皟鐢ㄤ簡 getJspBody() 鏂規硶锛屽绋嬪簭涓矖浣撳瓧浠g爜鎵€绀猴紝璇ユ柟娉曡繑鍥炶鏍囩鎵€鍖呭惈鐨勬爣绛句綋锛欽spFragment 瀵矽薄锛屾墽琛岃瀵矽薄鐨?invoke() 鏂規硶锛屽嵆鍙緭鍑烘爣绛句綋鍐呭銆傝鏍囩鐨勪綔鐢ㄦ槸锛氶亶鍘嗘寚瀹氶泦鍚堬紝姣忛亶鍘嗕竴涓泦鍚堝厓绱狅紝鍗寵緭鍑烘爣绛句綋涓€娆°€?

鍥犱負璇ユ爣绛劇殑鏍囩浣撲笉涓虹┖锛岄厤缃鏍囩鏃舵寚瀹?body-content 涓?scriptless锛岃鏍囩鐨勯厤缃唬鐮佺墖娈靛涓嬩唬鐮佹墍绀猴細

<!-- 瀹氫箟绗笁涓爣绛?-->
<tag>
    <!-- 瀹氫箟鏍囩鍚?-->
    <name>iterator</name>
    <!-- 瀹氫箟鏍囩澶勭悊绫?-->
    <tag-class>lee.IteratorTag</tag-class>
    <!-- 瀹氫箟鏍囩浣撴敮鎸丣SP鑴氭湰 -->
    <body-content>scriptless</body-content>
    <!-- 閰嶇疆鏍囩灞炴€?collection -->
    <attribute>
        <name>collection</name> 
        <required>true</required>
        <fragment>true</fragment>
    </attribute>
    <!-- 閰嶇疆鏍囩灞炴€?item -->
    <attribute>
        <name>item</name> 
        <required>true</required>
        <fragment>true</fragment>
    </attribute>
</tag>
      

涓婇潰閰嶇疆鐗囨涓矖浣撳瓧浠g爜鎸囧畾璇ユ爣绛劇殑鏍囩浣撳彲浠ユ槸闈欐€?HTML 鍐呭锛屼篃鍙互鏄〃杈懼紡璇█銆?

涓轟簡娴嬭瘯鍦?JSP 椤甸潰涓嬌鐢ㄨ鏍囩鐨勬晥鏋滐紝鎴戜滑棣栧厛鎶婁竴涓?List 瀵矽薄璁劇疆鎴?page 鑼冨洿鐨勫睘鎬э紝鐒跺悗浣跨敤璇ユ爣绛炬潵杩唬杈撳嚭 List 闆嗗悎鐨勫叏閮ㄥ厓绱犮€?

JSP 椤甸潰浠g爜濡備笅锛?

<%@ page import="java.util.*"%>
<%@ page contentType="text/html; charset=GBK"%>
<!-- 瀵煎叆鏍囩搴擄紝鎸囧畾mytag鍓嶇紑鐨勬爣绛撅紝
    鐢県ttp://www.crazyit.org/mytaglib鐨勬爣绛懼簱澶勭悊 -->
<%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>
<html>
    <head>
        <title>甯︽爣绛句綋鐨勬爣绛?杩唬鍣ㄦ爣绛?lt;/title>
    </head>
    <body>
        <h2>甯︽爣绛句綋鐨勬爣绛?杩唬鍣ㄦ爣绛?lt;/h2>
        <hr>
        <%
        //鍒涘緩涓€涓狶ist瀵矽薄
        List<String> a = new ArrayList<String>();
        a.add("hello");
        a.add("world");
        a.add("java");
        //灏哃ist瀵矽薄鏀懼叆page鑼冨洿鍐?        pageContext.setAttribute("a" , a);
        %>
        <table  bgcolor="aaaadd" width="300">
        <!-- 浣跨敤杩唬鍣ㄦ爣绛撅紝瀵筧闆嗗悎杩涜杩唬 -->
        <mytag:iterator collection="a" item="item">
            <tr>
                <td></td>
            <tr>
        </mytag:iterator>
        </table>
    </body>
</html>
      

涓婇潰椤甸潰浠g爜涓矖浣撳瓧浠g爜鍗沖彲瀹炵幇閫氳繃 iterator 鏍囩鏉ラ亶鍘嗘寚瀹氶泦鍚堬紝娴忚璇ラ〉闈㈠嵆鐪嬪埌濡傚浘 3 鎵€绀虹晫闈細

鍥?3. 甯︽爣绛句綋鐨勬爣绛?

利用 SimpleTagSupport 開發自定義标簽

鍥?3 鏄劇ず浜嗕嬌鐢?iterator 鏍囩閬嶅巻闆嗗悎鍏冪礌鐨勬晥鏋滐紝浠?iteratorTag.jsp 椤甸潰鐨勪唬鐮佹潵鐪嬶紝浣跨敤 iterator 鏍囩閬嶅巻闆嗗悎鍏冪礌姣斾嬌鐢?JSP 鑴氭湰閬嶅巻闆嗗悎鍏冪礌瑕佷紭闆呭緱澶氾紝杩欏氨鏄嚜瀹氫箟鏍囩鐨勯瓍鍔涖€?

瀹為檯涓?JSTL 鏍囩搴撴彁渚涗簡涓€濂楀姛鑳介潪甯稿己澶ф爣绛撅紝渚嬪鏅€氱殑杈撳嚭鏍囩锛屽儚鎴戜滑鍒氬垰浠嬬粛鐨勮凱浠e櫒鏍囩锛岃繕鏈夌敤浜庡垎鏀垽鏂殑鏍囩绛夌瓑锛孞STL锛圝SP 鏍囧噯鏍囩搴擄級閮芥湁闈炲父瀹屽杽鐨勫疄鐜般€傞櫎姝や箣澶栵紝Apache 涓嬭繕鏈変竴濂?DisplayTags 鐨勬爣绛懼簱瀹炵幇锛屽仛寰椾篃闈炲父涓嶉敊

鍏充簬浣滆€?

鏉庡垰锛屼粠浜?Java EE 搴旂敤寮€鍙戣繎 10 骞淬€傛浘浠?LITEON 鍏徃鐨?J2EE 鎶€鏈富绠★紝璐熻矗璇ュ叕鍙哥殑浼佷笟淇℃伅鍖栧鈎鍙扮殑鏋舵瀯璁捐銆傛浘浠誨箍宸炵數淇°€佸箍涓滈緳娉夌鎶€绛夊叕鍙哥殑鎶€鏈煿璁暀甯堛€傜柉鐙?Java 鑱旂洘锛坔ttp://www.crazyit.org锛夌珯闀褲€傜柉鐙?Java 瀹炶钀ュ垱濮嬩漢锛岀柉鐙?Java 浣撶郴鍥句功浣滆€咃紝鏇句換涓滄柟鏍囧噯骞垮窞涓績杞歡鏁欏鎬葷洃锛屾浘鍏間換骞誇笢鎶€鏈笀鑼冨闄㈣绠楁満绉戝绯葷殑鍏艱亴鍓暀鎺堛€傚浗鍐呯煡鍚岻T鎶€鏈綔瀹訛紝宸插嚭鐗堛€婄柉鐙?Java 璁蹭箟銆嬨€併€婅交閲忕駭 Java EE 浼佷笟搴旂敤瀹炴垬銆嬨€併€婄柉鐙?Ajax 璁蹭箟銆嬨€併€奡truts 2.1 鏉冨▉鎸囧崡銆嬨€併€奟uby On Rails 鏁忔嵎寮€鍙戞渶浣沖疄璺點€嬬瓑钁椾綔銆?