上一次博客介绍了自定义标签的详细步骤,今天回顾一下
自定义标签的开发及使用步骤
1 创建一个标签助手类(继承BodyTagSupport)
标签属性必须助手类的属性对应、且要提供对应get/set方法
rtexprvalue
2 创建标签库描述文件(tld),添加自定义标签的配置
注:tld文件必须保存到WEB-INF目录或其子目录
3 在JSP通过taglib指令导入标签库,并通过指定后缀
访问自定义标签
这里常见报错与解决
第一种
.org.apache.jasper.JasperException: /Demo1.jsp (line: 61, column: 0) Attribute textKey invalid for tag select according to TLD
标签库中,property不存在属性name,(我当时是没细心,去好好检查xml修改即可)
第二种
The JSP specification requires that an attribute name is preceded by whitespace
解决:前面少了一个空格
第三种
1. Unable to find setter method for attribute: XXx(在调用属性的时候不调用这个报错的属性也行/多刷新几遍就莫名其妙的好)
2. 意思是:属性没有定义setter方法。
1.tld文件里如下的定义出现问题,是==定义的时候 自定义标签处理类 定义错了 ,定义到了另外一个文件 导致找不到setter方法,
2.你看一下在SelectTag里是否有set,get方法
/SelectTag中的属性名与tld是否对应/.jsp文件和.tld文件中这个属名性是否一致/三者都检查后还是不行就都重新写一遍,或者你将set,get先删掉,重新写一次,xml也重新写(最后我重新写了get/set就好了
3.属性是否已经弃用 有@Deprecated注解或者根本就没找到 XXX这个属性
(改名 重新访问请求,页面错误消失
自定义标签Select
1.实体类Teacher
package com.wxm.jsp.tag;
public class Teacher {
private String tid;
private String tname;
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public Teacher(String tid, String tname) {
super();
this.tid = tid;
this.tname = tname;
}
public Teacher() {
super();
}
}
2.SelectTag.java
package com.wxm.jsp.tag;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.commons.beanutils.PropertyUtils;
/** * 自定义select标签应该具备的功能
* 1.新增查询页面,只要通过一个标签就可以完成数据的绑定,而并非使用c:foreach去循环绑定数据
* 2.修改页面,同样通过一个自定义标签完成的数据的遍