JSP標記學習筆記 (轉)

worldblog發表於2007-12-12
JSP標記學習筆記 (轉)[@more@] 

標記學習筆記:namespace prefix = o ns = "urn:schemas--com::office" />

ginkou.fly  2002-9-18

1.  概述

1)  什麼是JSP標記

顧名思義,JSP標記就是在JSP中使用的標記。它類似於html語法中的標記,像head 、table 。透過在JSP檔案中引用它(就像使用html標記那樣),可以更方便的實現對 程式碼模組的重用。

2)  為什麼要使用JSP 標記技術(與javabean相比)

好處:

J JSP 標記可以處理JSP正文的內容,比如改變文字顯示樣式;而javabean不可以。

J JSP標記介面簡單,易於使用,也易於開發和維護。

壞處:

L JSP標記在進行設定時要比javabean複雜很多,體現在JSP標記庫描述檔案(*.tld)的上。

L JSP標記實現的功能遠不如javabean強大。

L 當前只要JSP1.1支援JSP標記,而JSP1.0和1.1都支援對Bean的使用。

2.  JSP標記的開發簡介。

JSP標記的開發需要編寫2種獨立的檔案。一種是定義標記功能的java類檔案,一種是將xml元素名稱(標記)對映到標記實現的標記庫描述符檔案。

⑴ 編寫標記處理類檔案

需要繼承javax..jsp.tagext.TagSupport類;

簡單示例:

//檔名ExampleTag.java

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

import java.io.*;

 public class ExampleTag extends TagSupport {

  //程式的起始點

    public int doStartTag() { 

  try {

    JspWriter out=pageContext.getOut();

    out.print(“Custom tag example”);

  }catch (IOException ioe) {

    System.out.println(“Error in ExampleTag : “ + ioe);

  }

    return(SKIP_BODY);

  標記包括的內容為空時返回SKIP_BODY,表示標記功能

  //已執行完成

  }

}

  編譯好的class檔案將位於的的特定位置。

⑵ 編寫標記庫描述符檔案

將標記名和其代表的功能實現聯絡在一起。

  簡單示例:

  <!--檔名:csajsp-.tld--&gt

  xml version=”1.0” encoding=”ISO-8859-1” ?>

/P>

PUBLIC “-//Sun Microsystem,Inc.//DTD JSP Tag Library 1.1//EN”

/dtds/-jsptaglibrary_1_1.dtd">>

//以上是標準的檔案頭

//以下是標籤庫描述

1.0 //Tag 庫的版本

1.1 //Jsp 庫的版本

csajsp//自定義標記字首名

//標記描述符檔案的uri,可以是空

My custom tag! //標記庫的描述資訊

//以下定義新標記

  example //自定義的標記名

  tags.ExampleTag//定位標籤處理類檔案

Simplest example//描述資訊

EMPTY // 不處理Jsp檔案正文內容

此檔案將配置在伺服器的特定位置

⑶ 使用以上自定義的標記

<!--檔名:simpleExample.jsp--&gt

nbsp;“- // //DTD HTML 4.0 Transitional //EN”>

//進行標記使用宣告

<example></example><title> <p><link rel="STYLESHEET" href="http://blog.itpub.net/10752043/viewspace-991816/%E2%80%9DJSP-styles.css%E2%80%9D</P"> </p><p>   TYPE=”text/css”></p> <p></p> <p></p>

/使用標記

這樣最終在在上輸出為

  Custom tag example

3.  深入的JSP標記開發

⑴ 新增標記屬性

在標記處理類中可以透過setAttribute(String value) 為jsp標記分配屬性,這樣標記處理程式根據獲取的屬性值來實現相關功能。

比如 private String message = “Default Message”;

public void setMessage(String message) {

  this.message=message;

  }

注意:屬性名message是小寫的,設定函式中的Message是大寫的。

◆與之相關的在tld檔案中需要在tag元素中新增如下元素

message //屬性名

false //屬性值是否必須提供。False表示不必,存在預設值。

true

//ture表示屬性值可以使用jsp,false表示禁

//止使用

◆對應jsp檔案中引用為:

⑵ 使用標記正文

 即是在標記中使用一些包含jsp指令碼元素、文字等的內容,這些內容由jsp引擎處理。

 形式如下:

  body(正文內容)

 在處理jsp標記的正文前,將會處理程式的doStartTag()方法,此時要在此方法中返回EVAL_BODY_INCLUDE 以表明包含有標記正文;處理完後,將會呼叫doEndTag()方法,此後要讓jsp引擎繼續處理後面的頁面,得返回EVAL_PAGE,否則返回SKIP_PAGE。

 ◆對應在tld檔案中需要在tag元素中新增如下元素

 

 …

 JSP //表明包含正文

 …

 

 另外:可以設定一些條件來判斷是否包含正文的,如下:

 public int doStartTag() {

    ServletRequest request = pageContext.getRequest();

  String deFlag = request .getParameter(“debug”);

  If ((debugFlag!=null) && (!debugFlag.equalsIgnoreCase(“false”))) {

    Return (EVAL_BODY_INCLUDE);

  }

  else {

    return(SKIP_BODY);

  }

  }

