JSP自定义标签(三)域对象的使用
本文介绍一下域对象的使用,实现具有foreach功能的JSP自定义标签。
关键代码在pageContext.getRequest(),同样,获取JSP的其它域对象也可以从pageContext中获取,在设计具有foreach这样具有循环迭代功能的标签时,需要在域对象中暂存所需的值,然后通过EL表达式取出。
Java代码:
package com.yt.tag.fore; import java.io.IOException; import java.util.List; import java.util.Map; import javax.servlet.ServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.tagext.BodyTagSupport; public class Foreach extends BodyTagSupport { private static final long serialVersionUID = 6575296715646088842L; //取出对象的值数组 private Object[] values; //用于遍历数组的索引 private int index = 0; //默认key名字叫item private String var = "item"; //用于接收集合的参数 private Object items; @Override public int doStartTag() throws JspTagException { //初始化值数组,将List或者Map的值取出 System.out.println("doStartTag"); if (items instanceof List) { values = ((List) items).toArray(); } else if (items instanceof Map) { values = ((Map) items).values().toArray(); } if (values.length > 0) { return EVAL_BODY_BUFFERED; } else { return SKIP_BODY; } } @Override public int doAfterBody() throws JspTagException { System.out.println("doAfterBody"); //获取数据缓存域,这里取Request(context,page,session看需求选则) ServletRequest request = pageContext.getRequest(); if (index < values.length) { //如果还没遍历完数组,就继续遍历,将值放到缓存域中(页面通过EL表达式取出) request.setAttribute(var, values[index++]); return EVAL_BODY_BUFFERED; }else { //遍历完数组,那就输出全部内容 try { if (bodyContent != null) bodyContent.writeOut(bodyContent.getEnclosingWriter()); } catch (IOException e) { e.printStackTrace(); } //为了不影响下一次的使用,清除缓存域(可以放到doEndTag()方法中) request.removeAttribute(var); return SKIP_BODY; } } @Override public int doEndTag() throws JspException { //标签结束,初始化参数(此对象实例可能会被多次调用,初始化参数防止对下一次调用会产生影响) index = 0; values = null; return SKIP_BODY; } public String getVar() { return var; } public void setVar(String var) { this.var = var; } public Object getItems() { return items; } public void setItems(Object items) { this.items = items; } }
.tld配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>simple</short-name> <uri>/css_fore_tag</uri> <tag> <name>forEach</name> <tag-class>com.yt.tag.fore.Foreach</tag-class> <body-content>JSP</body-content> <attribute> <name>var</name> <type>String</type> </attribute> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
JSP页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="java.util.Map"%> <%@page import="java.util.HashMap"%> <%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <!-- 引入标签库 --> <%@ taglib uri="/css_fore_tag" prefix="tag"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <% List list = new ArrayList(); list.add("AAA"); list.add("BBB"); list.add("CCC"); list.add("DDD"); request.setAttribute("list", list); Map<String,Object> map = new HashMap(); map.put("AAA","AAA"); map.put("BBB","BBB"); map.put("CCC","CCC"); request.setAttribute("map", map); %> <body> <tag:forEach items="${list}" var="item">${requestScope.item}</tag:forEach> <br/> <tag:forEach items="${map}">${requestScope.item}</tag:forEach> </body> </html>
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY