jsp標簽小結(jié)

          Posted on 2006-07-06 15:05 weibogao 閱讀(646) 評論(0)  編輯  收藏 所屬分類: software development
          JSP自定義標簽試驗原文:兔八哥筆記3:JSP自定義標簽試驗
          ?

          一、概述

          ?????? JSP中有一塊重要的技術(shù):自定義標簽(Custom Tag),最近這幾天在學習Struts的時候發(fā)現(xiàn)Struts中使用了很多自定義標簽,如htmlbean等。所以我就做了個簡單的試驗,學習一下這種技術(shù)

          ?????? 首先介紹一下這種技術(shù)吧!

          1.優(yōu)點:

          取代了JSP中的Java程序,并且可以重復使用,方便不熟悉Java編程的網(wǎng)頁設(shè)計人員。

          2開發(fā)流程:

          (1)?????? 編寫JSP,在JSP中使用自定義標簽。

          (2)?????? web.xml中指定JSP中使用的標簽的.tld(標簽庫描述文件)文件的位置。

          (3)?????? .tld文件中指定標簽使用的類。

          3. 自定義標簽的分類:

          (1)?????? 簡單標簽:如< mytaghelloworld/>

          (2)?????? 帶屬性標簽:如<imytagcheckinput dbname = “<myBean.getDBName()>”/>

          (3)?????? 帶標簽體的標簽:

          在自定義標簽的起始和結(jié)束標簽之間的部分為標簽體(Body)Body的內(nèi)容可以是JSP中的標準標簽,也可以是HTML、腳本語言或其他的自定義標簽。

          <mytagcheckinput dbname = “<myBean.getDBName()>”>

          ????? <mytag:log message=”Table Name”>

          <mytagcheckinput />

          (4)?????? 可以被s cript使用的標簽:

          定義了idtype屬性的標簽可以被標簽后面的s criptlet使用。

          <mytagconnection id = “oraDB” type = “DataSource” name = “Oracle”>

          <%oraDB.getConnection(); %>

          ?

          4.接口及其他

          實際上,自定義標簽的處理類實現(xiàn)了Tag Handler對象。JSP技術(shù)javax.servlet.jsp.tagext中提供了多個Tag Handler接口,JSP1.2中定義了TagBodyTagIterationTag接口,在JSP2.0中新增了SimpleTag接口。JSP還提供了上述接口的實現(xiàn)類TagSupportBodyTagSupportSimpleTagSupportSimpleTagSupport只在JSP2.0中才有)。BodyTagSupport實現(xiàn)了BodyTagTagIterationTag接口。

          ?

          接口及其方法

          Tag接口

          方法

          SimpleTag

          dotage

          Tag

          doStartTag,doEndTag,release

          IterationTag

          doStartTag,doAfterTag,release

          BodyTag

          doStartTag,doEndTag,release,doInitBody,doAfterBody

          ?

          下表引自SunJSP在線教程。

          Tag Handler Methods?

          Tag Handler Type

          Methods

          Simple

          doStartTag, doEndTag, release

          Attributes

          doStartTag, doEndTag, set/getAttribute1...N, release

          Body, Evaluation and No Interaction

          doStartTag, doEndTag, release

          Body, Iterative Evaluation

          doStartTag, doAfterBody, doEndTag, release

          Body, Interaction

          doStartTag, doEndTag, release, doInitBody, doAfterBody, release

          ?

          下表中的EVALevaluate的縮寫,意思是:評價, 估計, ...的值,在下列的返回值中的意思是執(zhí)行。

          返回值

          意義

          SKIP_BODY

          表示不用處理標簽體,直接調(diào)用doEndTag()方法。

          SKIP_PAGE

          忽略標簽后面的JSP內(nèi)容。

          EVAL_PAGE

          處理標簽后,繼續(xù)處理JSP后面的內(nèi)容。

          EVAL_BODY_BUFFERED

          表示需要處理標簽體。

          EVAL_BODY_INCLUDE

          表示需要處理標簽體,但繞過setBodyContent()doInitBody()方法

          EVAL_BODY_AGAIN

          對標簽體循環(huán)處理。

          ?

          具體用法可以查看其他參考資料。

          SunJava教程相關(guān)部分:java.sun.com/webservices/docs/1.0/tutorial/doc/JSPTags.html">http://java.sun.com/webservices/docs/1.0/tutorial/doc/JSPTags.html

          ?

          ?

          二、實驗

          1.試驗介紹

          下面的實驗就是基于上述開發(fā)流程開發(fā)的。

          1)在JSP中指定tagliburi<%@ taglib uri="/helloworld" prefix="mytag" %>

          2)在web.xml中配置tag-location:

          <taglib>

          ??????????? <taglib-uri>/helloworld</taglib-uri>

          ??????????? <taglib-location>/WEB-INF/helloworld.tld</taglib-location>

          ?????? </taglib>

          ?????? 3)在tag-location中指定的.tld文件中定義實現(xiàn)標簽的處理類:

          ?? <short-name>mytag</short-name>

          ?? <tag>

          ????? <name>helloworld</name>

          ????? <tag-class>mytag.HelloWorldTag</tag-class>

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

          ? </tag>

          (4)執(zhí)行處理類mytag.HelloWorldTagdoStartTag和doEndTag方法,然后將結(jié)果輸入到JSP中,和JSP中的內(nèi)容一起輸出。實際上自定義標簽和JSP中的其他的內(nèi)容被WebServer一起編譯成servlet。

          ?

          ?

          2. 完成后的試驗的目錄結(jié)構(gòu)

          應用myjsp放在Tomcatwebapps下。

          myjsp中包含J2EE標準目錄結(jié)構(gòu):WEB-INFhello.jspWEB-INF中包含子目錄classeslibweb.xml,tld文件可以放在WEB-INF下,也可以放在WEB-INF的子目錄下。

          ?

          ?

          3.開始實驗

          31編寫JSP

          ?

          < !—hello.jsp源碼 -- >

          <%@ page contentType="text/html; charset=GBK" %>

          <%@ taglib uri="/helloworld" prefix="mytag" %>

          <html>

          <head>

          <title>

          jsp1

          </title>

          </head>

          <body bgcolor="#ffffc0">

          <h1>

          下面顯示的是自定義標簽中的內(nèi)容

          </h1>

          ?

          <br><br>

          <mytag:helloworld></mytag:helloworld>

          ?

          <br>

          ?

          </form>

          </body>

          </html>

          ?

          32.編寫web.xml
          < !—web.xml源碼 -- >

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

          <!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Williams (501) -->

          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

          "http://java.sun.com/dtd/web-app_2_3.dtd">

          <web-app>

          <taglib>

          ??????? <taglib-uri>/helloworld</taglib-uri>

          ??????? <taglib-location>/WEB-INF/helloworld.tld</taglib-location>

          </taglib>

          </web-app>


          33? 編寫tld文件

          ?

          < !—helloworld.tld源碼 -- >

          <?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">

          <taglib>

          ?? <tlib-version>1.0</tlib-version>

          ?? <jsp-version>1.2</jsp-version>

          ?? <short-name>mytag</short-name>

          ?? <tag>

          ?????? <name>helloworld</name>

          ?????? <tag-class>mytag.HelloWorldTag</tag-class>

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

          ?? </tag>

          </taglib>

          ?以下為jsp2.0
          <?xml version="1.0" encoding="UTF-8" ?>

          <taglib version="2.0">
          ?<description>test</description>
          ?<tlib-version>1.0</tlib-version>

          ?<tag>
          ??<description>hello world</description>
          ??<name>title</name>
          ??<body-content>EMPTY</body-content>
          ??<tag-class>com.test.tag.helloworld</tag-class>
          ??<attribute>
          ???<name>title</name>
          ???<required>true</required>
          ???<rtexprvalue>true</rtexprvalue>
          ??</attribute>

          ?</tag>
          </taglib>

          34? 編寫標簽實現(xiàn)類

          ?

          < !—標簽的實現(xiàn)類HelloWorldTag.class源碼 -- >

          package mytag;???

          ?

          import java.io.IOException;

          import javax.servlet.jsp.*;

          import javax.servlet.jsp.tagext.*;

          ?

          public class HelloWorldTag extends TagSupport {????

          ? public HelloWorldTag() {

          ? }

          ? public int doStartTag() throws JspTagException{

          ??? return EVAL_BODY_INCLUDE;

          ? }

          ? public int doEndTag() throws JspTagException{

          ??? try {

          ????? pageContext.getOut().write("Hello World");

          ??? }

          ??? catch (IOException ex) {

          ????? throw new JspTagException("錯誤");

          ??? }

          ??? return EVAL_PAGE;

          ? }

          }

          ?

          35? 執(zhí)行效果

          部署到TomcatWebApps目錄下,啟動Tomcat,輸入:jsp/hello.jsp">http://localhost:8080/myjsp/hello.jsp

          ?

          Hello World”就是我們定義的標簽部分的處理類輸出的結(jié)果。

          posts - 41, comments - 7, trackbacks - 0, articles - 0

          Copyright © weibogao

          主站蜘蛛池模板: 玉屏| 苏尼特左旗| 余庆县| 岳普湖县| 健康| 迁西县| 邹城市| 峨眉山市| 壶关县| 阿拉善右旗| 榆树市| 遵义县| 防城港市| 邯郸市| 综艺| 囊谦县| 凌云县| 共和县| 读书| 疏勒县| 长寿区| 建德市| 伊春市| 康马县| 浮梁县| 平山县| 凤山县| 辽宁省| 长垣县| 景宁| 绍兴市| 都江堰市| 汾阳市| 乐清市| 台前县| 娄底市| 开平市| 新蔡县| 北流市| 岑溪市| 绵竹市|