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