JSP標記學習筆記 (轉)
標記學習筆記: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-->
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">>
//以上是標準的檔案頭
//以下是標籤庫描述
//以下定義新標記
此檔案將配置在伺服器的特定位置
⑶ 使用以上自定義的標記
<!--檔名:simpleExample.jsp-->
nbsp;“- // //DTD HTML 4.0 Transitional //EN”>
//進行標記使用宣告
TYPE=”text/css”>
/使用標記
這樣最終在在上輸出為
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元素中新增如下元素
//ture表示屬性值可以使用jsp,false表示禁
//止使用
◆對應jsp檔案中引用為:
⑵ 使用標記正文
即是在標記中使用一些包含jsp指令碼元素、文字等的內容,這些內容由jsp引擎處理。
形式如下:
在處理jsp標記的正文前,將會處理程式的doStartTag()方法,此時要在此方法中返回EVAL_BODY_INCLUDE 以表明包含有標記正文;處理完後,將會呼叫doEndTag()方法,此後要讓jsp引擎繼續處理後面的頁面,得返回EVAL_PAGE,否則返回SKIP_PAGE。
◆對應在tld檔案中需要在tag元素中新增如下元素
…
…
另外:可以設定一些條件來判斷是否包含正文的,如下:
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正文中的字元< > “ & 分別用⁢ > &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正文處理
}
→標記符描述檔案片
…
…
→jsp檔案片
I love you!
I love you!
這樣,在瀏覽器中輸出的標記正文應當是
I love you!
I love you!
而不是
I love you!
I love you!
⑶使用jsp巢狀標記。
可以對多個JSP標記進行巢狀引用,這樣子標記就可以訪問和父標記的資料和方法。
子標記訪問父標記需要使用BodyTagSupport類中的 findAccetorWithClass方法。注意它只能查詢臨近的父標記。
假如在jsp檔案中如下的巢狀引用:
相應的標記處理程式片:
→對於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 指標學習筆記指標筆記
- Java學習筆記-Day53 Servlet與JSPJava筆記ServletJS
- JSP筆記-sessionJS筆記Session
- 「學習筆記」線段樹標記永久化筆記
- repuest轉發學習筆記一筆記
- Pytest學習筆記6-自定義標記mark筆記
- JSP筆記-除錯JS筆記除錯
- numpy的學習筆記\pandas學習筆記筆記
- 學習韓順平細說Servlet/Jsp視訊筆記(一)ServletJS筆記
- Python——格式轉換的學習筆記Python筆記
- 10g NewFeatures學習筆記(轉)筆記
- 機器學習筆記——特徵標準化機器學習筆記特徵
- JSP筆記-生命週期JS筆記
- JSP筆記-隱式物件JS筆記物件
- 學習筆記筆記
- 彙編學習筆記之轉移指令筆記
- 依賴倒轉原則--學習筆記筆記
- 【記錄】MySQL 學習筆記MySql筆記
- [記錄] MySQL 學習筆記MySql筆記
- Android 學習筆記雜記Android筆記
- C++ 學習筆記(3):引用和指標C++筆記指標
- 資料庫學習筆記——20 使用遊標資料庫筆記
- Kubernetes學習筆記(二):Pod、標籤、註解筆記
- C++學習筆記 — STL標準模板庫C++筆記
- 肥桃的Java學習記錄22:JSPJavaJS
- JSP筆記-檔案上傳JS筆記
- JSP筆記-頁面重定向JS筆記
- JSP筆記-傳送郵件JS筆記
- 【學習筆記】數學筆記
- fastadmin學習筆記AST筆記
- JAVA學習筆記Java筆記
- FFT學習筆記FFT筆記
- HTML學習筆記HTML筆記
- wireshark學習筆記筆記
- LCA學習筆記筆記
- Tarjan 學習筆記筆記
- TensorFlow 學習筆記筆記
- PyTorch 學習筆記PyTorch筆記
- 字串學習筆記字串筆記