`

一步一步教你写自己的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  

相关推荐

    JAVA上百实例源码以及开源项目源代码

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    JAVA上百实例源码以及开源项目

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    Java2游戏编程.pdf

    将带领大家一步一步学习编写Java游戏,最终打造属于自己的Java游戏。 目录: 第1篇 步入Java丛林:从Java2 API开始 第1章 Java2软件开发工具包 1.1 Java简史 1.2 为什么在游戏中使用Java 1.3 为Java准备系统...

    java开源包11

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包6

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包9

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包4

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包101

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包5

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包8

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包10

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包3

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包1

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java必了解的六大问题

    *第十一阶段:JSP开发:JSP语法和标签,自定义标签,EL,JSTL库了解以及MVC三层架构的设计模式理念; *第十二阶段:AJAX开发:AJAX原理,请求响应处理,AJAX开发库; *第十三阶段:轻量级框架,三大框架之一...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    第1章 让自己的第一个Java程序跑起来 2 教学视频:19分钟 1.1 想要用Java改变这个世界吗? 2 1.1.1 Java有什么优势? 2 1.1.2 Java在哪儿? 3 1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    第1章 让自己的第一个Java程序跑起来 2 教学视频:19分钟 1.1 想要用Java改变这个世界吗? 2 1.1.1 Java有什么优势? 2 1.1.2 Java在哪儿? 3 1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 ...

    java开源包2

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包7

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

Global site tag (gtag.js) - Google Analytics