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


 

你可能感兴趣的:(javaweb,自定义标签,java标签)