我假设您的目标是告知开发人员他们对您的自定义标签的不当使用。正如其他答案中提到的那样,您可能希望以不同的方式处理用户输入错误,因为在 JSP 中抛出错误可能(取决于配置)最终会将用户发送到应用程序错误页面。
如果您能够用 Java 编写标签处理程序,则该规范在 TLD 中包含几个可选元素,可以做到这一点。
- 规范定义了
validator
采用类实现的元素javax.servlet.jsp.tagext.TagLibraryValidator
。实际上,这使用起来有些复杂,因为它提供了很多灵活性。
- 该规范还定义了
tei-class
哪个类扩展TagExtraInfo
。正如 JavaDoc 所指出的:
自定义标签的额外标签信息;标签库描述符文件 (TLD) 中提到了此类。必须使用此类:
- 如果标签定义了任何脚本变量
- 如果标签想要提供tagattributes 的翻译时验证。
根据 JSP 版本,您可能需要重写isValid()
或validate()
方法来处理验证开发人员提供的变量。
Apache 标签库使用这些来验证他们的一些标签:(https://github.com/javaee/jstl-api/blob/master/impl/src/main/java/org/apache/taglibs/standard/tei/ImportTEI .java )
public boolean isValid(TagData us) {
if (Util.isSpecified(us, VAR) && Util.isSpecified(us, VAR_READER))
return false;
return true;
}
或者,如果您使用的是 JSP 2.0,那么实现validate
会稍微复杂一些,因为它允许返回ValidationMessage
. Glassfish 有一个例子:(https://github.com/javaee/glassfish/blob/master/appserver/tests/appserv-tests/devtests/web/jspGetTagLibraryInfos/servlet/taglib/MyTagExtraInfo.java)
public ValidationMessage[] validate(TagData data) {
ValidationMessage[] vms = null;
TagLibraryInfo[] infos =
getTagInfo().getTagLibrary().getTagLibraryInfos();
if (infos.length != 1) {
vms = new ValidationMessage[1];
vms[0] = new ValidationMessage(null, "Wrong number of tsglibs");
}
return vms;
}