這樣只有在url尾部給出請求引數值debug = true,才會顯示標記正文的內容。這樣可以隱藏一些資訊。

⑶ 對標記正文進行處理

  jsp的標記可以對包含的正文進行處理(修改),然後再輸出。這需要標記處理類繼承BodyTagSupport類(TagSupport類的繼承)。這個類提供了2個重要的方法用於正文處理。

  → doAfterBody:預設執行的方法,在此方法中包含正文的處理過程。

→ getBodyContent:返回BodyContent型別的的,此物件包含了有關標記正文的資訊。

 BodyContent型別包含的重要方法:

→ getEnclosingWriter:返回JspWriter方法,輸出內容。

→ getString:返回包含全部jsp標記正文的字串。

注意:這裡和⑵中介紹的輸出jsp標記正文的方式不一樣。前者的輸出是先由jsp引擎解釋,這裡是在jsp標記處理程式中直接輸出到給瀏覽器。

另外,在doAferBody中返回SKIP_BODY,表示終止標記正文處理;若返回的是EVAL_BODY_TAG,將會再一次呼叫doAferBody方法,重新處理標記正文,直到返回SKIP_BODY為止。

示例:

→標記處理程式片:

//下面的程式片將呼叫一個filter方法,此方法用於把jsp正文中的字元< > “ & 分別用&it;  >  &guot;  &來代替。以使瀏覽器按字元原樣輸出,不進行解釋。

public class FillterTag extends BodyTagSupport {

  public  int doAfterBody() {

    BodyContent body=getBodyContent();

  String filtereody=ServletUtilities.filter(body.getString()); //將正文得到的字串過濾

  Try {

    JspWriter out=body.getEnclosingWriter();

out.print(filteredBody); //輸出過濾後的文字

}catch(IOException ioe) {

  System.out.println(“Error in FilterTag: “ + ioe);

}

return(SKIP_BODY); //終止jsp正文處理

  }

→標記符描述檔案片

  …

 

  filter

  tags.FilterTag

  JSP

 

  …

→jsp檔案片

 

  I love you!

  I love you!

 

  這樣,在瀏覽器中輸出的標記正文應當是

I love you!

I love you!

 而不是

 I love you!

 I love you!

  ⑶使用jsp巢狀標記。

  可以對多個JSP標記進行巢狀引用,這樣子標記就可以訪問和父標記的資料和方法。

   子標記訪問父標記需要使用BodyTagSupport類中的 findAccetorWithClass方法。注意它只能查詢臨近的父標記。

  假如在jsp檔案中如下的巢狀引用:

 

 

  true

  Condition was true

  Condition was false

 

  相應的標記處理程式片:

  →對於if標記,執行類如下:

  public class IfTag extends TagSupport {

    private boolean condition ;

  private Boolean handition = flase ;

  public void setCondition(Boolean condition) { //設定判斷條件的真假;condition子標

//記呼叫

    this.condition = condition ;

    hasCondition = true ;

  }

public Boolean getCondition() {  //獲取判斷條件的真假then 、else子標

//記呼叫

    return(condition) ;

  }

  public void setHasCondition(Boolean flag) {  //判斷if標記後是否存在條件,由

//condition子標記呼叫

    this.hasCondition = flag ;

  }

  public Boolean getHasCondition() {  //獲取是否存在判斷條件的資訊,由

//then、else標記呼叫

    return(hasCondition) ;

  }

  public int doStartTag() {

    return(EVAL_BODY_INCLUDE)  //包含子標記

  }

   }

 

→那麼對於condition等其它子標記的處理程式,需要獲取父標記處理程式物件:

IfTag  parent=(IfTag)  findAncestorWithClass(this,IfTag.class)

之後就可以操作父標記處理程式的相應方法。

示例:(對於condition標記)

public class IfConditionTag extends BodyTagSupport {

  ifTag parent = (IfTag)findAncestorWithClass(this,IfTag.class); //獲取父標記對應的物件

If (parent = = null) {

  Throw new JspTagException(“condition not ins it”);

}

return(EVAL_BODY_TAG);

}

 

public int doAfterBody() {

  ifTag parent = (IfTag) findAncestorWithClass(this , IfTag.class) ;

  String bodyString = getBodyContent() . getString() ;

  If (bodyString.trim().equals(“true”)) {

    Parent.setCondition(true)  //訪問父標記處理類中的方法

  }else {

    parent.setCondition(false) ;

  }

return(SKIP_BODY) ;

}

}

其餘標記類和此相似。

4.  小結

對於一些不太複雜和功能單一的邏輯描述,需要傳遞的引數要求不高時,使用JSP標記,要方便的多。對於大多數的商業邏輯應用,還是使用bean要好的多,也宜於servlet控制。

 

這個東東是俺學習 人郵 出的Servletlet與JSP核心技術》時隨手寫下的。裡面的程式還沒具體配置過。過段時間弄了再搞篇實驗體會吧。

有什麼值的商討的發e哦。ginkou@163.com


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991816/,如需轉載,請註明出處,否則將追究法律責任。

相關文章