一步一步教你写自己的java自定义标签
平时我们使用Struts1、Struts2的标签感觉很好用,那么他们的标签是怎么写的呢? 下面就交大家手把手的写一个自己的标签
其实 java中的自定义标签包含3部分,
1 一个继承自javax.servlet.jsp.tagext.TagSupport类的实现类,
需要覆盖 doStartTag 、doEndTag方法,即跟父类的方法参数、返回值类型相同,重写方法体。
注意他是j2ee包的内容,jdk的API中是没有的,所以我们写的标签只能再web应用中使用
2 对自定义标签进行声明,直白一点说就是需要描述自定义标签的名字,需要哪些参数等信息
3 再有就是讲自定义标签库注册到web.xml中,只有这样我们才能在jsp或者其他展现层模板中使用。
好,话不多说,下面进入操作流程,
我的思路是这样的, 我们写一个迭代的标签, 标签通过迭代将信息展现在页面上,展现形式为一个表格。
入参:
1 td的个数 columnSize int类型
2 标题集合 titles ,是一个List<String> 类型
3 循环的数据 data 是一个 List<String []> 类型,List的每一个元素String数组为一列,
首先第一步我们写个一MyIteratorTag类继承 TagSupport
1 声明三个属性,并设置setter、getter方法
private List<String> titles = null; private List<String []> data = null; private int columnSize = 0; public List<String> getTitles() { return titles; } public void setTitles(List<String> titles) { this.titles = titles; } public List<String[]> getData() { return data; } public void setData(List<String[]> data) { this.data = data; } public int getColumnSize() { return columnSize; } public void setColumnSize(int columnSize) { this.columnSize = columnSize; }
2重写 doStartTag方法,因为继承了TagSupport,TagSupport中会声明一个PageContext pageContext对象代表调用标签的当前JSP
所以我们可以获取父类中的pageContext对象的JspWriter属性,相当于在JSP中使用out.write想客户端发送html代码
JspWriter out = this.pageContext.getOut();
完整的doStartTag方法如下:
@Override public int doStartTag() throws JspException { JspWriter out = this.pageContext.getOut(); StringBuffer sf = new StringBuffer(); sf.append("<table style='width:80;' border='1' >"); if(this.data==null || this.data.isEmpty()){ sf.append(" <tr>"); sf.append(" <td>"); sf.append(" <B> No Valid Data List is NULL </B> "); sf.append(" </td>"); sf.append(" </tr>"); }else{ if(titles==null || titles.isEmpty()){ sf.append(" <tr>"); sf.append(" <td colspan='"+columnSize+"'>"); sf.append(" <B> No Valid Titles ,titles is NULL </B> "); sf.append(" </td>"); sf.append(" </tr>"); }else{ sf.append(" <tr>"); for (int i = 0; i < titles.size(); i++) { sf.append(" <td>"); sf.append(" "+titles.get(i)+" "); sf.append(" </td>"); } sf.append(" </tr>"); } for (int i = 0; i < data.size(); i++) { String[] trs = data.get(i); sf.append(" <tr>"); for (int j = 0; j < trs.length; j++) { System.out.print(trs[j]+"\t"); sf.append(" <td>"); sf.append(" "+trs[j]+" "); sf.append(" </td>"); } System.out.println(); sf.append(" </tr>"); } } sf.append("</table>"); try { out.print(sf.toString()); } catch (IOException e) { e.printStackTrace(); throw new JspException(e.getMessage()); } return super.doEndTag(); }
接下来就是对标签进行表述
我们在WEB-INF目录下创建一个my-taglib.tld文件,当然一个描述文件可以存在多个标签,即多个<tag>节点 本文中就一个内容如下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.2</tlibversion> <jspversion>1.1</jspversion> <shortname>myLib</shortname> <uri>http://struts.apache.org/tags-html</uri> <tag> <name>iter</name> <!-- 标签对应的名称 --> <tagclass>org.jshand.mytaglib.iterator.MyIteratorTag</tagclass> <!-- 标签对应的类 --> <bodycontent>empty</bodycontent> <!-- 三个属性 --> <attribute> <name>columnSize</name> <!-- columnSize属性 --> <required>true</required> <!-- 是否必须项 --> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>titles</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>data</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
上面都做完了,接下来就是最后一步注册到web.xml
在web.xml的<web-app>表现中添加<taglib>标签即可,如下
<taglib> <!-- 对应的uri jsp中声明的需要用到 --> <taglib-uri>my-taglib</taglib-uri> <!-- 对应标签描述文件所在的位置 --> <taglib-location>/WEB-INF/my-taglib.tld</taglib-location> </taglib>
上面都做完了我们的标签也就写完了, 但是我们需要看下效果如何,我们在index.jsp中使用一下
1 在index.jsp头部添加标签声明
<%@ taglib uri="my-taglib" prefix="myTag"%>
2 使用java脚本组织一下需要用到的数据,放到request中,当然实际使用中参数都是后台传过来的。
<% List title = new ArrayList(); title.add("id"); title.add("name"); title.add("age"); title.add("sex"); List data = new ArrayList(); data.add(new String[]{"001","小明","27","男"}); data.add(new String[]{"002","小刚","25","女"}); data.add(new String[]{"003","小张","26","男"}); data.add(new String[]{"004","小王","28","女"}); request.setAttribute("title" ,title); request.setAttribute("data" ,data); %>
3 使用标签:就想我们经常看到的Struts的标签一样,使用起来就是一个简单的标签就搞定
<myTag:iter columnSize="4" titles="${title}" data="${data}" />
4 发布一下应用,(当然是我们的web工程),访问工程,默认进入index.jsp能够看到四条数据展现在页面,ok大功告成!!
id name age sex
001 小明 27 男
002 小刚 25 女
003 小张 26 男
004 小王 28 女
完整的 web工程请 详见附件
相关推荐
总之,掌握TLD自定义标签是提升Java Web开发技能的重要一步。通过创建和使用自定义标签,你可以更好地组织代码,使JSP页面更加简洁,易于理解和维护。这个基础入门级的demo是理解TLD的一个良好起点,希望对你有所...
在Java服务器页面(JSP)技术中,自定义标签是扩展功能的一种强大方式,它允许开发者创建可重用的组件,提高代码的可读性和可维护性。本示例源码着重于展示如何开发和使用自定义标签,帮助初学者快速理解和应用这一...
最后一步是在 JSP 页面中使用自定义标签。下面是一个简单的示例: ```jsp ;charset=UTF-8" %> 使用自定义标签 使用自定义标签: ``` ### 小结 通过上述步骤,我们成功地创建了一个简单的自定义...
### Taglib自定义标签库详解 #### 一、Taglib简介与作用 Taglib,即Tag Library(标签库),是JavaServer Pages (JSP) 技术中的一个重要组成部分,允许开发者创建可重用的定制标签,这些标签可以封装复杂的业务...
**JSP自定义标签**是JavaServer Pages(JSP)技术的一个强大特性,它允许开发者创建可重用的、自定义的行为组件,以扩展HTML或XML文档的功能。...理解和掌握自定义标签的创建和使用,是提升JSP开发技能的重要一步。
例如,一个自定义标签可能用于处理用户登录,而不是在每个需要登录验证的地方重复写相同的代码。 Java技术中的标记库分为两种类型:标准标记库(JSTL,JavaServer Pages Standard Tag Library)和自定义标记库...
在安卓开发中,自定义线性图表是一种常见的需求,它能...通过分析和运行这些文件,你可以更好地理解并实践上述步骤,从而实现自己的安卓自定义线性图表。在开发过程中,记得不断调试和优化,确保图表的清晰度和流畅性。
4. **自定义安装路径**:这是非常重要的一步,不要直接默认安装在C盘,因为JDK占用的空间会随着时间增加。建议选择一个非系统盘,如D盘或E盘,创建一个新的文件夹,如"D:\Java\JDK",然后在此处进行安装。 5. **配置...
EL自定义函数可以让开发者扩展EL的功能,通过定义自己的函数来处理复杂的逻辑,而无需在JSP页面中编写Java代码片段。接下来将详细介绍EL自定义函数的实现步骤,并通过一个具体的示例来展示如何实现。 #### 1. 开发...
1. **创建布局文件**:首先,你需要在res/layout目录下创建一个新的XML布局文件,定义自定义控件的视图结构。这可能包含TextView、ImageView、Button等多种基本控件,通过`<merge>`标签来减少嵌套层级,提高性能。 ...
在"一步一步学会配置Kjava开发环境.pdf"这份文档中,你可能会找到更详细的步骤指导,而"中国IT认证实验室学习下载频道.txt"可能是提供进一步学习资源的地方。通过阅读这些资料,你将能够更深入地理解和掌握Java开发...
在这个类中,你需要重写一些关键方法来实现自定义的行为。 2. `onMeasure()`方法:这是计算视图大小的重要方法。在这里,我们需要遍历所有子视图,测量它们的尺寸,并根据这些尺寸来确定整个ViewGroup的大小。 3. `...
【标签】"java写的五子棋 五子棋java"进一步强调了这个软件是用Java语言实现的,对于Java程序员和爱好者来说,这是一个学习和研究的好例子。Java作为一种跨平台的编程语言,拥有广泛的社区支持和丰富的库资源,因此...
1. 在XML布局中使用:在布局文件中,我们可以像使用其他内置组件一样使用自定义View,并通过`<attr>`标签定义自定义属性。 2. 在代码中动态添加:也可以在Activity或Fragment的代码中实例化自定义View,并添加到...
如何撰写自定义JSF组件:全面解析与实践指南 引言 JavaServer Faces(简称JSF)是一项基于组件的方法构建用户界面的技术。它通过UI组件作为构建模块简化了开发过程,大幅度减少了代码量,并允许在不同项目间重复...
**自定义Struts**是一种基于Java的技术,用于构建企业级Web应用程序。在传统的JSP(JavaServer Pages)和Servlet开发中,代码往往混杂在视图层和控制层,这不利于项目的维护和扩展。Struts框架就是为了克服这些局限...
我们可以为每根柱子创建一个区域,用JList或自定义组件展示盘子,通过监听按钮事件来响应用户的移动操作。 游戏的逻辑部分主要包含两部分:一是将汉诺塔问题转化为递归算法,二是确保每次移动都符合规则。汉诺塔...
在Java编程领域,创建一个具有历史记录功能的计算器是一项常见的练习任务,旨在提升开发者对GUI(图形用户界面)设计、事件处理以及数据存储的理解。在这个项目中,我们看到的"java计算器,带历史记录功能"显然包含...