JSP中的TagLib應用(4)--zt

來源:互聯網
上載者:User
js JSP中的TagLib應用(4)


作者:False / aspcn

----------------------------------------------------------------------

下面到了關鍵區段樂。 對tag進行處理。其實很多情況下我們是使用已經提供的taglib.

別人/公司已經做好了tag和處理部分,打好了包 我們需要做的只是在我們的jsp中去應用.

但是當我們自己做個taglib時, 就需要編寫這部分tag handler了.

這裡只針對上面檔案裡提到的insert tag,其他的為了避免重複,就不一一說明了

==================== InsertTag.java==============================
/*

* $Id: InsertTag.java,v 1.13 2000/03/04 02:54:57 brydon Exp $

* Copyright 1999 Sun Microsystems, Inc. All rights reserved.

* Copyright 1999 Sun Microsystems, Inc. Tous droits réservés.

*/



package com.sun.estore.taglib;



import javax.servlet.jsp.JspTagException;

import javax.servlet.jsp.tagext.TagSupport;



import com.sun.estore.util.Debug;



/**

* This class is an easy interface to the JSP template or other

* text that needs to be inserted.

* @author Greg Murray

*/



public class InsertTag extends TagSupport {



private boolean directInclude = false;

private String parameter = null;

private String templateName = null;

private Template template = null;

private TemplateParameter templateParam = null;



/**

* default constructor

*/

public InsertTag() {

super();

}



public void setTemplate(String templateName){

this.templateName = templateName;

}



public void setParameter(String parameter){

this.parameter = parameter;

}



public int doStartTag() {

try{

if (templateName != null){

template = (Template)pageContext.getRequest().getAttribute("template");

}

} catch (NullPointerException e){

Debug.println("Error extracting template from session: " + e);

}



if (parameter != null && template != null) templateParam = (TemplateParameter)template.getParam(parameter);

if (templateParam != null) directInclude = templateParam.isDirect();

return SKIP_BODY;

}



public int doEndTag() throws JspTagException {

try{

pageContext.getOut().flush();

} catch (Exception e){

// do nothing

}

try {

if (directInclude && templateParam != null) {

pageContext.getOut().println(templateParam.getValue());

} else if (templateParam != null) {

if (templateParam.getValue() != null) pageContext.getRequest().getRequestDispatcher(templateParam.getValue()).include(pageContext.getRequest(), pageContext.getResponse());

}

} catch (Throwable ex) {

ex.printStackTrace();

}

return EVAL_PAGE;

}

}
可以看到。InsertTag.java繼承了javax.servlet.jsp.tagext.TagSupport類. 因為在TagSupport中定義了一些介面.
  我們在處理自訂的tag時, 對父類的doStartTag() 和doEndTag() 要進行重載,如果在tld檔案中定義了tag的屬性, 就需要在tag handler裡對每個屬性定義相應的setxxx/getxxx方法.

在doStartTag()中是從Template類所定義的Hashtable中取得TemplateParameter對象.

在doEndTag()中

pageContext.getRequest().getRequestDispatcher(templateParam.getValue()).include(pageContext.getRequest(), pageContext.getResponse());

這是在頁面裡包含通過jsp頁的上下文返回通過tag的屬性值指定的資來源物件(RequestDispatcher)所產生的內容..

doStartTag()和doEndTag()傳回值是在Tag Interface裡定義的靜態int

SKIP_BODY隱含0

Skip body evaluation. Valid return value for doStartTag and doAfterBody. 跳過對body的處理。

就是跳過了開始和結束標籤之間的代碼。



EVAL_BODY_INCLUDE 隱含1

Evaluate body into existing out stream. Valid return value for doStartTag.

This is an illegal return value for doStartTag when the class implements BodyTag,

since BodyTag implies the creation of a new BodyContent.

將body的內容輸出到存在的輸出資料流中。包括是jsp代碼,也可以被輸出

SKIP_PAGE 隱含5

Skip the rest of the page. Valid return value for doEndTag.

忽略剩下的頁面。

EVAL_PAGE 隱含6

Continue evaluating the page. Valid return value for doEndTag().

繼續執行下面的頁

在這個類裡還有對其他類的引用,我就不列出來了. 各位可以自己去研究.

自訂標籤(Custom tags)實現了 javax.servlet.jsp.tagext.Tag or javax.servlet.jsp.tagext.BodyTag

interface. 應用javax.servlet.jsp.JspWriter 來輸出.


TagSupport class 提供了對interface Tag的隱含實現. 序列化編髮資料.

public class TagSupport extends java.lang.Object implements Tag, java.io.Serializable


BodyTagSupport class提供了對interface BodyTag的隱含實現.繼承TagSupport

public class BodyTagSupport extendsTagSupport implements BodyTag



我們在編寫tag handler時需要繼承TagSupport類或BodyTagSupport類,然後重載doStartTag()和doEndTag().

還可以再進一步分離.將具體實現放到bean裡

這些自訂標籤的類所應放的位置應該在WEB-INF/classes或WEB-INF/lib

最後將custom tag libraries 打包成.war檔案.關於.war檔案,如下圖所示給出了資源結構圖。




通過部署描述符來控制映射。

部署描述符是個XML檔案。詳細的請詳見有關文檔資料。這裡只說明

部署TagLib的部分。

JSP custom tag libraries (optional)

Specifies URL for locating Tag Library Descriptor





uri

path







/**************自訂TagLib例子: JSP page *******************

………








*******************************************************/

檔案位置如下:




這個例子很簡單, 只是作為練習使用.你也可以自己進行擴充,多練習幾種處理方法.比方說標籤帶有屬性,

標籤帶有內容, 使用bean處理邏輯等等

關於將這些檔案打包成.war檔案.這裡就不詳細說明了.請根據你使用的application server情況自己完成吧. 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.