在JSP中用自定义标签实现集合的遍历—山寨版cforeach

合集下载

JSTL详解(常用标签以及c:forEach遍历集合)

JSTL详解(常用标签以及c:forEach遍历集合)

JSTL详解(常⽤标签以及c:forEach遍历集合)JSTL标签参考⽂章:/qq_25827845/article/details/53311722# 学习总结⼀、 JSTL的简介1. 什么是JSTLJSTL 是 JSP 标准标签库,利⽤标签库的标签可以取代 JSP 页⾯上的 Java 代码,为页⾯设计⼈员和后台开发⼈员的分⼯协作提供了便利。

2. JSTL常⽤标签库标签库名URI字符串作⽤前缀核⼼标签库<%@ taglib prefix=“c” uri=“/jsp/jstl/core” %>⽤于页⾯逻辑控制如:if、forEachc格式化标签库<%@ taglib prefix=“fmt” uri=“/jsp/jstl/fmt” %>⽤于执⾏格式操作如:格式化⽇期字符串fmt3. JSTL使⽤步骤1)、导⼊ jstl-1.2.jar 包,每个标签底层其实都是⽤ Java 代码实现的,复制 jar 包到 web/WEB-INF/lib ⽬录结构下;2)、创建 JSP 页⾯,使⽤ taglib 的指令引⽤标签库<%@ taglib prefix="c" uri="/jsp/jstl/core" %>3)、接下来就可以使⽤标签库定义好的标签了,例如:<c:if>⼆、核⼼标签库常⽤标签1. c: set 标签标签名使⽤<c:out value=“xxx”/>输出 xxx<c:out value="${age}"/>输出EL表达式 ${age} 获取的内容<c:out value=”${age}” default=”xxx”/>输出EL表达式 ${age} 获取的内容,当EL表达式内容不存在时输出 default 的内容2. c: out 标签标签名使⽤<c:set var=“a” value=“xxx”/>在pageContext中添加name为a,value为xxx的数据<c:set var=”a” value=”xxx” scope=”session”/>在session中添加name为a,value为xxx的数据3. c: if 标签属性名是否⽀持EL属性类型属性描述test⽀持,必须是EL boolean EL 中条件为真则执⾏标签体内容注意:没有对应 else 标签代码案例:<c:set var="a" value="hello"/><c:if test="${not empty a }"><c:out value="${a }"/></c:if>4. c: choose 标签作⽤:⽤于多分⽀判断(多条件判断)标签名作⽤chaoose类似于 Java 中的 switch,choose只是⼀个容器,包含下⾯两个元素when可以出现多个⽤于每个判断条件,类似于 switch 中 case。

javascript中foreach语句的用法

javascript中foreach语句的用法

javascript中foreach语句的用法JavaScript是一种广泛应用于网页开发的编程语言。

它具有强大的循环结构,其中包括了`forEach`语句。

`forEach`是一个Array对象的方法,用于遍历数组的每个元素,并对每个元素执行指定的回调函数。

`forEach`的语法如下:javascriptarray.forEach(function(currentValue, index, array) {执行回调函数的操作});这里有三个参数:- currentValue:当前要处理的数组元素的值。

- index(可选):当前元素在数组中的索引。

- array (可选):被遍历的数组。

`forEach`方法会遍历整个数组,对每个元素都执行一次回调函数。

回调函数是我们自己定义的,在其中可以对每个数组元素执行一些操作。

接下来,让我们深入了解`forEach`的用法及其实际应用。

步骤1:基本用法首先,我们来看一个基本的`forEach`例子,以便更好地理解它的工作原理。

假设我们有一个保存数字的数组,我们想要将这个数组中的每个元素打印出来。

javascriptvar numbers = [1, 2, 3, 4, 5];numbers.forEach(function(number) {console.log(number);});这段代码的输出将是:12345可以看到,`forEach`方法遍历了整个数组,并对每个元素使用回调函数打印出来。

步骤2:使用索引和原数组在上面的示例中,我们只使用了数组中的元素值。

然而,在某些场景下,我们可能还需要使用到每个元素在数组中的索引,或者需要操作原始的数组。

