標籤:
javaweb學習總結(二十六)——jsp簡單標籤標籤庫開發(二)一、JspFragment類介紹
javax.servlet.jsp.tagext.JspFragment類是在JSP2.0中定義的,它的執行個體對象代表JSP頁面中的一段符合JSP文法規範的JSP片段,這段JSP片段中不能包含JSP指令碼元素。
WEB容器在處理簡單標籤的標籤體時,會把標籤體內容用一個JspFragment對象表示,並調用標籤處理器對象的setJspBody方法把JspFragment對象傳遞給標籤處理器對象。JspFragment類中只定義了兩個方法,如下所示:
getJspContext方法
用於返回代表調用頁面的JspContext對象.
public abstract void invoke(java.io.Writer out)
用於執行JspFragment對象所代表的JSP程式碼片段,參數out用於指定將JspFragment對象的執行結果寫入到哪個輸出資料流對象中,如果 傳遞給參數out的值為null,則將執行結果寫入到JspContext.getOut()方法返回的輸出資料流對象中。(簡而言之,可以理解為寫給瀏覽器)
1.1、invoke方法詳解
JspFragment.invoke方法是JspFragment最重要的方法,利用這個方法可以控制是否執行和輸出標籤體的內容、是否迭代執列標籤體的內容或對標籤體的執行結果進行修改後再輸出。例如:
在標籤處理器中如果沒有調用JspFragment.invoke方法,其結果就相當於忽略標籤體內容;
在標籤處理器中重複調用JspFragment.invoke方法,則標籤體內容將會被重複執行;
若想在標籤處理器中修改標籤體內容,只需在調用invoke方法時指定一個可取出結果資料的輸出資料流對象(例如StringWriter),讓標籤體的執行結果輸出到該輸出資料流對象中,然後從該輸出資料流對象中取出資料進行修改後再輸出到目標裝置,即可達到修改標籤體的目的。
二、開發帶屬性的標籤
自訂標籤可以定義一個或多個屬性,這樣,在JSP頁面中應用自訂標籤時就可以設定這些屬性的值,通過這些屬性為標籤處理器傳遞參數資訊,從而提高標籤的靈活性和複用性。
要想讓一個自訂標籤具有屬性,通常需要完成兩個任務:
- 在標籤處理器中編寫每個屬性對應的setter方法
- 在TLD檔案中描術標籤的屬性
為自訂標籤定義屬性時,每個屬性都必須按照JavaBean的屬性命名方式,在標籤處理器中定義屬性名稱對應的setter方法,用來接收 JSP頁面調用自訂標籤時傳遞進來的屬性值。 例如屬性url,在標籤處理器類中就要定義相應的setUrl(String url)方法。
在標籤處理器中定義相應的set方法後,JSP引擎在解析執行開始標籤前,也就是調用doStartTag方法前,會調用set屬性方法,為標籤設定屬性。
2.1、開發帶屬性的標籤範例
範例1:通過標籤的屬性控制標籤體的執行次數
範例程式碼如下:
SimpleTagDemo5.java
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import javax.servlet.jsp.JspException; 5 import javax.servlet.jsp.tagext.SimpleTagSupport; 6 7 /** 8 * @author gacl 9 * SimpleTagSupport類實現了SimpleTag介面,10 * SampleTagDemo5類繼承SimpleTagSupport11 * 通過標籤的屬性控制標籤體的執行次數12 */13 public class SimpleTagDemo5 extends SimpleTagSupport {14 15 /**16 * 定義標籤的屬性17 */18 private int count;19 20 /**count屬性對應的set方法21 * @param count22 */23 public void setCount(int count) {24 this.count = count;25 }26 27 /* 簡單標籤使用這個方法就可以完成所有的商務邏輯28 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()29 * 重寫doTag方法,通過標籤的屬性控制標籤體的執行次數30 */31 @Override32 public void doTag() throws JspException, IOException {33 for (int i = 0; i < count; i++) {34 this.getJspBody().invoke(null);35 }36 }37 38 }
在WEB-INF目錄下的tld檔案中添加對該標籤的描述,如下所示:
1 <tag> 2 <!-- 標籤名 --> 3 <name>demo5</name> 4 <!-- 標籤處理器類--> 5 <tag-class>me.gacl.web.simpletag.SimpleTagDemo5</tag-class> 6 <!-- 標籤體允許的內容--> 7 <body-content>scriptless</body-content> 8 9 <!-- 標籤的屬性描述 -->10 <attribute>11 <description>描述標籤的count屬性</description>12 <!-- 標籤的count屬性 -->13 <name>count</name>14 <required>true</required>15 <!-- rtexprvalue用來指示標籤的屬性值是否可以是一個運算式,16 一般設定為true,true就表示允許標籤的屬性值可以是一個運算式-->17 <rtexprvalue>true</rtexprvalue>18 </attribute>19 </tag>
在jsp頁面引入標籤庫並使用自訂標籤
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%--在jsp頁面中匯入自訂標籤庫 --%> 3 <%--<%@taglib uri="/simpletag" prefix="gacl" %>--%> 4 <%--在jsp頁面中也可以使用這種方式匯入標籤庫,直接把uri設定成標籤庫的tld檔案所在目錄 --%> 5 <%@taglib uri="/WEB-INF/simpletag.tld" prefix="gacl"%> 6 <!DOCTYPE HTML> 7 <html> 8 <head> 9 <title>通過標籤的屬性控制標籤體的執行次數</title>10 </head>11 12 <body>13 <%--在jsp頁面中使用自訂標籤,標籤有一個count屬性 --%>14 <gacl:demo5 count="2">15 <h1>孤傲蒼狼</h1>16 </gacl:demo5>17 </body>18 </html>
運行效果如下:
如果標籤的屬性值是8種基礎資料型別 (Elementary Data Type),那麼在JSP頁面在傳遞字串時,JSP引擎會自動轉換成相應的類型,但如果標籤的屬性值是複合資料型別,那麼JSP引擎是無法自動轉換的
範例2:標籤接收的屬性值是一個複合資料型別,該如何給標籤的屬性賦值
範例程式碼如下:
SimpleTagDemo6.java
1 package me.gacl.web.simpletag; 2 3 import java.io.IOException; 4 import java.util.Date; 5 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.tagext.SimpleTagSupport; 8 9 /**10 * @author gacl11 * SimpleTagSupport類實現了SimpleTag介面,12 * SampleTagDemo6類繼承SimpleTagSupport13 * 標籤的屬性說明14 */15 public class SimpleTagDemo6 extends SimpleTagSupport {16 17 /**18 * 定義標籤的屬性19 */20 private Date date;21 22 /**date屬性對應的set方法23 * @param date24 */25 public void setDate(Date date) {26 this.date = date;27 }28 29 /* 簡單標籤使用這個方法就可以完成所有的商務邏輯30 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()31 * 重寫doTag方法,輸出date屬性值32 */33 @Override34 public void doTag() throws JspException, IOException {35 this.getJspContext().getOut().write(date.toLocaleString());36 }37 }
在WEB-INF目錄下的tld檔案中添加對該標籤的描述,如下所示:
1 <tag> 2 <!-- 標籤名 --> 3 <name>demo6</name> 4 <!-- 標籤處理器類--> 5 <tag-class>me.gacl.web.simpletag.SimpleTagDemo6</tag-class> 6 <!-- 標籤體允許的內容--> 7 <body-content>empty</body-content> 8 9 <!-- 標籤的屬性描述 -->10 <attribute>11 <description>描述標籤的date屬性</description>12 <!-- 標籤的date屬性,複合資料型別 -->13 <name>date</name>14 <required>true</required>15 <!-- rtexprvalue用來指示標籤的屬性值是否可以是一個運算式,16 一般設定為true,true就表示允許標籤的屬性值可以是一個運算式-->17 <rtexprvalue>true</rtexprvalue>18 </attribute>19 </tag>
在jsp頁面引入標籤庫並使用自訂標籤
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%--在jsp頁面中匯入自訂標籤庫 --%> 3 <%--<%@taglib uri="/simpletag" prefix="gacl" %>--%> 4 <%--在jsp頁面中也可以使用這種方式匯入標籤庫,直接把uri設定成標籤庫的tld檔案所在目錄 --%> 5 <%@taglib uri="/WEB-INF/simpletag.tld" prefix="gacl"%> 6 <!DOCTYPE HTML> 7 <html> 8 <head> 9 <title>如果標籤接收的屬性值是一個複合資料型別,該如何給標籤的屬性賦值</title>10 </head>11 12 <body>13 <%--14 在jsp頁面中使用自訂標籤,標籤有一個date屬性 ,是一個複合資料型別15 如果標籤的屬性值是8種基礎資料型別 (Elementary Data Type),那麼在JSP頁面在傳遞字串時,JSP引擎會自動轉換成相應的類型16 但如果標籤的屬性值是複合資料型別,那麼JSP引擎是無法自動轉換的,17 這裡將一個字串賦值給demo6標籤的date屬性,在運列標籤時就會出現如下錯誤:18 Unable to convert string "1988-05-07" to class "java.util.Date" for attribute "date": 19 Property Editor not registered with the PropertyEditorManager20 <gacl:demo6 date="1988-05-07">21 </gacl:demo6>22 --%>23 <%--如果一定要給標籤的複合屬性賦值,那麼可以採用運算式的方式給複合屬性賦值,如下所示: --%>24 25 <%26 Date d = new Date();27 request.setAttribute("date", d);28 %>29 30 <gacl:demo6 date="${date}"/>31 <hr/>32 <gacl:demo6 date="<%=new Date()%>"/>33 </body>34 </html>
運行效果如下:
2.1、tld檔案中用於描述標籤屬性的<attribute>元素說明
<tag>元素的<attribute>子項目用於描述自訂標籤的一個屬性,自訂標籤所具有的每個屬性都要對應一個<attribute>元素
例如:
1 <tag> 2 <!-- 標籤名 --> 3 <name>demo5</name> 4 <!-- 標籤處理器類--> 5 <tag-class>me.gacl.web.simpletag.SimpleTagDemo5</tag-class> 6 <!-- 標籤體允許的內容--> 7 <body-content>scriptless</body-content> 8 9 <!-- 標籤的屬性描述 -->10 <attribute>11 <description>描述標籤的count屬性</description>12 <!-- 標籤的count屬性 -->13 <name>count</name>14 <required>true</required>15 <!-- rtexprvalue用來指示標籤的屬性值是否可以是一個運算式,16 一般設定為true,true就表示允許標籤的屬性值可以是一個運算式-->17 <rtexprvalue>true</rtexprvalue>18 </attribute>19 </tag>
<attribute>元素的子項目說明:
到此,簡單標籤的開發技術就算是全部講完了,在下一篇博文中會編寫一些自訂標籤的案例來加深自定標籤技術的學習和理解。
javaweb學習總結(二十六)——jsp簡單標籤標籤庫開發(二)