欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一步一步教你写自己的java自定义标签 博客分类: JavaWeb javaweb自定义标签java标签 

程序员文章站 2024-03-07 23:39:03
...

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