1. 程式人生 > >在JSP中用自定義標籤實現集合的遍歷——山寨版c:foreach

在JSP中用自定義標籤實現集合的遍歷——山寨版c:foreach

【文章標題】JSP中用自定義標籤實現集合的遍歷——山寨版<c:foreach>

【文章作者】曾健生

【作者郵箱】[email protected]

【作者QQ190678908

*******************************************************************************

JSTL中,標籤<c:foreach></c:foreach>可方便地遍歷集合或陣列,在瞭解了自定義標籤後,可動手實現<c:foreach>標籤的功能。

在編寫自定義標籤前,總要把實驗環境搭建好^-^

首先,定義一個

Person類,在實驗的集合中就是存放這個類的例項,程式碼如下:

package com.javaeye.newjueqi;

/**

*實驗類Person

*/

publicclass Person {

private String name;

privateintage;

public String getName() {

returnname;

}

publicvoid setName(String name) {

this.name = name;

}

publicint getAge() {

returnage;

}

publicvoid setAge(int age) {

this.

age = age;

}

}

既然是遍歷集合,那麼集合也是必須的,我們在測試頁面TestMyELTag.jsp上寫下如下的JSP程式碼,生成一個測試用途的集合ArrayList,集合中有三個元素

<%

//1個人物件

Person p1=new Person();

p1.setName("Tom");

p1.setAge(23);

//2個人物件

Person p2=new Person();

p2.setName("Mike");

p2.setAge(33);

//3個人物件

Person p3=new Person();

p3.setName("Jack");

p3.setAge(43);

ArrayList list=new ArrayList();

list.add( p1 );

list.add( p2 );

list.add( p3 );

//ArrayList儲存在application

pageContext.setAttribute( "PersonList", list );

%>

在編寫“山寨版”<c:foreach>前,有必要先了解一下正版的<c:foreach>的標準用法是怎麼樣的。如果用<c:foreach>遍歷上述的集合寫法如下:

<c:forEachitems="${pageScope.personlist}" var="per">

${per.name } -- ${per.age }<br>

</c:forEach>

<c:foreach>是迴圈控制,可以將集合中的成員循序遍歷一遍,執行方式為條件符合時,將會重複執行<c:foreach>的本體內容。

<c:foreach>中的屬性的含義:items是被迭代的集合物件,var是用來存放現在指向的成員,上面的程式碼執行後的結果如圖1所示:

1

我們實現一個自定義的標籤<newjueqi: myforEach>,模擬實現<c:forEach>的功能,用法如下:

<!-- 使用自定義標籤模擬實現<c:forEach>中集合的遍歷功能 -->

<newjueqi:myforEach items="${pageScope.personlist}" var="per">

${per.name } -- ${per.age }<br>

</newjueqi:myforEach>

效果如圖1 所示

下面是正式的程式碼:

1.編寫一個自定義的標籤類。

/**

*完成模擬<c:forEach>標籤遍歷集合的功能

*/

publicvoid doTag() throws JspException, IOException {

// 定義一個迭代器

Iterator i=null;

//如果集合是Colleciton型別

if( itemsinstanceof Collection )

{

//獲取Collection的迭代器

i=( (Collection)items).iterator();

}

//如果集合是陣列型別

elseif( itemsinstanceof Object[] )

{

//Arrays的靜態方法asList把陣列轉換為一個List集合,由於asList接受的引數

//是可變引數,所以為了防止轉換出錯必須要把傳入的引數強制為陣列

i=Arrays.asList((Object[])items).iterator();

}

else

{

thrownew RuntimeException("不能轉換");

}

//進行迭代

while( i.hasNext() )

{

//取得集合中迭代器指向的物件

Object obj=i.next();

//setAttribute方法把物件和指定的變數連線起來

//例如標籤中有屬性var="per",標籤體中有EL表示式式:$(per.name)

//寫了下面的一句話後EL表示式就可理解為obj.getName(),表示呼叫的是

//物件相應的getXXX()

pageContext.setAttribute( var, obj );

//執行標籤體的內容

jspFragment.invoke( null );

}

}

