`

一步一步教你写自己的java自定义标签

阅读更多

一步一步教你写自己的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工程请 详见附件


 

0
2
分享到:
评论
10 楼 314649444 2013-06-30  
TopLongMan 写道
很好,基础的知识。

感谢留言~~~~
9 楼 TopLongMan 2013-06-28  
很好,基础的知识。
8 楼 314649444 2013-06-28  
apple.shan 写道
什么年代了,还写jsp标签,来点新鲜的好不好!

我只是单纯的 把标签 的实现方式写了一下,而且 我个人认为标签用处很多吧,本文只是一个例子,而且我也说了, 我实现的这个标签没有实际意义,只是一个抛砖引玉的思路~

我感觉freemarker 也并不能完全的替换掉JSP的地位,jsp标签 和freemarker使用的场景也不完全一样。
7 楼 ahack 2013-06-27  
apple.shan 写道
什么年代了,还写jsp标签,来点新鲜的好不好!

freemarker的也算不上新鲜了,貌似没有比freemarker更好使的标签了。
6 楼 apple.shan 2013-06-27  
什么年代了,还写jsp标签,来点新鲜的好不好!
5 楼 314649444 2013-06-27  
ahack 写道
你这写的太死了,不应该在代码里面输出标签。


感谢指正,我本文就是 实现一个最简单的的自定义标签,实际上我的这个标签页没有太多意义。
4 楼 ahack 2013-06-27  
你这写的太死了,不应该在代码里面输出标签。
3 楼 guojch 2013-06-27  
jinnianshilongnian 写道
如果你的代码不是很复杂 可以考虑如下方式,更简单方便
https://github.com/zhangkaitao/es/blob/master/web/src/main/webapp/WEB-INF/tags/page.tag


+1
2 楼 jinnianshilongnian 2013-06-27  
如果你的代码不是很复杂 可以考虑如下方式,更简单方便
https://github.com/zhangkaitao/es/blob/master/web/src/main/webapp/WEB-INF/tags/page.tag
1 楼 lpyy00892012 2013-06-27  

相关推荐

    tld自定义标签基础入门demo

    总之,掌握TLD自定义标签是提升Java Web开发技能的重要一步。通过创建和使用自定义标签,你可以更好地组织代码,使JSP页面更加简洁,易于理解和维护。这个基础入门级的demo是理解TLD的一个良好起点,希望对你有所...

    JSP自定义标签示例源码

    在Java服务器页面(JSP)技术中,自定义标签是扩展功能的一种强大方式,它允许开发者创建可重用的组件,提高代码的可读性和可维护性。本示例源码着重于展示如何开发和使用自定义标签,帮助初学者快速理解和应用这一...

    jsp自定义简单标签

    最后一步是在 JSP 页面中使用自定义标签。下面是一个简单的示例: ```jsp ;charset=UTF-8" %&gt; 使用自定义标签 使用自定义标签: ``` ### 小结 通过上述步骤,我们成功地创建了一个简单的自定义...

    Taglib自定义标签库

    ### Taglib自定义标签库详解 #### 一、Taglib简介与作用 Taglib,即Tag Library(标签库),是JavaServer Pages (JSP) 技术中的一个重要组成部分,允许开发者创建可重用的定制标签,这些标签可以封装复杂的业务...

    JSP自定义标签

    **JSP自定义标签**是JavaServer Pages(JSP)技术的一个强大特性,它允许开发者创建可重用的、自定义的行为组件,以扩展HTML或XML文档的功能。...理解和掌握自定义标签的创建和使用,是提升JSP开发技能的重要一步。

    标记库,tag实例,java技术

    例如,一个自定义标签可能用于处理用户登录,而不是在每个需要登录验证的地方重复写相同的代码。 Java技术中的标记库分为两种类型:标准标记库(JSTL,JavaServer Pages Standard Tag Library)和自定义标记库...

    安卓自定义线性图表

    在安卓开发中,自定义线性图表是一种常见的需求,它能...通过分析和运行这些文件,你可以更好地理解并实践上述步骤,从而实现自己的安卓自定义线性图表。在开发过程中,记得不断调试和优化,确保图表的清晰度和流畅性。

    Java开发环境JDK的安装教程

    4. **自定义安装路径**:这是非常重要的一步,不要直接默认安装在C盘,因为JDK占用的空间会随着时间增加。建议选择一个非系统盘,如D盘或E盘,创建一个新的文件夹,如"D:\Java\JDK",然后在此处进行安装。 5. **配置...

    EL自定义函数引用

    EL自定义函数可以让开发者扩展EL的功能,通过定义自己的函数来处理复杂的逻辑,而无需在JSP页面中编写Java代码片段。接下来将详细介绍EL自定义函数的实现步骤,并通过一个具体的示例来展示如何实现。 #### 1. 开发...

    自定义组合控件

    1. **创建布局文件**:首先,你需要在res/layout目录下创建一个新的XML布局文件,定义自定义控件的视图结构。这可能包含TextView、ImageView、Button等多种基本控件,通过`&lt;merge&gt;`标签来减少嵌套层级,提高性能。 ...

    JAVA开发环境配置

    在"一步一步学会配置Kjava开发环境.pdf"这份文档中,你可能会找到更详细的步骤指导,而"中国IT认证实验室学习下载频道.txt"可能是提供进一步学习资源的地方。通过阅读这些资料,你将能够更深入地理解和掌握Java开发...

    android 自动换行的自定义viewgroup

    在这个类中,你需要重写一些关键方法来实现自定义的行为。 2. `onMeasure()`方法:这是计算视图大小的重要方法。在这里,我们需要遍历所有子视图,测量它们的尺寸,并根据这些尺寸来确定整个ViewGroup的大小。 3. `...

    wuziqi.rar_java写的五子棋_五子棋java

    【标签】"java写的五子棋 五子棋java"进一步强调了这个软件是用Java语言实现的,对于Java程序员和爱好者来说,这是一个学习和研究的好例子。Java作为一种跨平台的编程语言,拥有广泛的社区支持和丰富的库资源,因此...

    自定义View流程

    1. 在XML布局中使用:在布局文件中,我们可以像使用其他内置组件一样使用自定义View,并通过`&lt;attr&gt;`标签定义自定义属性。 2. 在代码中动态添加:也可以在Activity或Fragment的代码中实例化自定义View,并添加到...

    如何写自定义得JSF组件(en)

    如何撰写自定义JSF组件:全面解析与实践指南 引言 JavaServer Faces(简称JSF)是一项基于组件的方法构建用户界面的技术。它通过UI组件作为构建模块简化了开发过程,大幅度减少了代码量,并允许在不同项目间重复...

    自定义Struts

    **自定义Struts**是一种基于Java的技术,用于构建企业级Web应用程序。在传统的JSP(JavaServer Pages)和Servlet开发中,代码往往混杂在视图层和控制层,这不利于项目的维护和扩展。Struts框架就是为了克服这些局限...

    java写得汉诺塔游戏

    我们可以为每根柱子创建一个区域,用JList或自定义组件展示盘子,通过监听按钮事件来响应用户的移动操作。 游戏的逻辑部分主要包含两部分:一是将汉诺塔问题转化为递归算法,二是确保每次移动都符合规则。汉诺塔...

    java计算器,带历史记录功能

    在Java编程领域,创建一个具有历史记录功能的计算器是一项常见的练习任务,旨在提升开发者对GUI(图形用户界面)设计、事件处理以及数据存储的理解。在这个项目中,我们看到的"java计算器,带历史记录功能"显然包含...

Global site tag (gtag.js) - Google Analytics