JSP自定义标签(一)
分四次介绍吧,先来实现一些简单的,结尾附上项目工程目录。
一、打造最简单的自定义标签
package com.yt.tag.simple; import java.io.IOException; import javax.servlet.jsp.JspContext; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspTag; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * 没有任何作用的标签 * @author ChenSS on 2017年6月15日 */ public class SimpleTag extends SimpleTagSupport { /** * 自定义标签的处理内容 */ @Override public void doTag() throws JspException, IOException { getJspBody().invoke(null); //TODO: 定义代码逻辑,上面一行标签内容原样输出 } /** * 父级标签:标签嵌套可能用到,不需要重写此方法 */ @Override public JspTag getParent() { return super.getParent(); } /** * 获取上下文:获取一些页面信息会用到,不需要重写此方法 */ @Override protected JspContext getJspContext() { return super.getJspContext(); } }
二、自定义标签属性
package com.yt.tag.simple; import java.io.IOException; import java.io.StringWriter; import java.sql.Date; import java.text.SimpleDateFormat; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class DateTag extends SimpleTagSupport { StringWriter writer = new StringWriter(); /** * 自定义属性 */ String pattern; /** * JSP页面上的属性值会通过set方法注入 * * @param pattern */ public void setPattern(String pattern) { this.pattern = pattern; } @Override public void doTag() throws JspException, IOException { if (pattern == null) { getJspBody().invoke(null); } else { //日期转换 getJspBody().invoke(writer); Date date = Date.valueOf(writer.toString()); SimpleDateFormat formatter = new SimpleDateFormat(pattern); getJspContext().getOut().println(formatter.format(date)); } } }
三、实现日期转换标签
package com.yt.tag.simple; import java.io.IOException; import java.sql.Date; import java.sql.Timestamp; import java.text.SimpleDateFormat; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class DatePlusTag extends SimpleTagSupport { private String pattern; private String date; public void setPattern(String pattern) { this.pattern = pattern; } public void setDate(String date) { this.date = date; } @Override public void doTag() throws JspException, IOException { SimpleDateFormat formatter = new SimpleDateFormat(pattern); String strDate = null; try { if (date.length() < 10) { strDate = formatter.format(Date.valueOf(date)); } else { strDate = formatter.format(Timestamp.valueOf(date)); } } catch (Exception e) { strDate = e.getMessage(); } getJspContext().getOut().println(strDate); } }
四、.tld配置文件
写完自定义标签的实现类,在WEB-INF目录下编写.tld文件,simple.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_simple_tag</uri> <!-- 最简单的标签 --> <tag> <name>simple</name> <tag-class>com.yt.tag.simple.SimpleTag</tag-class> <body-content>scriptLess</body-content> </tag> <!-- 测试自定义标签属性 --> <tag> <name>date</name> <tag-class>com.yt.tag.simple.DateTag</tag-class> <body-content>scriptLess</body-content> <attribute> <name>pattern</name> <required>true</required> <type>String</type> </attribute> </tag> <!-- 实现日期转换标签,包含两个属性 --> <tag> <name>date2</name> <tag-class>com.yt.tag.simple.DatePlusTag</tag-class> <body-content>empty</body-content> <attribute> <name>pattern</name> <required>true</required> <type>String</type> </attribute> <attribute> <name>date</name> <required>true</required> <type>String</type> </attribute> </tag> </taglib>
五、JSP页面中使用自定义标签
JSP页面名为simple_tag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 引入命名空间 --> <%@ taglib uri="/css_simple_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> <body> <tag:simple>sdsafadsfaads</tag:simple> <tag:date pattern="yyyy-MM-dd HH:mm:ss">2013-3-4</tag:date> <tag:date2 pattern="yyyy-MM-dd HH:mm:ss" date="2013-3-4 23:12:4.1" /> </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