jsp自定义标签模拟foreach

java代码:

package com.zx.tag;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class EachTag extends SimpleTagSupport {
	//1.获取要遍历的结果集
	private List item;
	private String var;
	
	public void setItem(List item) {
		this.item = item;
	}

	public void setVar(String var) {
		this.var = var;
	}

	@Override
	public void doTag() throws JspException, IOException {
		System.out.println(var);
		//2.对结果集进行遍历
		for(Object o : item) {
			System.out.println(o+",");
			//3.将对应键值对放入作用域
			this.getJspContext().setAttribute(var, o);
			this.getJspBody().invoke(null);
		}
	}
}

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>自定义标签</description>
	<display-name>zdytag</display-name>
	<tlib-version>1.0</tlib-version>
	<!-- zy:ip -->
	<short-name>zy</short-name>
	<uri>http://www.zhuoxun/jxb</uri>
	<tag>
		<description>这个标签用来遍历结果集</description>
    	<name>each</name>
    	<tag-class>com.zx.tag.EachTag</tag-class>
    	<body-content>scriptless</body-content>
    	<attribute>
    		<description>结果集</description>
    		<name>item</name>
    		<required>true</required>
    		<rtexprvalue>true</rtexprvalue>
    	</attribute>
    	<attribute>
    		<description>获取作用域中键值对的key</description>
    		<name>var</name>
    		<required>true</required>
    		<rtexprvalue>true</rtexprvalue>
    	</attribute>
	</tag>
</taglib>

html代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://www.zhuoxun/jxb" prefix="zy"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>main</title>
</head>
<body>
	<%	
		List<String> list = new ArrayList<>();
		list.add("打篮球");
		list.add("看电视");
		list.add("踢足球");
		request.setAttribute("list", list);
	%>
	<!-- 自定义标签完成c:forEach的功能 -->
	<ul>
		<!-- !!!!!自定义标签中属性的值是作用域中键值对的key!!!! -->
		<zy:each item="${list }" var="one">
		<!-- el表达式是从作用域(大到小)中获取key为one的键值对 -->
			<li>${one}</li>
		</zy:each>
	</ul>
</body>
</html>

注意:
  java中的属性名item、var,准确的说要和java中的set方法中set后面的东西一致(setItem)
  tld中的tag/attribute/name
  html中的zy:each里面的item、var
  这三个位置的字段名要一样,也必须一样

其他

自己建立了一个技术群,大家愿意主动学习和分享,愿意一块实现一些有意思的技术,进行理论和实践的交流。这里面有前端和后段,不是单一的一种,方便大家沟通前后端兼容问题
image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值