Jsp2.0自定義標簽(第二天)——自定義循環標簽

今天是學習自定義標簽的第二天,主要是寫一個自定義的循環標簽。

先看效果圖:

image_thumb3

?

前臺頁面Jsp代碼

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib prefix="myout" uri="/demo" %>
<html>
<head>
</head><%String[] array = new String[]{"one","two","three","four","five"};pageContext.setAttribute("arr", array);%>
<body><h1>我的測試頁面</h1><myout:Foreach items="arr" var="item">array數組里對應的英文數字:${item}<br></myout:Foreach>
</body>
</html>

跟第一篇一樣,還是分四部分講解:

?

第一部分:自定義標簽文件(*tld)

image_thumb9

具體內容:

<?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"><tlib-version>1.0</tlib-version><short-name>myout</short-name><uri>/demo</uri><!-- 循環 --><tag><name>Foreach</name><tag-class>com.tag.support.TagDemo</tag-class><!-- 標簽體可以用EL表達式 --><body-content>scriptless</body-content><attribute><name>items</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><attribute><name>var</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>
</taglib>

?

這個地方要注意一點:關于<%@taglib prefix="myout" uri="/demo" %>如何找到demo.tld文件的?

兩種方式:

?? 第一種方式:就如同上面這樣配置,在demo.tld文件中加上<uri>/demo</uri> ,指定uri,

?????????????????? 但是這種方式demo.tld必須放在WEB-INF下,不然容器找不到

?? 第二種方式:在web.xml中配置,這種方式是通過顯示的指定demo.tld的位置,可以不放在WEB-INF只要指向正確就好

        <jsp-config><taglib><taglib-uri>/demo</taglib-uri><taglib-location>/WEB-INF/lirui.tld</taglib-location></taglib></jsp-config>

?

新增一種方式:其實在jsp頁面引用自定義標簽還可以另一種方式(指定*.tld文件所在路徑),只是這種方式不靈活。

%@taglib prefix="myout" uri="/WEB-INF/demo.tld" %

?

第二部分:標簽具體業務實現類。

自定義的類要繼承(extends)SimpleTagSupport