2.根據自定義標籤的寫法,首先寫一個tld檔案配置自定義標籤。由於標籤<newjueqi: myforEach>是帶有屬性和標籤體的,所以編寫如下:

<!-- 配置一個自定義標籤 -->

<tag>

<!-- 指定自定義標籤的名字 -->

<name>myforEach</name>

<!-- 指定當前標籤關聯的 Java -->

<tag-class>com.javaeye.newjueqi.MyForEach</tag-class>

<!-- 指定標籤體的型別: -->

<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>

3.JSP頁面中匯入標籤。

<%@ taglib prefix="newjueqi" uri="http://newjueqi.javaeye.com/myforEach" %>

4.JSP頁面中使用自定義標籤測試實際的效果。

<!-- 使用自定義標籤模擬實現<c:forEach>中集合的遍歷功能 -->

<newjueqi:myforEach items="${pageScope.personlist}" var="per">

${per.name } -- ${per.age }<br>

</newjueqi:myforEach>

執行的實際效果如圖 1所示

結語:這個自定義標籤遍歷集合的功能還不完善,譬如不能遍歷Map集合中的元素,但它們的編寫思路是一致的, Map集合中需要進一步封裝物件。

相關推薦

JSP中用定義標籤實現集合——山寨c:foreach

【文章標題】在JSP中用自定義標籤實現集合的遍歷——山寨版<c:foreach> 【文章作者】曾健生 【作者郵箱】[email protected] 【作者QQ】19067890

jsp tag 定義標籤實現按鈕的顯示

前些天在一個專案中做了一個最基本的許可權管理(標準的許可權結構,使用者-角色-選單),後來需要精確地控制到按鈕就想到了使用自定義標籤(jsp tag)來處理按鈕的顯示與隱藏。 下面是我參考網上的資料自己寫的一個自定義標籤的demo: 首先自定義標籤類: package c

