亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP自定義標簽簡單入門教程

2024-09-05 00:22:28
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了JSP自定義標簽簡單入門教程,感興趣的小伙伴們可以參考一下
 

在sun官方文檔上有下面這樣一段話。

官方文檔聲明

public interface SimpleTagextends JspTagInterface for defining Simple Tag Handlers.Simple Tag Handlers differ from Classic Tag Handlers in that instead of supporting doStartTag() and doEndTag(), the SimpleTag interface provides a simple doTag() method, which is called once and only once for any given tag invocation. All tag logic, iteration, body evaluations, etc. are to be performed in this single method. Thus, simple tag handlers have the equivalent power of BodyTag, but with a much simpler lifecycle and interface.To support body content, the setJspBody() method is provided. The container invokes the setJspBody() method with a JspFragment object encapsulating the body of the tag. The tag handler implementation can call invoke() on that fragment to evaluate the body as many times as it needs.A SimpleTag handler must have a public no-args constructor. Most SimpleTag handlers should extend SimpleTagSupport.

生存周期及調用流程

The following is a non-normative, brief overview of the SimpleTag lifecycle. Refer to the JSP Specification for details.

A new tag handler instance is created each time by the container by calling the provided zero-args constructor. Unlike classic tag handlers, simple tag handlers are never cached and reused by the JSP container.
The setJspContext() and setParent() methods are called by the container. The setParent() method is only called if the element is nested within another tag invocation. 
The setters for each attribute defined for this tag are called by the container.
If a body exists, the setJspBody() method is called by the container to set the body of this tag, as a JspFragment. If the action element is empty in the page, this method is not called at all.
The doTag() method is called by the container. All tag logic, iteration, body evaluations, etc. occur in this method.
The doTag() method returns and all variables are synchronized.

簡單標簽使用小案例

必知必會:簡單標簽也是一個標簽,所以聲明的過程也Tag的一樣,同樣是三步。

1、建繼承SimpleTag類的實現類,重寫doTag方法
2、tld文件中進行嚴格的聲明
3、jsp頁面中taglib的命名空間及標簽前綴的聲明,然后進行調用自定義的簡單標簽

第一步:創建實現類:

package web.simpletag;import java.io.IOException;import java.io.StringWriter;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.SkipPageException;import javax.servlet.jsp.tagext.JspFragment;import javax.servlet.jsp.tagext.SimpleTagSupport;/** * 控制標簽體是否執行 * @author Summer * */public class BodyController extends SimpleTagSupport {  static{    /*     * 簡單標簽整體的執行流程如下:     * 1.瀏覽器向web服務器發送請求,然后web服務器調用servlet(jsp)     * 2.complier解釋器進行初始化工作,先是調用setJspContext方法,將pageContext對象傳遞進去     * 3.然后是看看此標簽的父標簽,即setParent方法     * 4.再就是調用doTag方法了吧?但是要知道doTag內部會使用JspFragment對象,所以就必須先得到它,因此應該是調用setJspBody(JspFragment jspBody)方法     * 5.最后是調用doTag 方法,執行相關的代碼邏輯     */  }  /**   * 簡單標簽可以使用這一個方法實現所有的業務邏輯   */  @Override  public void doTag() throws JspException, IOException {    //代表標簽體的對象    JspFragment fragment = this.getJspBody();    //fragment.invoke(null);是指將標簽中的內容寫給誰,null代表瀏覽器    //1.修改標簽體的內容//   fragment.invoke(null);    //2.控制標簽體內容的重復輸出//   for(int i=1;i<=5;i++){//     fragment.invoke(null);//設置為null,默認為向瀏覽器輸出//   }    //3.修改標簽體的內容    PageContext context = (PageContext) fragment.getJspContext();    StringWriter writer = new StringWriter();    fragment.invoke(writer);    String content = writer.getBuffer().toString();    this.getJspContext().getOut().write(content.toUpperCase());    //4.控制jsp頁面的執行與否,只需要掌握一個原理即可    /*     * SkipPageException - If the page that (either directly or indirectly) invoked this      * tag is to cease evaluation. A Simple Tag Handler generated from a tag     * file must throw this exception if an invoked Classic Tag Handler     *  returned SKIP_PAGE or if an invoked Simple Tag Handler threw     *  SkipPageException or if an invoked Jsp Fragment threw a      *  SkipPageException.     *///   throw new SkipPageException();  }}

在tld文件中進行相關約束項的配置:

<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"  version="2.0">  <description>JSTL 1.1 XML library</description>  <display-name>JSTL XML</display-name>  <tlib-version>1.1</tlib-version>  <short-name>x</short-name>  <uri>/simplesummer</uri>  <!-- 控制標簽體內容的的簡單標簽的自定義標簽 -->  <tag>    <name>BodyController</name>    <tag-class>web.simpletag.BodyController</tag-class>    <body-content>scriptless</body-content>  </tag></taglib>

第三步:在jsp頁面中進行聲明然后調用:

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%><%@taglib uri="/simplesummer" prefix="summer"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>用SimpleTag接口實現的控制標簽體內容是否執行的測試頁面</title></head><body>  <summer:BodyController>Summer</summer:BodyController></body></html>

總結:
簡單標簽可以替代BodyTag接口完成同樣的操作,但是有更加的簡單和輕便
簡單標簽lifeCycle邏輯清晰,調用規則明確
使用相關流對象就可以完成對標簽體的操控maniplate

以上就是本文的全部內容,希望對大家的學習有所幫助。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
麻豆乱码国产一区二区三区| 国产一区二区三区视频免费| 国产精品丝袜高跟| 亚洲精品久久久久久久久久久久| 久久久久久久久久久久久久久久久久av| 欧美亚洲视频在线观看| 日韩美女主播视频| 国产在线日韩在线| 精品国产乱码久久久久久虫虫漫画| 久久午夜a级毛片| 亚洲黄页网在线观看| 色小说视频一区| 久久久久久国产三级电影| 2019中文字幕免费视频| 成人av电影天堂| 91视频国产高清| 欧美一级大片在线免费观看| 97视频在线观看视频免费视频| 欧美与欧洲交xxxx免费观看| 精品久久久久久久久久久久| 91成人国产在线观看| 国产成人综合一区二区三区| 午夜精品国产精品大乳美女| 久久九九国产精品怡红院| 国产99久久精品一区二区 夜夜躁日日躁| 热久久免费视频精品| 欧美亚洲另类制服自拍| 国产美女久久精品香蕉69| 亚洲深夜福利在线| 亚洲少妇中文在线| 欧美日韩午夜视频在线观看| 欧美精品www| 国产亚洲欧美日韩美女| 欧美在线一区二区三区四| 日韩在线观看免费网站| 亚洲男人的天堂在线| 日本一区二区在线免费播放| 97国产精品视频人人做人人爱| 国产精品青青在线观看爽香蕉| 日本精品久久中文字幕佐佐木| 亚洲色图偷窥自拍| 日韩经典中文字幕| 久久综合久久美利坚合众国| 91精品国产99久久久久久| 97精品视频在线观看| 欧美性高潮床叫视频| 久久亚洲精品中文字幕冲田杏梨| 欧美精品手机在线| 在线观看欧美成人| 日韩精品免费视频| 久久久中精品2020中文| 久久亚洲欧美日韩精品专区| 欧美高清无遮挡| 亚洲欧美www| 亚洲精品久久久一区二区三区| 欧美日韩国产综合新一区| 国产精自产拍久久久久久| 成人精品视频久久久久| 97成人精品视频在线观看| 国产拍精品一二三| 欧美一级在线播放| 成人激情视频小说免费下载| 国产一区二区日韩| 欧美大肥婆大肥bbbbb| www.久久草.com| 在线观看久久久久久| 亚洲综合精品伊人久久| 亚洲欧美另类人妖| 久久久久久伊人| 国产一区二区激情| 亚洲精品久久7777777| 91精品国产综合久久久久久久久| 欧美日韩在线观看视频| 中文字幕在线观看日韩| 国产精品亚洲第一区| 亚洲男子天堂网| 亚洲欧美福利视频| 欧美电影在线观看网站| 亚洲区bt下载| 国产欧美精品va在线观看| www.色综合| 日韩一区二区三区国产| 91在线观看免费高清完整版在线观看| 日韩电影网在线| 精品国产一区二区三区久久久| 国产精品大片wwwwww| 亚洲美女激情视频| 色午夜这里只有精品| 成人午夜两性视频| 国产精品老女人视频| 一区二区三区 在线观看视| 成人福利视频网| 国产区亚洲区欧美区| 欧美午夜片在线免费观看| 91网站免费观看| 国产伦精品一区二区三区精品视频| 亚洲精品日韩在线| 国产精品久久久久久搜索| 中文国产亚洲喷潮| 中文字幕av一区| 亚洲欧美日韩国产中文| 国产99视频在线观看| 日韩在线高清视频| 国产精品欧美风情| 久久精品91久久香蕉加勒比| 欧美美最猛性xxxxxx| 亚洲欧美国产制服动漫| 欧美在线精品免播放器视频| 成人精品视频99在线观看免费| 欧美第一黄色网| 两个人的视频www国产精品| 久久久久久久久久久国产| 这里只有精品在线播放| 一本色道久久综合狠狠躁篇的优点| 亚洲欧美日韩精品| 久久久久免费精品国产| 97视频免费观看| 国产免费一区二区三区在线能观看| 国产日韩视频在线观看| 欧美成年人视频网站| 57pao国产成人免费| 亚洲激情视频在线观看| 在线日韩中文字幕| 久久视频在线播放| 韩国v欧美v日本v亚洲| 日韩成人中文电影| 亚洲欧洲日韩国产| 在线视频国产日韩| 精品视频一区在线视频| 亚洲成人精品在线| 国产精品九九久久久久久久| 日韩av大片在线| 国模视频一区二区三区| 97视频在线观看视频免费视频| 国产丝袜一区二区| 欧美多人爱爱视频网站| 久久99精品久久久久久噜噜| 国产视频久久网| 成人激情视频网| 国产综合福利在线| 久久噜噜噜精品国产亚洲综合| 亚洲人成在线电影| 国产一区二区在线免费视频| 国产欧美日韩亚洲精品| 青青草原一区二区| 国产亚洲欧美aaaa| 国产精品自拍视频| 欧美国产第二页| 日韩中文在线视频| 日韩影视在线观看| 国产一区香蕉久久| 欧美精品18videos性欧| 国自在线精品视频| 久久精品亚洲国产| 国产一区二区美女视频| 欧美亚洲成人xxx| 全球成人中文在线| 成人网欧美在线视频| 美女精品久久久| 亚洲成人av片在线观看| 久久人人爽人人爽人人片亚洲| 国产精品美女主播在线观看纯欲| 一本一道久久a久久精品逆3p| 欧美另类在线播放|