import java.io.IOException;import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;public class TagDemo extends SimpleTagSupport {//注意:這個屬性要與tld文件中定義的屬性一致,并提供get和set方法private String items;private String var;public String getItems() {return items;}public void setItems(String items) {this.items = items;}public String getVar() {return var;}public void setVar(String var) {this.var = var;}//具體業務實現類
    @Overridepublic void doTag() throws JspException, IOException {//this.getJspContext()獲得JspContext對象也就是前臺頁面的PageContext//可以看出頁面輸出Hello World注意是這里的write方法實現的JspContext jspContext = this.getJspContext();String[] arr = (String[])jspContext.getAttribute(items);for(String s: arr){jspContext.setAttribute(var, s);this.getJspBody().invoke(null);}}
}

注意一點:this.getJspBody().invoke(null); 這行代碼表示把標簽體的內容的內容輸入到瀏覽器,如果沒有調用該方法,則忽略標簽體

我一開始做的時候沒有加這一行代碼,

直接導致前臺頁面<myout:Foreach items="arr" var="item">array數組里對應的英文數字:${item}<br> </myout:Foreach> 標簽體內同顯示不出來,當時查了下資料才知道這里沒有加this.getJspBody().invoke(null); 這一行代碼。

?

擴充一下知識點:JspFragment是個抽象類,這個類代碼很簡單,具體如下:

import java.io.IOException;
import java.io.Writer;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;public abstract class JspFragment
{public abstract void invoke(Writer paramWriter)throws JspException, IOException;public abstract JspContext getJspContext();
}

這個類的實例通過SimpleTagSupport類中的getJspBody()方法獲得的。

該類實例封裝了標簽體的內容,主要方法就是invoke方法,該方法具體有兩種用法:

第一種:this.getJspBody().invoke(null);表示輸出到瀏覽器,這是原樣輸出的

第二種:當需要對標簽體進行修改時,需要用到第二種,this.getJspBody().invoke(Writer out);

假設:我希望上面顯示的頁面效果使所有字母大寫,效果如圖

image_thumb12

代碼如下:

//具體業務實現類
    @Overridepublic void doTag() throws JspException, IOException {JspContext jspContext = this.getJspContext();String[] arr = (String[])jspContext.getAttribute(items);for(String s: arr){jspContext.setAttribute(var, s);//定義一個緩沖區,把內容先輸入到緩存區中,然后在打印到瀏覽器StringWriter sw = new StringWriter();this.getJspBody().invoke(sw);String str = sw.toString().toUpperCase();//打印的具體操作this.getJspContext().getOut().write(str);}}

這就是這兩種方式的區別。

第三部分:Jsp頁面引用自定義標簽。

<%@taglib prefix="myout" uri="/demo" %>

關于引用自定義標簽,上面第二部分已說的很清楚,這里就不多說了。

第四部分:關于定義uri的幾種方式。

兩種方式:(第一部分好像也說了,這里再重復一遍)

?? 第一種方式:就如同上面這樣配置,在demo.tld文件中加上<uri>/demo</uri> ,指定uri,

?????????????????? 但是這種方式demo.tld必須放在WEB-INF下,不然容器找不到

?? 第二種方式:在web.xml中配置,這種方式是通過顯示的指定demo.tld的位置,可以不放在WEB-INF只要指向正確就好

        <jsp-config><taglib><taglib-uri>/demo</taglib-uri><taglib-location>/WEB-INF/lirui.tld</taglib-location></taglib></jsp-config>

?

今天是學習Jsp自定義標簽的第二天,剛開始寫博客,如果有什么問題歡迎各位網友及時提出,謝謝。

技術的提高在于分享,而不是閉門造車。

轉載于:https://www.cnblogs.com/liruiloveparents/p/5041071.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397100.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

正則表達式以什么開頭以什么結尾_股票hk是什么意思,股票st開頭是什么意思,新通聯股票...

股票hk是什么意思,股票st開頭是什么意思,新通聯股票股票hk是什么意思,股票st開頭是什么意思,新通聯股票我們首先解決時間跨度問題&#xff1a;如果您為諸如退休之類的遙遠目標投資&#xff0c;則應主要投資股票(同樣&#xff0c;我們建議您通過共同基金投資)。心理控制第一&…

讀書筆記--SQL必知必會03--排序檢索數據

3.1 排序數據 子句&#xff08;clause&#xff09; SQL語句由子句構成。一個子句通常由一個關鍵字加上所提供的數據組成。 ORDER BY子句可以取一個或多個列的名字&#xff0c;將SELECT語句檢索出的數據進行排序。 ORDER BY子句可以使用非檢索的列排序數據。 ORDER BY子句必須作…

mysql中編寫匿名塊_Oracle數據庫之Oracle_PL/SQL(1) 匿名塊

本文主要向大家介紹了Oracle數據庫之Oracle_PL/SQL(1) 匿名塊&#xff0c;通過具體的內容向大家展現&#xff0c;希望對大家學習Oracle數據庫有所幫助。1. PL/SQL 簡介PL/SQL是一種比較復雜的程序設計語言, 用于從各種環境中訪問Oracle數據庫。為什么使用PL/SQL&#xff1f;Ora…

安裝了多個Oracle11g的客戶端,哪個客戶端的tnsnames.ora會起作用?

如果我們由于需要安裝了多個Oracle的client&#xff0c;哪個客戶端的tnsnames.ora會起作用呢&#xff1f; 答案是&#xff1a; 在安裝好clinent端后&#xff0c;安裝程序會把client的bin目錄放到path里面&#xff0c;path中在前面的client會被首先搜索&#xff0c;其中的tnsnam…

電腦顯示連接了網絡但是不能上網_為什么電腦插上網線顯示已連接卻上不了網...

嘗試斷一下網&#xff0c;或者重啟一下系統看一下是否解決&#xff1b;也可能是開啟了網絡代理&#xff0c;可以重置一下瀏覽器或者網絡設置&#xff1b;還可以使用安全管家軟件&#xff0c;掃描一下網絡設置。以下是詳細介紹&#xff1a;1、有時候系統顯示已經連接其實并沒有真…

Atcoder ARC101 E 樹dp

https://arc101.contest.atcoder.jp/tasks/arc101_c 題解是也是dp&#xff0c;好像是容斥做的&#xff0c;但是看不懂&#xff0c;而且也好像沒講怎么變n^2&#xff0c;看了寫大佬的代碼&#xff0c;自己理解了一下 #include <bits/stdc.h> #include <ext/pb_ds/assoc…

compress命令--Linux命令應用大詞典729個命令解讀

內容來源于人民郵電出版社《Linux命令應用大詞典》講述729個命令&#xff0c;1935個例子學習Linux系統的參考書、案頭書&#xff0c;遇到不懂的命令或命令選項一查即可爭取每天都發布內容本文出自 “airfish2000” 博客&#xff0c;更多命令查看博客&#xff1a;http://airfish…

javaweb學習總結(三十九)——數據庫連接池

javaweb學習總結(三十九)——數據庫連接池 數據庫連接池的實現及原理 JNDI 在 J2EE 中的角色轉載于:https://www.cnblogs.com/daishuguang/p/5041845.html

python getopterror_python3 getopt用法

python channel_builder.py -s /Users/graypn/ -d /Users/graypn/Documents -m 7 --outreport/xx.html參數也分長格式和短格式短格式&#xff1a;-s長格式&#xff1a;--sourceopts, args getopt.getopt(sys.argv[1:], "hs:d:m:v:p:c:",["help", "sr…

excel刪除空行_Excel里99.9%的人都踩過的坑,早看早避開!

本文作者丨可可&#xff08;小 E 背后的小仙女&#xff09;本文由「秋葉 Excel」原創發布如需轉載&#xff0c;請在公眾號發送關鍵詞「轉載」查看說明2019 年上班第一天感覺怎么樣呢&#xff1f;望著滿屏幕鋪天蓋地的表格&#xff0c;我只能摸摸自己還沒下去的小肚子&#xff0…

CentOS 6.5 Zabbix-agent3.2 安裝 1.0版

1.關閉防火墻service iptables stop2.更換源、安裝zabbix-agentrpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2-1.el6.noarch.rpmyum install -y zabbix-agent3.修改配置文件vim /etc/zabbix/zabbix_agentd.confServer192.168.8.228 ser…

centos下利用httpd搭建http服務器方法

centos下利用httpd搭建http服務器方法 1. 解決的問題 在開發測試過程中&#xff0c;分析圖片任務需要將圖片保存在服務器端&#xff0c;通過url來訪問和下載該圖片&#xff0c;這就需要使用一臺圖片服務器&#xff0c;但常常遇到圖片服務器匱乏的情況&#xff0c;為了解決該問題…

[轉]Java7中的ForkJoin并發框架初探(上)——需求背景和設計原理

詳見&#xff1a; http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp83 這篇我們來簡要了解一下JavaSE7中提供的一個新特性 —— Fork Join 框架。 0. 處理器發展和需求背景 回想一下并發開發的初衷&#xff0c;其實可以說是有兩點&#xff0c;或者說可以從兩個方面…

安裝oculus運行時出現問題_U盤安裝windows10出現的問題解決方法

安裝windows10 出現的問題之前安裝windows10都沒什么問題&#xff0c;今天安裝windows10出現了好多問題&#xff0c;記錄一下。我這個教程我覺得是最好的安裝教程安裝windows10教程問題1. 我們無法創建新的分區&#xff0c;找不到現有分區&#xff08;或者因為MBR分區表問題&am…

JavaFx導出文件

導出文件格式可選 protected void handExportDateAction(ActionEvent event) {// ShowDialog.showConfirmDialog(FXRobotHelper.getStages().get(0),// "是否導出數據到txt&#xff1f;", "信息");FileChooser fileChooser new FileChooser();FileChooser…

python選擇排序從大到小_Python實現選擇排序

一、選擇排序簡介選擇排序(Selection sort)是一種簡單直觀的排序算法。選擇排序首先從待排序列表中找到最小(大)的元素&#xff0c;存放到元素列表的起始位置(與起始位置進行交換)&#xff0c;作為已排序序列&#xff0c;第一輪排序完成。然后&#xff0c;繼續從未排序序列中找…

【Ubuntu14】Nginx+PHP5+Mysql記錄

這次因為工作原因&#xff0c;需要在Linux下進行開發。推薦的環境是Ubuntu14NginxPHPMysql。環境搭建好之后&#xff0c;裝上GIT&#xff0c;裝上IDE&#xff0c;覺得Mysql命令界面麻煩又裝了個Navicat。總體用下來感覺很帶感。 【虛擬機與鏡像文件】 這里我采用的虛擬機是VMwa…

java句柄數過高怎么解決_主播個人及企業利潤高,個稅或企業所得稅怎么解決...

網絡直播在2020年尤為火熱&#xff0c;男女老少都紛紛投入其中&#xff0c;究其原因還是其行業表現出來的“利潤高”等。也確實有部分人取得了一定的成效&#xff0c;也催生了不少的直播平臺、經紀公司的出現。 那么這些主播個人或者企業利潤高&#xff0c;個稅或企業所得…

雜項-Java:JBoss

ylbtech-雜項-Java&#xff1a;JBoss是一個基于J2EE的開放源代碼的應用服務器。 JBoss代碼遵循LGPL許可&#xff0c;可以在任何商業應用中免費使用。JBoss是一個管理EJB的容器和服務器&#xff0c;支持EJB 1.1、EJB 2.0和EJB3的規范。但JBoss核心服務不包括支持servlet/JSP的WE…

任務調度及遠端管理(基于Quartz.net)

這篇文章我們來了解一些項目中的一個很重要的功能&#xff1a;任務調度 可能有些同學還不了解這個&#xff0c;其實簡單點說任務調度與數據庫中的Job是很相似的東西 只不過是運行的物理位置與管理方式有點不一樣&#xff0c;從功能上來說我覺得還是差不多的&#xff0c; 存儲過…