思路:
首先tdl自定义标签就是比如类似input、div、ul、li之类的标签,只是名字自己来定义,但实际上要在页面上看到效果还是需要些html代码,只是在页面上只需要写自己标签就可以代表一部分html代码而已,相当于类似模板一样,但又可以从前端传参的进入这个模板变成动态模板返回到前端生成页面。写这个模板的用处主要是做一些统一的模板,比如:多选框、下拉选择、图片上传、图片查看等固定模板,只需要在传入的时候添加各种参数,比如ID、名称等就可以达到很好的利用,而且前端代码也很美观,用起来很方便,如果有需要保密的的话可以打包成jar包使用,只是这样就增加了维护的难度。
第一步:创建后缀为.tld文件
在web-inf下面编写一个XXX.tld文件和web.xml同级(XXX代表名字自定义),为什么要同级,我猜测应该是项目编译的时候会向自动读取web.xml一样读取easyui.tld吧,因为创建好了之后不需要在什么地方配置或加载这个文件,直接就可以用了。这里为了方便我取得名字为:easyui.tld
第二步:编写.tld代码
图片解释:
代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>dswl</short-name>
<uri>dswl</uri>
<display-name>"自定义标签"</display-name>
<tag>
<name>DropBox</name>
<tag-class>com.ssm.web.core.tld.DropBoxTag</tag-class>
<body-content>JSP</body-content>
<description>基础表单选按钮</description>
<attribute>
<name>identification</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<description>标识</description>
</attribute>
<attribute>
<name>serialNumber</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>序号</description>
</attribute>
</tag>
</taglib>
第三步:com.ssm.web.core.tld.DropBoxTag内容
这个类是自定义的类,可以写自己想写的一切代码,比如逻辑处理、html代码的拼接等。
注意:如果复制这个代码在引入包的地方或继承类的时候会出错误,请看最后的注意事项。
图片解释:
代码:
package com.ssm.web.core.tld;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
/**
* Created by yy on 2016/8/9.
*/
public class DropBoxTag extends TagSupport{
private static final long serialVersionUID = 1L;
private String identification;
private String serialNumber;
public int doEndTag() throws JspTagException {
System.out.print(identification+serialNumber);
JspWriter writer= this.pageContext.getOut();
StringBuffer content = new StringBuffer();
content.append("<input type='text' value='测试' />");
try {
writer.print(content.toString());
} catch (IOException e) {
e.printStackTrace();
}
return 6;
}
public String getIdentification() {
return identification;
}
public void setIdentification(String identification) {
this.identification = identification;
}
public String getSerialNumber() {
return serialNumber;
}
public void setSerialNumber(String serialNumber) {
this.serialNumber = serialNumber;
}
}
第四步:前端页面的引用
(1)首先需要把这个自定义的标签引用到jsp页面中
<%@ taglib uri="dswl" prefix="ds"%>
解释:
比如命名ds 使用方法:<ds:XXXXX></ds:XXXXX>
比如命名yy 使用方法:<yy:XXXXX></yy:XXXXX>
Uri 代表tdl文件中<uri></uri>标签的名称
比如命名dswl tdl文件中<uri>dswl</uri>
比如命名yyyy tdl文件中<uri>yyyy</uri>
(2)使用标签
<ds:DropBox identification="sex" serialNumber="serialNumber"></ds:DropBox>
解释:
ds:是 prefix中获得
DropBox:是tdl文件中<tag><name>DropBox</name></tag>name的名称
Identification:是tdl文件<attribute><name>identification</name></attribute>name的名称,如果是true就是代表必须要的这个属性,如果false就是可以有也可以没有
serialNumber:是tdl文件<attribute><name>serialNumber</name></attribute>name的名称,如果是true就是代表必须要的这个属性,如果false就是可以有也可以没有
属性后面的 =”” 是要传入的值
第五步:注意事项
一般到这里就成功了,可以试试结果了,但有可能也会出现一些意外。
因为com.ssm.web.core.tld.DropBoxTag这个类继承了TagSupport,用到了jar包的一些东西,用到的是servlet-api.jar和jsp-api-2.0.jar,需要引入这2个jar包,但是这2个jar包在tomcat的lib目录下也有这2个包,这样就会起冲突,但项目又用到了这2个包,不能直接删除,这个时候需要使用下面的方法进行解决:
描述:
1·右击项目名称—-properties—-java Build Path—-Add Library—myeclipse Libraries—-javaEE5 Libraries复选框选中—-finish
2·删掉WEB-INF下的jsp-api,servlet-api重新部署
3·成功
图示:
这里没有java EE5 Libraries是因为我已经导入了,如果没导入就会有。导入这个的意思是这里面会有这个2个jar包,并且不会与tomcat相冲突。