您好,登錄后才能下訂單哦!
JSP標記學習筆記XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
ginkou.fly 2002-9-18
1. 概述
1) 什么是JSP標記
顧名思義,JSP標記就是在JSP文件中使用的標記。它類似于html語法中的標記,像head 、table 。通過在JSP文件中引用它(就像使用html標記那樣),可以更方便的實現對Java 代碼模塊的重用。
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.servlet.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-taglib.tld-->
xml version=”1.0” encoding=”ISO-8859-1” ?>
PUBLIC “-//Sun Microsystem,Inc.//DTD JSP Tag Library 1.1//EN”
J2EE/dtds/web-jsptaglibrary_1_1.dtd">http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd>
//以上是標準的文件頭
//以下是標簽庫描述
//以下定義新標記
此文件將配置在服務器的特定位置
⑶ 使用以上自定義的標記
<!--文件名:simpleExample.jsp-->
<%@ taglib uri = “csajsp-taglib.tld” prefix = “csajsp” %> //進行標記使用聲明
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 debugFlag = 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 filteredbody=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 haSCOndition = 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 inside 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核心技術》時隨手寫下的。里面的程序還沒具體配置過。過段時間弄了再搞篇實驗體會吧。
有什么值的商討的發eMail哦。ginkou@163.com
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。