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

首頁 > 編程 > JSP > 正文

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

2020-07-27 21:28:21
字體:
來源:轉載
供稿:網友

在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
日韩免费在线看| 亚洲桃花岛网站| 国产精品mp4| 国产精品高潮视频| 色777狠狠综合秋免鲁丝| 国产精品久久久久影院日本| 国产视频精品一区二区三区| 国产欧美日韩专区发布| 欧美亚洲午夜视频在线观看| 欧美一区二区三区四区在线| 国产精品一区二区久久久久| 福利微拍一区二区| 92版电视剧仙鹤神针在线观看| 欧美亚洲午夜视频在线观看| 国产精品久久久久9999| 成人精品一区二区三区电影黑人| 国产精品天天狠天天看| 成人午夜激情免费视频| 亚洲视屏在线播放| 日韩在线观看免费高清完整版| 亚洲综合在线中文字幕| 国自产精品手机在线观看视频| 中文字幕在线国产精品| 欧美多人爱爱视频网站| 久久久久国产精品免费网站| 亚洲乱码一区av黑人高潮| 精品视频久久久久久| 日韩中文字幕精品| 亚洲乱码一区av黑人高潮| 日本成熟性欧美| 久久九九有精品国产23| 日本欧美精品在线| 亚洲成avwww人| 国产精品流白浆视频| 视频直播国产精品| 久久久伊人欧美| 亚洲国产免费av| 亚洲人成电影网站色…| 欧美精品在线免费| 国产亚洲激情视频在线| 亚洲少妇激情视频| 亚洲男人的天堂在线播放| 久久亚洲欧美日韩精品专区| 久久久久久久91| 成人h猎奇视频网站| 欧美在线观看一区二区三区| 日韩av中文字幕在线| 久久久久五月天| 久久精品成人一区二区三区| 欧美激情乱人伦| 日韩在线视频线视频免费网站| 亚洲色图第三页| 亚洲高清久久网| 国产精品免费福利| 色青青草原桃花久久综合| 日本精品va在线观看| 日韩欧美aⅴ综合网站发布| 伊人久久久久久久久久久| 欧美一级大片视频| 三级精品视频久久久久| 国产精品第一视频| 国产在线播放不卡| 欧美日本中文字幕| 一区二区三区日韩在线| 色播久久人人爽人人爽人人片视av| 久久久久久91香蕉国产| 中文字幕亚洲综合久久| 国产精品福利小视频| 日韩欧美极品在线观看| 亚洲国产精品久久91精品| 中文字幕亚洲天堂| 亚洲日本中文字幕| 亚洲综合中文字幕68页| 日本亚洲欧洲色| 中文字幕不卡在线视频极品| 亚洲自拍偷拍色图| 午夜精品一区二区三区在线视频| 国模精品视频一区二区三区| 久久久久久久久久久久av| 久久久久国产一区二区三区| 欧美成人性色生活仑片| 日韩欧美高清在线视频| 国产亚洲精品美女| 久久精品视频中文字幕| 色综合久久88色综合天天看泰| 亚洲精品视频中文字幕| 欧美性猛交xxxx免费看久久久| 日本高清不卡的在线| 欧美色视频日本高清在线观看| 国产精品美女免费视频| 国产午夜精品久久久| 成人免费淫片aa视频免费| 亚洲自拍小视频免费观看| 国产精品久久久久久久久粉嫩av| 日韩精品免费在线视频观看| 在线免费观看羞羞视频一区二区| 日本久久精品视频| 国产一区二区三区日韩欧美| 日韩中文字幕精品| 91系列在线播放| 尤物九九久久国产精品的分类| 亚洲女人被黑人巨大进入| 在线国产精品播放| 亚洲色图综合网| 国产+人+亚洲| 久久亚洲精品一区二区| 欧美性视频在线| 日韩成人av网址| 欧美激情一区二区久久久| 日韩精品在线观看一区| 欧美日韩福利在线观看| 2019中文字幕免费视频| 成人午夜小视频| 国产精品成人一区| 国产精品成av人在线视午夜片| 日韩一区视频在线| 日韩成人久久久| 久久久久久噜噜噜久久久精品| 97久久精品人人澡人人爽缅北| 欧美日韩亚洲91| 午夜精品美女自拍福到在线| 欧美成人国产va精品日本一级| 成人激情综合网| 欧美成人黄色小视频| 海角国产乱辈乱精品视频| 欧美乱妇高清无乱码| 丰满岳妇乱一区二区三区| 国产精品入口福利| 亚洲精品在线观看www| 欧美精品videossex88| 性欧美视频videos6一9| 国产97在线播放| 精品中文字幕视频| 国产亚洲aⅴaaaaaa毛片| 中国人与牲禽动交精品| 亚洲裸体xxxx| 精品福利在线看| 一区二区三区亚洲| 日韩电视剧在线观看免费网站| 国产精品久久久久免费a∨| 日韩av在线网址| 91精品视频免费观看| 亚洲福利视频网站| 久久青草精品视频免费观看| 日韩欧美在线免费观看| 国产成人精品a视频一区www| 高跟丝袜欧美一区| 欧美日韩免费在线| 国产日韩精品入口| 91精品啪aⅴ在线观看国产| 国产日韩欧美夫妻视频在线观看| 在线观看欧美日韩| 亚洲欧美激情另类校园| 在线观看欧美www| 久久久亚洲影院| 国产精品视频不卡| 91精品免费看| 国产精品黄色影片导航在线观看| 久久国产精品久久久久| 欧美性猛交xxxx富婆弯腰| 成人在线中文字幕| 国产成人精品一区二区三区| 国产美女久久精品| 国产综合视频在线观看|