这时,可以通过提供额外的参数来传递这些信息。

javascriptvar fruits = ["apple", "banana", "orange"];fruits.forEach(function(fruit, index, array) {console.log("Fruit:", fruit);console.log("Index:", index);console.log("Array:", array);});这段代码将会输出:Fruit: appleIndex: 0Array: ["apple", "banana", "orange"]Fruit: bananaIndex: 1Array: ["apple", "banana", "orange"]Fruit: orangeIndex: 2Array: ["apple", "banana", "orange"]通过这个例子,我们可以看到,对于每个元素,我们都能够访问到它的值(`fruit`)、索引(`index`)和原数组(`array`)。

javascriptforEach通用循环遍历方法

javascriptforEach通用循环遍历方法

javascriptforEach通⽤循环遍历⽅法上⼀次的错误太多,排版也出现了问题,重写了⼀遍,希望⼤家⽀持.循环遍历⼀个元素是开发中最常见的需求之⼀,那么让我们来看⼀个由框架BASE2和Jquery的结合版本吧.var forEach = (function(){//数组与伪数组的遍历var _Array_forEach = function (array, block, context) {if (array == null) return;//对String进⾏特殊处理if(typeof array == 'string'){array = array.split('');}var i = 0,length = array.length;for (;i < length && block.call(context, array[i], (i+1), array)!==false; i++) {}};//对象的遍历var _Function_forEach = function (object, block, context) {for (var key in object) {//只遍历本地属性if (object.hasOwnProperty(key)&&block.call(context, object[key], key, object)===false){break;}}};return function(object, block, context){if (object == null) return;if (typeof object.length == "number") {_Array_forEach(object, block, context);}else{_Function_forEach(object, block, context);}};})()函数本⾝并不复杂,但很精巧。

JSP自定义标签及函数的使用

JSP自定义标签及函数的使用

JSP⾃定义标签及函数的使⽤JSP⾃定义标签及函数⾃定义标签tags⽂件⽅式在WEB-INF/tags⽬录下创建⼀个myTag.tag⽂件<%@ tag language="java" pageEncoding="UTF-8"%><%@ attribute name="message" type="ng.String" required="true" description="消息"%><h2>Hello ${message}!</h2>在JSP⽂件中使⽤myTag标签<%@ page pageEncoding="UTF-8"%><%@ taglib prefix="tags" tagdir="/WEB-INF/tags"%><html><body><tags:myTag message="this is my tag"></tags:myTag></body></html>输出结果为:Hello this is myTag!⾃定义标签TLD⽂件⽅式创建处理标签的类,重写doTag⽅法package com.yeyun.web.taglib.tags;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.SimpleTagSupport;public class MyTagSupport extends SimpleTagSupport{private String message;public void doTag() throws JspException, IOException {JspWriter writer = getJspContext().getOut();writer.println("Hello " + message + "!");}public void setMessage(String message) {this.message = message;}}在WEB-INF/tlds⽬录下创建⼀个myTld.tld⽂件(taglib description,标签库描述符)<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0"><description>JSTL 1.1 tag library</description><display-name>⾃定义标签</display-name><tlib-version>1.1</tlib-version><short-name>t</short-name><uri>/WEB-INF/tlds/myTld.tld</uri><tag><description>my⾃定义标签</description><name>myTag</name><tag-class>com.yeyun.web.taglib.tags.MyTagSupport</tag-class><body-content>empty</body-content><attribute><name>message</name><required>true</required><type>ng.String</type><description>消息</description></attribute></tag></taglib>JSP⽂件中使⽤myTag标签(uri与TLD⽂件中的uri⼀致)<%@ page pageEncoding="UTF-8"%><%@ taglib prefix="t" uri="/WEB-INF/tlds/myTld.tld"%><html><body><t:myTag message="this is my tld"/></body></html>输出结果为:Hello this is my tld!⾃定义标签函数创建⼀个静态⽅法package com.yeyun.web.taglib.fns;public class MyFunction {public static String getMessage(String message) {return "Hello " + message + "!";}}在WEB-INF/tlds⽬录下创建⼀个myFn.tld⽂件<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0"><description>JSTL 1.1 functions library</description><display-name>JSTL functions</display-name><tlib-version>1.1</tlib-version><short-name>fns</short-name><uri>/WEB-INF/tlds/myFn.tld</uri><function><description>获取信息</description><name>getMessage</name><function-class>com.yeyun.web.taglib.fns.MyFunction</function-class><function-signature>ng.String getMessage(ng.String)</function-signature><example>${fns:getMessage(message)}</example></function></taglib>JSP⽂件中使⽤⾃定义函数<%@ page pageEncoding="UTF-8"%><%@ taglib prefix="fns" uri="/WEB-INF/tlds/myFn.tld"%><html><body>${fns:getMessage("this is my function!")}</body></html>输出结果为:Hello this is my function!总结在使⽤任何标签库之前,必须在每个JSP⽂件的头部先引⼊标签库,然后在使⽤*.tld⽂件的格式参考jstl.jar下META-INF⽬录下的fn.tld及c.tldtag⽂件⽅式类似于freemarker的宏,可以创建⾃定义页⾯模板⽚段,供其他页⾯复⽤。

jsp中c标签的使用

jsp中c标签的使用

核心标签库它是JSTL中的核心库,为日常任务提供通用支持,如显示和设置变量、重复使用一组项目、测试条件和其他操作(如导入和重定向Web内容)。

Core标签按功能可分为4种类型:1 变量维护:(1)<c:set>:设置变量值和对象属性。

语法如下:<c:set value="值" var="变量名" scope="变量的作用域" target="对象名" property=" 对象属性名"></c:set>每种设置都有两种方式,总结起来,<c:set>的4种形式,如下所示:a. 使用标记属性设置JSP变量<c:set value="值" var="变量名" scope="作用域"/>b. 使用标记体设置JSP变量<c:set var="变量名" scope="作用域">标记内容</c:set>c. 使用标记属性设置对象属性<c:set value="变量名" target="对象名" property="对象属性名"/>d. 使用标记体设置对象属性<c:set target="对象名" property="作用域">标记内容</set>(2)<c:remove>:在指定作用域范围内删除变量。

语法如下:<c:remove var="变量名" scope="作用域"/>2 流程控制:分为条件标签和迭代标签。

条件标签:<c:if> <c:choose> <c:when> <c:otherwise>(1)<c:if>:与Java语言中的if语句的使用方法一样,但不能实现else的功能。

jstl中foreach用法

jstl中foreach用法

jstl中foreach用法一、JSTL中forEach的基本用法1. 在JSP页面中使用JSTL的forEach标签就像拥有了一个魔法棒,它能轻松地遍历集合。

比如说,你有一个存放着学生名字的List,就像一个装满宝贝的盒子。

`<c:forEach var="studentName"items="${studentNameList}">`,这里的`var`就像是给每个从盒子里拿出来的宝贝取个临时名字,`items`就是那个装满宝贝(学生名字)的盒子(集合)。

2. 假设你是一个图书管理员,有一个书架(数组)放着各种各样的书。

在JSTL中,你可以这样用forEach遍历这个书架。

`<c:forEachvar="book" begin="0" end="${bookArray.length - 1}">`,这里的`begin`和`end`就像是你从书架的第几本开始看,到第几本结束看,是不是很方便呢?3. 如果你的集合是一个Map,那forEach标签也能搞定。

这就好比你有一个装满各种水果和它们数量的篮子(Map),`<c:forEachvar="entry" items="${fruitMap}">`,这里的`entry`就是这个篮子里的每一组水果和数量的组合。

4. 想象一下,你有一个装满彩色珠子(字符串元素)的罐子(List)。

在JSP中,你可以用`<c:forEach var="bead"items="${beadList}">${bead}</c:forEach>`轻松地把每个珠子(字符串)拿出来展示,就像把罐子里的珠子一个一个摆在桌子上。

5. 好比你有一组朋友的年龄存放在一个数组里,就像一串数字挂在绳子上。

jsp自定义标签iterator遍历list

jsp自定义标签iterator遍历list

本文来自:iteartor标签演示List<String>的遍历,对于复杂的对象,则需要更为复杂的处理。

1、iteartor标签执行结果如下2、标签类IteratorTag.javapackage com.javaclubcn.tag;import java.util.Iterator;import java.util.List;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.TagSupport;public class IteratorTag extends TagSupport {private String name;private String value;private Iterator it;public String getName() {return name;}public void setName(String name) { = name;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}@Overridepublic int doAfterBody() throws JspException {// TODO Auto-generated method stubif(it.hasNext()){//取出String,并放置到request中,用于out标签的输出String outstr = (String)it.next();pageContext.getRequest().setAttribute(name, outstr);return TagSupport.EVAL_BODY_AGAIN;}else{return TagSupport.EVAL_PAGE;}}@Overridepublic int doStartTag() throws JspException {// TODO Auto-generated method stub//取出listList list = (List)pageContext.findAttribute(value);it = list.iterator();//先要取出一次if(it.hasNext()){//取出String,并放置到request中,用于out标签的输出String outstr = (String)it.next();pageContext.getRequest().setAttribute(name, outstr);}return TagSupport.EVAL_BODY_INCLUDE;}}3、标签配置tld文件javaclubcn-tag.tld,放到WEB-INF文件夹下。

jstl标签forEach的用法--遍历java的集合

jstl标签forEach的用法--遍历java的集合

jstl标签forEach的⽤法--遍历java的集合再讲<c:forEach>之前,现讲⼀下让EL表达式⽣效的语句<% @ page isELIgnored="false"%>这句语句在你想让EL表达式⽣效的情况下,必须要加载jsp中。

<c:forEach>中各个常⽤属性的解释如下:items:要遍历的集合,通常⽤EL表达式表⽰:pageContext.setAttribute("mylist",list); ${mylist}var:变量varStatus:变量的状态 varStatus的属性有index,和count.其中index从0开始数起,count:个数。

下⾯的代码讲了java中常⽤的集合:1 <%@ page import="java.util.ArrayList" %>2 <%@ page import="com.supwisdom.domain.Student" %>3 <%@ page import="java.util.HashMap" %>4 <%@ page language="java" contentType="text/html; charset=UTF-8"5 pageEncoding="UTF-8"%>6 <%--el表达式⽣效的语句--%>7 <%@page isELIgnored="false" %>8 <%@ taglib uri="/jsp/jstl/core" prefix="c" %>9 <%--防⽌调⽤函数时报错--%>10 <%@ taglib prefix="fn" uri="/jsp/jstl/functions"%>11 <html>12 <body>13 <h2>Hello World!</h2>14 <%--forEach的⽤法--%>15 <%--⽤forEach遍历list集合--%>16 <%17 ArrayList<String> strings = new ArrayList<String>();18 strings.add("王昭君");19 strings.add("西施");20 strings.add("霍去病");21 strings.add("杨开慧");22 pageContext.setAttribute("ouyangfeng",strings);23 %>24 <c:forEach var="item" items="${ouyangfeng}" varStatus="status">25 <c:out value="${item}"></c:out>26 status.index: <c:out value="${status.index}"></c:out>27 status.count:<c:out value="${status.count}"></c:out><br>28 </c:forEach>29 <%--遍历list对象的集合--%>30 <%31 Student student = new Student();32 student.setId(1);33 student.setName("zyh");34 student.setAge(16);35 Student student2 = new Student();36 student2.setId(2);37 student2.setName("ouyangfeng");38 student2.setAge(29);39 ArrayList<Student> students = new ArrayList<Student>();40 students.add(student);41 students.add(student2);42 pageContext.setAttribute("plump",students);43 %>4445 <c:forEach var="item" items="${plump}">46学⽣的姓名: <c:out value="${}"></c:out>47学⽣的年龄: <c:out value="${item.age}"></c:out>48学⽣的⾝份证号:<c:out value="${item.id}"></c:out>49 <br>50 </c:forEach>51 <%--遍历list数组集合--%>52 <%53 ArrayList<String[]> sixi = new ArrayList<String[]>();54 String[] str= new String[]{"country","china"};55 String[] str2=new String[]{"address","NewYork"};56 String[] str3= new String[]{"student","pupil"};57 sixi.add(str);58 sixi.add(str2);59 sixi.add(str3);60 pageContext.setAttribute("array",sixi);61 %>62 <c:forEach var="item" items="${array}">63 <c:out value="${item[0]}"></c:out> <%--数组中的第⼀个元素--%>64 <c:out value="${item[1]}"></c:out> <%--数组中的第⼆个元素--%>65 <br>66 </c:forEach>67 <%--遍历map集合--%>68 <%69 HashMap<String, String> map = new HashMap<String, String>();70 map.put("China","Reservation");71 map.put("France","Romantic");72 map.put("America","Innovation");73 pageContext.setAttribute("hashmap",map);74 %>75 <c:forEach var="item" items="${hashmap}">76键是:<c:out value="${item.key}"></c:out>77值是:<c:out value="${item.value}"></c:out><br>78 </c:forEach>79 </body>80 </html>tomcat运⾏的结果为:1 Hello World!23王昭君 status.index: 0 status.count:14西施 status.index: 1 status.count:25霍去病 status.index: 2 status.count:36杨开慧 status.index: 3 status.count:47学⽣的姓名: zyh 学⽣的年龄: 16 学⽣的⾝份证号:18学⽣的姓名: ouyangfeng 学⽣的年龄: 29 学⽣的⾝份证号:29 country china10 address NewYork11 student pupil12键是:France 值是:Romantic13键是:America 值是:Innovation14键是:China 值是:Reservation。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【文章标题】在JSP中用自定义标签实现集合的遍历——山寨版<c:foreach>
【文章作者】曾健生
【作者邮箱】zengjiansheng1@
【作者QQ】190678908
******************************************************************************* 在JSTL中,标签<c:foreach></c:foreach>可方便地遍历集合或数组,在了解了自定义标签后,可动手实现<c:foreach>标签的功能。

在编写自定义标签前,总要把实验环境搭建好^-^
首先,定义一个Person类,在实验的集合中就是存放这个类的实例,代码如下:package com.javaeye.newjueqi;
/**
*实验类Person
*/
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public int getAge() {
return age;
}
public void 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:forEach items="${pageScope.personlist}" var="per">
${ } -- ${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.age } <br>
</newjueqi:myforEach>
效果如图1 所示
下面是正式的代码:
1.编写一个自定义的标签类。

/**
*完成模拟<c:forEach>标签遍历集合的功能
*/
public void doTag() throws JspException, IOException {
// 定义一个迭代器
Iterator i=null;
//如果集合是Colleciton类型
if( items instanceof Collection )
{
//获取Collection的迭代器
i=( (Collection)items).iterator();
}
//如果集合是数组类型
else if( items instanceof Object[] )
{
//用Arrays的静态方法asList把数组转换为一个List集合,由于asList接受的参数
//是可变参数,所以为了防止转换出错必须要把传入的参数强制为数组
i=Arrays.asList((Object[])items).iterator();
}
else
{
throw new RuntimeException("不能转换");
}
//进行迭代
while( i.hasNext() )
{
//取得集合中迭代器指向的对象
Object obj=i.next();
//用setAttribute方法把对象和指定的变量连接起来
//例如标签中有属性var="per",标签体中有EL表达式式:$()
//写了下面的一句话后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="/myforEach" %>
4.在JSP页面中使用自定义标签测试实际的效果。

<!-- 使用自定义标签模拟实现<c:forEach>中集合的遍历功能 -->
<newjueqi:myforEach items="${pageScope.personlist}" var="per"> ${ } -- ${per.age } <br>
</newjueqi:myforEach>
运行的实际效果如图1所示
结语:这个自定义标签遍历集合的功能还不完善,譬如不能遍历Map集合中的元素,但它们的编写思路是一致的,Map集合中需要进一步封装对象。

相关文档
最新文档