javaweb學習總結(十一)——自定義標簽開發庫

来源:https://www.cnblogs.com/niuchuangfeng/archive/2018/06/01/9123927.html
-Advertisement-
Play Games

一、自定義標簽開發庫簡介: Tag介面的方法: 二、自定義標簽入門:輸出客戶機ip 1.編寫一個實現tag介面的java類 ViewIPTag.java 2.在tld文件中對標簽處理器類進行描述(tld文件的位置:WEB-INF下,可以抄apache-tomcat/webapps\examples\ ...


一、自定義標簽開發庫簡介

  

 

  Tag介面的方法:

     

 

二、自定義標簽入門:輸出客戶機ip

1.編寫一個實現tag介面的java類

  • ViewIPTag.java

 1 package com.web.tag;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.jsp.JspException;
 7 import javax.servlet.jsp.JspWriter;
 8 import javax.servlet.jsp.tagext.TagSupport;
 9 
10 //Tag介面實現類
11 public class ViewIPTag extends TagSupport{
12     @Override
13     public int doStartTag() throws JspException {
14     
15         HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
16         JspWriter out = this.pageContext.getOut();
17         
18         
19         String ip = request.getRemoteAddr();
20         try {
21             out.print(ip);
22         } catch (IOException e) {
23             throw new RuntimeException(e);
24         }
25         
26         return super.doStartTag();
27     }
28 }

    

2.在tld文件中對標簽處理器類進行描述(tld文件的位置:WEB-INF下,可以抄apache-tomcat/webapps\examples\WEB-INF\jsp2\jsp2-example-taglib.tld)com.tld:這個文件放在WEB-INF目錄下

  • tld文件:    

 1 <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
 4     version="2.0">
 5     
 6     <description>A tag library exercising SimpleTag handlers.</description>
 7     <tlib-version>1.0</tlib-version>
 8     <short-name>com</short-name>
 9     <uri>http://www.sina.cn</uri><!-- 綁定url -->
10     
11     
12     <tag>
13         <name>viewIP</name><!-- 標簽的名稱 -->
14         <tag-class>com.web.tag.ViewIPTag</tag-class><!-- 標簽實現類的完整類名 -->
15         <body-content>empty</body-content><!-- 標簽體為空 -->
16     </tag>
17     
18 </taglib>

 

3.在jsp頁面中導入和使用自定義標簽

  • 1.jsp 

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@taglib uri="http://www.sina.cn" prefix="com" %> <!-- 導入標簽 -->
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     您的ip:<com:viewIP/><!-- 使用標簽 -->
11 </body>
12 </html>

 

三、Tag介面的執行流程

 

   

  自定義標簽調用圖:

    

 

 

  

   jsp翻譯成servlet部分源代碼:

    

 1    out.write("    您的ip是:");
 2       if (_jspx_meth_com_005fviewIP_005f0(_jspx_page_context))
 3         return;
 4       out.write("\r\n");
 5       out.write("  </body>\r\n");
 6       out.write("</html>\r\n");
 7     } catch (java.lang.Throwable t) {
 8       if (!(t instanceof javax.servlet.jsp.SkipPageException)){
 9         out = _jspx_out;
10         if (out != null && out.getBufferSize() != 0)
11           try {
12             if (response.isCommitted()) {
13               out.flush();
14             } else {
15               out.clearBuffer();
16             }
17           } catch (java.io.IOException e) {}
18         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
19         else throw new ServletException(t);
20       }
21     } finally {
22       _jspxFactory.releasePageContext(_jspx_page_context);
23     }
24   }
25 
26   private boolean _jspx_meth_com_005fviewIP_005f0(javax.servlet.jsp.PageContext _jspx_page_context)
27           throws java.lang.Throwable {
28     javax.servlet.jsp.PageContext pageContext = _jspx_page_context;
29     javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut();
30     //  com:viewIP
31     com.web.tag.ViewIPTag _jspx_th_com_005fviewIP_005f0 = (com.web.tag.ViewIPTag) _005fjspx_005ftagPool_005fcom_005fviewIP_005fnobody.get(com.web.tag.ViewIPTag.class);
32     boolean _jspx_th_com_005fviewIP_005f0_reused = false;
33     try {
34       _jspx_th_com_005fviewIP_005f0.setPageContext(_jspx_page_context);//調用setPageContext()方法
35 _jspx_th_com_005fviewIP_005f0.setParent(null); 36 int _jspx_eval_com_005fviewIP_005f0 = _jspx_th_com_005fviewIP_005f0.doStartTag(); 37 if (_jspx_th_com_005fviewIP_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { 38 return true; 39  } 40  _005fjspx_005ftagPool_005fcom_005fviewIP_005fnobody.reuse(_jspx_th_com_005fviewIP_005f0); 41 _jspx_th_com_005fviewIP_005f0_reused = true; 42 } finally { 43  org.apache.jasper.runtime.JspRuntimeLibrary.releaseTag(_jspx_th_com_005fviewIP_005f0, _jsp_getInstanceManager(), _jspx_th_com_005fviewIP_005f0_reused); 44  } 45 return false; 46 }

 

四、 傳統標簽開發技術

  開發人員在編寫Jsp頁面時,經常還需要在頁面中引入一些邏輯:

    

 

1、控制jsp頁面某一部分內容是否執行

    API:
      

 

         

  •  標簽實現類:TagDemo1.java     

 1 package com.web.tag;
 2 
 3 import javax.servlet.jsp.JspException;
 4 import javax.servlet.jsp.tagext.TagSupport;
 5 
 6 public class TagDemo1 extends TagSupport{
 7 
 8     @Override
 9     public int doStartTag() throws JspException {
10         
11         //實際開發場景————如果有許可權則輸出,沒有許可權則不輸出
12         return TagSupport.EVAL_BODY_INCLUDE;
13     }
14     
15 }

 

  • 標簽聲明:tld文件   

1  <tag>
2         <name>demo1</name>
3         <tag-class>com.web.tag.TagDemo1</tag-class>
4         <body-content>JSP</body-content><!--標簽體的內容   empty JSP scriptless tagdepentend-->
5     </tag>
6     

tld文件類型中的四種標簽體:EMPTY JSP scriptless tagdepentend

  

  • 使用標簽:jsp頁面   

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@taglib uri="http://www.sina.cn" prefix="com" %>
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5   <head>
 6     <title>使用自定義標簽控制jsp部分內容是否輸出(標簽體)</title>
 7   </head>
 8       <com:demo1>hahaha</com:demo1>
 9   <body>
10     
11   </body>
12 </html>

 

 2、控制整個jsp頁面內容是否執行

    API:
      

 

 

 

  • 標簽實現類:TagDemo2.java:

      

 

 

 

  • 標簽聲明:tld文件

1 <tag>
2         <name>demo2</name>
3         <tag-class>com.web.tag.TagDemo2</tag-class>
4         <body-content>empty</body-content><!--標簽體為空-->
5     </tag>
6     
  • 使用標簽:

      

3、控制標簽體重覆輸出

   API:
    

 

  • 標簽實現類:TagDemo3

     

 1 package com.web.tag;
 2 
 3 import javax.servlet.jsp.JspException;
 4 import javax.servlet.jsp.tagext.IterationTag;
 5 import javax.servlet.jsp.tagext.Tag;
 6 import javax.servlet.jsp.tagext.TagSupport;
 7 //控制標簽體輸出5次
 8 public class TagDemo3 extends TagSupport{
 9     //次數
10     int x = 5;
11     @Override
12     public int doStartTag() throws JspException {
13         return Tag.EVAL_BODY_INCLUDE;
14     }
15 
16     @Override
17     //在標簽體執行完之後、結束標簽之前調用
18     public int doAfterBody() throws JspException {
19         x--;
20         if(x>0){
21             return IterationTag.EVAL_BODY_AGAIN;
22         }else {
23             return IterationTag.SKIP_PAGE;
24         }
25     }
26 }   

 

  • 標簽聲明:

1   <tag>
2         <name>demo3</name>
3         <tag-class>com.web.tag.TagDemo3</tag-class>
4         <body-content>JSP</body-content>
5     </tag>

    

  • 使用標簽:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@taglib uri="http://www.sina.cn" prefix="com" %>
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5   <head>
 6     <title>使用自定義標簽控制jsp部分內容是否輸出(標簽體)</title>
 7   </head>
 8   <body>
 9     <com:demo3>控制標簽體重覆輸出 <br/></com:demo3>
10   </body>
11 </html>

 

     

 4、改變標簽體內容輸出

     API:

       

 

  • 標簽實現類:TagDemo4.java:     

 1 package com.web.tag;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.jsp.JspException;
 6 import javax.servlet.jsp.tagext.BodyContent;
 7 import javax.servlet.jsp.tagext.BodyTag;
 8 import javax.servlet.jsp.tagext.BodyTagSupport;
 9 import javax.servlet.jsp.tagext.Tag;
10 
11 //修改標簽體內容輸出
12 public class TagDemo4 extends BodyTagSupport{
13     
14     @Override
15     public int doStartTag() throws JspException {
16         return BodyTag.EVAL_BODY_BUFFERED;//返回這個參數,伺服器會把標簽體封裝成對象作為參數調用setBodyContent(BodyContent b)方法
17     }
18     @Override
19     public int doEndTag() throws JspException {
20         //得到標簽體
21         BodyContent bc = this.getBodyContent();
22         //得到內容
23         String content = bc.getString();
24         //轉成大寫
25         content = content.toUpperCase();
26         
27         try {
28             this.pageContext.getOut().write(content);
29         } catch (IOException e) {
30             throw new RuntimeException(e);
31         }
32         
33         return Tag.EVAL_PAGE;//繼續輸出jsp頁面其他內容
34     }
35 }

當在doStartTag()方法中返回BodyTag.EVAL_BODY_BUFFERED參數時,伺服器會把標簽體內容封裝成對象作為參數調用setBodyContent(BodyContent b)方法,然後在doEngTag()

中調用getBodyContent()方法返回BodyContent對象,從而得到標簽體內容進行修改輸出。

  • 標簽聲明:  

1 <tag>
2         <name>demo4</name>
3         <tag-class>com.web.tag.TagDemo4</tag-class>
4         <body-content>JSP</body-content>
5     </tag>
6     

 

  • 使用標簽:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@taglib uri="http://www.sina.cn" prefix="com" %>
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5   <head>
 6     <title>使用自定義標簽控制jsp部分內容是否輸出(標簽體)</title>
 7   </head>
 8       <com:demo4>aaaaaa</com:demo4>
 9   <body>
10     
11   </body>
12 </html>

 

5、Tag介面的體系:

    

 

    

 

       

 

 

五、簡單標簽開發技術

  由於傳統標簽使用三個標簽介面來完成不同的功能,顯得過於繁瑣,不利於標簽技術的推廣, SUN公司為降低標簽技術的學習難度,在JSP 2.0中定義了一個更為簡單、便於編寫和調用的SimpleTag介面來實現標簽的功能。實現SimpleTag介面的標簽通常稱為簡單標簽。簡單標簽共定義了5個方法:

  • setJspContext方法
  • setParent和getParent方法
  • setJspBody方法
  • doTag方法

 

  API:

    

      實現類:

      

 

1、控制標簽體是否執行

  • 標簽實現類:SimpleTagDemo1.java:     

 1 import javax.servlet.jsp.JspException;
 2 import javax.servlet.jsp.tagext.JspFragment;
 3 import javax.servlet.jsp.tagext.SimpleTagSupport;
 4 //控制標簽體是否執行
 5 public class SimpleTagDemo1 extends SimpleTagSupport{
 6 
 7     @Override
 8     public void doTag() throws JspException, IOException {
 9         //獲取標簽體對象
10         JspFragment jf = this.getJspBody();
11         12             
13             jf.invoke(this.getJspContext().getOut());//null也可以預設輸出給瀏覽器
14 15         
16     }
17 }

 

  •  標簽聲明:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 
 3 <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
 6     version="2.0">
 7     
 8     <description>A tag library exercising SimpleTag handlers.</description>
 9     <tlib-version>1.0</tlib-version>
10     <short-name>simple</short-name>
11     <uri
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 主從資料庫:主要是數據上的讀寫分離; 資料庫的讀寫分離的好處?1. 將讀操作和寫操作分離到不同的資料庫上,避免主伺服器出現性能瓶頸;2. 主伺服器進行寫操作時,不影響查詢應用伺服器的查詢性能,降低阻塞,提高併發;3. 數據擁有多個容災副本,提高數據安全性,同時當主伺服器故障時,可立即切換到其他伺服器 ...
  • 通常,向方法中傳遞的都是基本數據類型,而向方法中傳遞數組時,就需要考慮記憶體的分配 向方法之中傳遞數組,或者將一個數組的值傳給另一個數組,都會產生新的棧記憶體。引用之中對數組的改變會影響到原數組(其實就是在原數組的堆記憶體上操作)。當引用操作完成之後,引用產生的占記憶體不再只想原數組的堆記憶體。 ...
  • urllib庫的使用,非常簡單。 只要幾句代碼就可以把一個網站的源代碼下載下來。 官方文檔:https://docs.python.org/2/library/urllib2.html urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, ...
  • 很早想造個輪子了,聽說不想造輪子的程式員不是好程式員,用慣了Apache的眾多開源項目,卻沒看過開源一句代碼。最近看了幾篇賣焦慮的文章之後,突然變得慌張起來,於是在百忙之中難得一點閑第一次打開了JDK的源碼包。初讀:晦澀難懂,3千多行代碼,全英文註釋,有一些陌生的語法和調用陌生的類足矣嚇退一個中年程... ...
  • 原創 煤球數目 有一堆煤球,堆成三角棱錐形。具體:第一層放1個,第二層3個(排列成三角形),第三層6個(排列成三角形),第四層10個(排列成三角形),....如果一共有100層,共有多少個煤球? 請填表示煤球總數目的數字。註意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。 層數 1 ...
  • 大家好,併發編程 進入第十一章。 前面兩節,我們講了協程中的單任務和多任務 這節我們將通過一個小實戰,來對這些內容進行鞏固。 在實戰中,將會用到以下知識點: 多線程的基本使用 Queue消息隊列的使用 Redis的基本使用 asyncio的使用 . 動態添加協程 在實戰之前,我們要先瞭解下在asyn ...
  • Step 0: 使用新的 virtualenv 環境 建議使用 1.11.4 版本的 Django Step 1: 新建一個 django 項目 創建一個應用程式 在 myechartsite/settings.py 中註冊應用程式 我們先編輯 urls.py.這文件在 Django 里的功能是把前 ...
  • 一、什麼是Java事務 通常的觀念認為,事務僅與資料庫相關。 事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性 (isolation)和持久性(durability)的縮寫。事務的原子性表示事務執行過程中的任何失敗都將導 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...