jsp定義標籤實現許可權攔截

    最近專案需要要實現在頁面端一個許可權攔截功能。具體需求是,一個使用者登陸到系統後,判斷他是否有執行某個功能的許可權,如果有許可權,則功能鍵對該使用者可見;否則的話,不可見。要實現此功能,自定義標籤無疑是一種很好的解決辦法。具體方法如下:(語言java、頁面實現jsp

關於JSP定義標籤

前兩天學習了JSP的自定義標籤 ,現在來記述下,加深印象。 一、建立自定義標籤類 自定義標籤類的建立方式有多種,不過還是繼承SimpleTagSupport類比較簡單,沒必要重寫那麼多方法,只需要重寫doTag方法,然後把邏輯處理寫在doTag方法裡。此處是我的三個自定義標籤處理類: C

javaEE JSP定義標籤庫,定義分頁條標籤

WEB-INF/tld/commons.tld(自定義標籤庫的描述): <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, In

spring 定義標籤實現

Spring 自定義標籤實現 一、自定義Spring標籤簡介 Spring官方文件 42.1中,介紹瞭如何自定義Spring標籤,步驟如下: 1、編寫一個XML Schema描述您的自定義元素 2、編寫自定義名稱空間處理程式實現,實現NamespackHand

Spring定義標籤實現及踩過的坑(親測)

專案結構 先來一張專案結構圖,因為LZ是用的IDEAL,網上的大部分都是用的eclipse來實現: 這裡也大致說一下專案的新建,考慮到有的讀者會想LZ一樣對IDEAL的使用不是很熟練。 新建一個spring專案(不會的話網上搜索一下,很簡單的),建好之後,再新建這些資料夾,點選File—>Pr

JSP定義標籤標籤

public class IfTag extends SimpleTagSupport {          private boolean test;          public void setTest(boolean test) {                    this.test =

(精)Spring IOC核心原始碼學習III:bean標籤定義標籤實現原理

本文將解析spring bean定義標籤和自定義標籤的解析實現原理。這裡說的標籤僅限於以xml作為bean定義描述符的spring容器,繼承AbstractXmlApplicationContext的一些子 容器,如XmlApplicationContext、ClassPat

Java Web學習筆記(一)FreeMarker定義標籤實現生成前端指令碼驗證

最近在學習Java Web因為.net已經寫的想吐了。通過網易雲課堂瞭解了當前常用的SSM框架的使用方法,前期一切都很順利,包括資料庫的訪問、事務提交、物件注入、面向切片等等,但是當我對頁面檢視進行實現時發現相對於.net有一點不方便。Java Web的檢視層的實現方式非常

CSS3中用定義字型實現小圖示icon

最近在做一個專案時, 研究了一下新浪微博的前端, 看到首頁中那個圖示了嗎, 以前看到這類效果的第一反應就是用一個gif之類的圖示做出來!! 但在研究的過程, 發現了一個小技巧, 注意那個em標籤中的文字是E, 但顯示出來一個類似ICON的圖示.  既然是HTML+CSS

Django定義標籤實現多級評論

首先在App的目錄下,建一個名為templatetags的Python package(含有init.py) 在templatetags下新建一個名為custom.py的檔案。 這裡用到了遞迴,去

jsp定義標籤自動載入下拉框內容

第一步:在web專案下的web-inf的tlds目錄下,新建一個配置檔案,名字為relation.tld,內容如下: 自定義標籤的字首為relation(由short-name標籤決定),屬性有saveField(要儲存到資料庫的欄位名),value(要被選中的資料值)

集合:for VS foreach

假設我們擁有下面的集合 1            System.Collections.ArrayList list =new System.Collections.ArrayList();2   

Map集合方式以及TreeMap集合儲存定義物件實現比較的Comparable和Comparator兩種方式

Map集合的特點 1、Map集合中儲存的都是鍵值對,鍵和值是一一對應的 2、一個對映不能包含重複的值 3、每個鍵最多隻能對映到一個值上   Map介面和Collection介面的不同 Map是雙列集合的根介面,Collection是單列集合的根介面 1、Map是雙列的(是雙列集合的根介

JSP定義標籤List (ct:forEach)

問題描述 : jsp 的pageContext域中存在User物件的users列表,想在jsp檔案中遍歷users. <% class User{ private String name; private Strin

實現按鈕級許可權管理--使用jsp定義標籤

在有些系統中,可能會用到按鈕級的許可權管理。這裡使用jsp自定義標籤來實現。0、基礎配置。建表    ###角色對應的操作按鈕1.1.1角色對應的按鈕關聯表,角色下有哪些按鈕是可以訪問的CREATE TABLE `system_role_operation` (  `role

spring 定義標籤實現

在我們進行Spring 框架開發中,估計用到最多的就是bean 標籤吧,其實在Spring中像<mvc/><context/>這類標籤以及在dubbo配置的標籤都是屬於自定義的標籤,標籤的解析,已經由作者就行了解析,我們用就好了,那麼我們今天就進行開發一個自己的標籤,模擬 &

javaweb:JSTL(JSP標準標籤庫)、定義標籤開發

JSTL 簡介: JSTL的全稱: •JSP Standard Tag Library,JSP標準標籤庫 JSTL的作用: •提供給 Java Web 開發人員一個標準通用的標籤函式庫 •和 EL 來取代傳統直接在頁面上嵌入 Java 程式(Scripting)的做法,

jsp定義標籤的學習[從學習到工作(五)]

     在現在的開發平臺上發現有自己定義的標籤,於是在空閒時間學習了一下自定義標籤,並且做了一個簡單的ajax校驗的text標籤,廢話少說,看下面的步驟和程式碼。      一. jsp頁面包含的內容