自定义标签的开发及使用自定义标签实现迭代foreach循环

在JSP中,规范简化了标签库的开发,在JSP2中开发自定义标签只需如下三个步骤:

一、开发自定义标签处理类

二、建立一个*.tld文件

三、在JSP文件中使用自定义标签

自定义标签类应该继承一个父类:javax.servlet.jsp.tagext.SimpleTagSupport,除此之外,JSP自定义标签类还有如下要求:

一、如果标签类包含属性,每个属性都需要提供对应的getter和setter方法

二、重写doTag()方法,这个方法负责生成页面内容

下面开始标签的开发:

一、开发自定义标签处理类 ForeachTag,实现迭代List集合,数组的功能

public class ForeachTag extends SimpleTagSupport {
// 标签属性
private String items;
private String var;
//这里省略 getter setter方法

@Override
public void doTag() throws JspException, IOException {
Iterator ite = null;
Object tempItem = getJspContext().getAttribute(items);
// 如果是集合
if (tempItem instanceof Collection) {
ite = ((Collection) tempItem).iterator();
}
// 如果是数组
else if (tempItem instanceof Object[]) {
ite = Arrays.asList((Object[]) tempItem).iterator();
} else {
throw new RuntimeException("不能转换");
}
// 进行迭代
while (ite.hasNext()) {
Object obj = ite.next();
getJspContext().setAttribute(var, obj);
//输出标签体
getJspBody().invoke(null);
}
}

}

二、开发*.tld文件。在web-inf目录下新建mytaglib.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>this is my tag library Definition</description>
<tlib-version>1.0</tlib-version>
<short-name>mytaglib</short-name>
<uri>http://127.0.0.0/servlet/mytaglib</uri>

<tag>
<name>foreach</name>
<tag-class>taglib.ForeachTag</tag-class>
<body-content>scriptless</body-content>

<!-- 指定foreach循环中的items属性和var属性 -->
<attribute>
<name>items</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>

</taglib>

三、开发JSP,并在JSP中使用自定义的标签实现list集合的迭代

<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" errorPage="" %>
<%@page import="java.util.*" %>
<%@taglib uri="http://127.0.0.0/servlet/mytaglib" prefix="mytag" %>
<%
List<String> lists=new ArrayList<String>();
lists.add("疯狂Java讲义");
lists.add("轻量级JavaEE企业级应用");
lists.add("疯狂Ajax讲义");
pageContext.setAttribute("lists",lists);

String[] ary=new String[3];
ary[0]="A";
ary[1]="B";
ary[2]="C";
pageContext.setAttribute("ary",ary);
%>
<html>
<head>
<title>自定义标签-仿foreach标签 功能:循环List集合,一维数组</title>
</head>
<body>
<h3>这里迭代的是集合</h3>
<table style="border:solid 1px black; width=400xp;">
<mytag:foreach items="lists" var="item">
<tr>
<td>${item }</td>
</tr>
</mytag:foreach>
</table>
<br />
<h3>这里迭代的是数组</h3>
<mytag:foreach items="ary" var="item">
${item }&nbsp;
</mytag:foreach>

</body>
</html>

JSP文件中需注意的问题:使用<%@taglib %>导入自定义开发的标签,uri路径与mytaglib.tld文件中指定的uri路径相同

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以在自定义类中实现 IEnumerable 接口,并在该接口中实现 GetEnumerator 方法,返回一个 IEnumerator 对象,然后就可以使用 foreach 循环遍历该自定义类的实例了。具体实现可以参考以下代码: class MyClass : IEnumerable { private int[] data = { 1, 2, 3, 4, 5 }; public IEnumerator GetEnumerator() { return new MyEnumerator(data); } private class MyEnumerator : IEnumerator { private int[] data; private int position = -1; public MyEnumerator(int[] data) { this.data = data; } public object Current { get { return data[position]; } } public bool MoveNext() { position++; return (position < data.Length); } public void Reset() { position = -1; } } } // 使用 foreach 遍历 MyClass 的实例 MyClass myClass = new MyClass(); foreach (int i in myClass) { Console.WriteLine(i); } ### 回答2: 要在C#中自定义实现foreach功能,需要实现一个可迭代的接口(Iterable Interface)和一个迭代器(Iterator)。 首先,我们的自定义类需要实现一个可迭代的接口,该接口定义了一个用于返回迭代器的方法。通常,这个接口是IEnumerable。使用范型,我们可以定义一个可迭代的接口,接受我们自定义类中的类型作为参数。 接下来,我们需要在自定义类中实现一个迭代器(Iterator)。这个迭代器需要实现一个MoveNext方法和一个Current属性。MoveNext方法用于移动迭代器到下一个元素,并返回一个布尔值,指示是否有更多元素可迭代。Current属性用于获取当前迭代器位置的元素。 下面是一个示例,演示了如何在自定义类中实现foreach功能: ```csharp using System; using System.Collections; using System.Collections.Generic; namespace CustomClassForeachDemo { // 自定义类 class MyCollection<T> : IEnumerable<T> { private T[] elements; public MyCollection(T[] array) { elements = array; } public IEnumerator<T> GetEnumerator() { return new MyEnumerator<T>(elements); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } // 迭代器 class MyEnumerator<T> : IEnumerator<T> { private T[] elements; private int position = -1; public MyEnumerator(T[] array) { elements = array; } public T Current { get { return elements[position]; } } object IEnumerator.Current { get { return Current; } } public bool MoveNext() { position++; return (position < elements.Length); } public void Reset() { position = -1; } public void Dispose() { // 清理资源 } } class Program { static void Main(string[] args) { // 使用自定义类 string[] array = { "A", "B", "C" }; MyCollection<string> collection = new MyCollection<string>(array); foreach (string element in collection) { Console.WriteLine(element); } } } } ``` 在上述示例中,我们首先创建了一个自定义类MyCollection,它实现了IEnumerable<T>接口。在GetEnumerator方法中,我们创建了一个自定义迭代器MyEnumerator<T>。然后,在Main方法中,我们创建了一个MyCollection<string>对象,并使用foreach语句迭代遍历了数组中的元素。 运行上述代码,会输出以下结果: ``` A B C ``` 通过以上实现,在自定义的类中就可以使用foreach语句进行迭代操作了。 ### 回答3: 在C#中,如果想要使用自定义类的对象来进行foreach循环,需要在该自定义类中实现 IEnumerable 接口。这个接口定义了一个 GetEnumerator 方法,使得类的对象可以返回一个可枚举的枚举器。以下是一个实现示例: ```csharp using System; using System.Collections; // 自定义类 public class MyClass { public int[] numbers; // 构造函数 public MyClass() { // 初始化数组 numbers = new int[] { 1, 2, 3, 4, 5 }; } // 实现 GetEnumerator 方法 public IEnumerator GetEnumerator() { return numbers.GetEnumerator(); } } class Program { static void Main(string[] args) { // 创建 MyClass 对象 MyClass myObject = new MyClass(); // 使用 foreach 进行迭代 foreach (int num in myObject) { Console.WriteLine(num); } } } ``` 在上述示例中,MyClass 类实现了 IEnumerable 接口,并在GetEnumerator方法中返回了 numbers 数组的枚举器。程序中创建了 MyClass 类对象 myObject,并使用 foreach 进行迭代操作,以输出 numbers 数组中的元素。 使用自定义类在 foreach 循环中进行迭代需要实现 IEnumerable 接口,并在 GetEnumerator 方法中返回一个可枚举的枚举器。这样就可以像对待数组或集合一样对待自定义类的对象,并使用 foreach 进行迭代操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值