Servlet&JSP的那些事兒(十六)

來源:互聯網
上載者:User

上一篇我們討論了自訂標籤,也通過實現Tag介面完成了一個簡單的空標籤執行個體。本篇我們首先再通過一個執行個體實現一個帶屬性標籤。該執行個體實現一個<max>標籤,用於計算兩個數的最大值。在此就不再贅述項目建立的過程,如果有問題請參考前面內容。直接貼上代碼,主要代碼如下:

編寫MaxTag.java

package com.shan.tag;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class MaxTag extends TagSupport {private int numberA;private int numberB;public void setNumberA(int numberA) {this.numberA = numberA;}public void setNumberB(int numberB) {this.numberB = numberB;}public int doEndTag() throws JspException {//利用pageContext對象的getOut()方法得到JspWriter對象JspWriter out = pageContext.getOut();try {out.println(numberA > numberB ? numberA : numberB);} catch(IOException e) {System.out.println(e.toString());}return EVAL_PAGE;}public void release() {}}

運行語句編譯

javac -classpath D:\apache-tomcat-7.0.33\lib\jsp-api.jar;classes -d classes src\com\shan\tag\MaxTag.java  

在TLD中配置<max>標籤

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"        "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"><taglib>  <tlib-version>1.0</tlib-version>  <jsp-version>1.2</jsp-version>  <short-name>mytag</short-name>  <display-name>MyTag</display-name>  <description>My Tag library.</description>  <tag>    <name>max</name>    <tag-class>com.shan.tag.MaxTag</tag-class>    <body-content>empty</body-content>    <attribute>      <name>numberA</name>      <required>true</required>      <rtexprvalue>true</rtexprvalue>    </attribute>    <attribute>      <name>numberB</name>      <required>true</required>      <rtexprvalue>true</rtexprvalue>    </attribute>  </tag></taglib>

配置web.xml檔案

<?xml version='1.0' encoding='utf-8'?><web-app xmlns="http://java.sun.com/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  version="3.0"  metadata-complete="true"><jsp-config><taglib><taglib-uri>/mytag</taglib-uri><taglib-location>/WEB-INF/MyTaglib.tld</taglib-location></taglib></jsp-config></web-app>

編寫測試頁面

<%@ page contentType="text/html;charset=gb2312" %><%@ taglib uri="/mytag" prefix="mytag"%><%int numberA = Integer.parseInt(request.getParameter("numberA"));int numberB = Integer.parseInt(request.getParameter("numberB"));out.println(numberA);out.println(numberB);%>最大值為:<mytag:max numberA="<%=numberA %>" numberB="<%=numberB %>" />

在瀏覽器網址欄輸入http://localhost:8080/MaxTag/test.jsp?numberA=24&numberB=96,運行結果如下:

我們實現SimpleTag介面的標籤稱之為簡單標籤,實現其他介面或類的稱之為傳統標籤。傳統標籤開發中,需要根據標籤的功能來選擇所要實現的介面或要繼承的類,還要考慮方法的傳回值。為了簡化標籤的開發,我們使用簡單標籤來實現想要的功能。

SimpleTag介面

實現SimpleTag介面的標籤處理器的生命週期如下:

1)容器建立標籤處理器執行個體後,調用setJspContext()方法設定JspContext。如果該標籤沒被嵌套,則不會調用setParent()方法,如果被嵌套,調用setParent()方法設定它的父標籤。在此和傳統標籤處理不同,傳統標籤無論標籤是否嵌套,都會調用setParent()方法。
2)調用標籤處理器的setXXX()方法,設定標籤屬性,如果沒有屬性,則跳過。
3)如果存在標籤體,調用setJspBody(),設定標籤體,如果沒有標籤體,則跳過。
4)容器調用doTag()方法,在這個方法中,完成標籤處理器的主要邏輯。
注意,簡單標籤的標籤處理器並不會被緩衝而重複使用,每當遇到一個標籤時,容器就會建立一個標籤處理器執行個體,這和傳統標籤處理器不一樣。

為了簡化標籤的開發,javax.servlet.jsp.tagext包中還提供了SimpleTag介面的實作類別SimpleTagSupport。開發時,只需繼承該類,然後重寫doTag()方法即可。

在此我們就不再舉執行個體了。如果有興趣可以參照之前傳統標籤的開發編寫程式實現簡單標籤的開發。

轉載請註明出處:http://blog.csdn.net/iAm333

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.