从J2EE 1.3开始,Taglib是很棒的组件。 它们使您成为开发人员:
- 避免在Java服务器页面中使用过多的脚本(自由格式的Java代码),
- 拥有可重用组件的库,这些库可分发到您的所有项目。
到目前为止,两者在企业中都非常重要。 例如,作为一名架构师,您可以完全禁止使用脚本,然后提供标记库来限制可以在页面上完成的操作。 此类策略并不罕见,可以由质量代码检查人员实施。 它阻止了刚毕业的开发人员在JSP中调用JDBC代码,从而破坏了精确的Model View Controller模型。
但是,Taglib有一个很大的缺点:它们是继承正确类的标准Java类( javax.servlet.jsp.tagext.Tag
或javax.servlet.jsp.tagext.SimpleTag
)。 因此,必须将其内容写入JspWriter。 在这方面,它们与Servlet非常相似:它们不能由绘图员设计,并且您必须提供Servlet引擎以查看其输出。 Servlet具有JSP作为视图,taglib具有tagfile!
标记文件是什么? 只需将一个带有* .tag扩展名的文件放在/WEB-INF/tags
目录中,然后使用bingo,便有了一个tagfile。 为了测试标记文件的创建,请创建具有以下内容的hello.tag:“ Hello world”。 然后创建一个JSP并粘贴以下代码段:
<%@pagelanguage="java"contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglibprefix="tag"tagdir="/WEB-INF/tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=ISO-8859-1">
<title> Tag files example </title>
</head>
<body>
<tag:hello/>
</body>
</html>
您已经可以猜测输出了。 引用标记文件有点神奇。 我们不使用taglib
指令的uri
属性,而是使用tagdir
属性来告诉应用程序服务器我们在何处存储了标记文件。 要调用标记文件,请照常使用前缀,然后使用文件名。 无需使用TLD 。 很简单,不是吗?
容易...实际上,使用标记文件并不能实现重用。 它是在单个Web应用程序的上下文中完成的,与使用JSP include相比没有很多优点。 要打包标记文件以重复使用,您必须将文件从/WEB-INF/tags
移至/META-INF/tags
并在/META-INF
下创建完整的TLD:
<?xml version="1.0" encoding="UTF-8"?>
<taglibversion="2.0"xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xml="http://www.w3.org/XML/1998/namespace"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version> 1.0 </tlib-version>
<short-name> tf </short-name>
<uri> http://blog.frankel.ch/examples/tagfiles </uri>
<!-- don't use tagclass -->
<tag-file>
<name> hello </name>
<path> /META-INF/tags/hello.tag </path>
</tag-file>
</taglib>
现在,在JSP中使用taglib(不要忘记现在使用uri
属性)。 结果应该是相同的,但是现在您拥有了一个可重用的组件。 当然,在输出中写入字符串不是很有用。 像标记库一样,标记文件可以接受变量。 这很容易做到,因为在TLD下使用标签库找到的许多属性都在标签文件本身中找到。 让我们写一个标记文件,用开发人员给定的格式写今天的日期:
<%@tagbody-content="empty"%>
<%@attributename="format"required="true"%>
<%@taglibprefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt"%>
<jsp:useBeanid="date"class="java.util.Date"/>
<fmt:formatDatevalue="${date}"pattern="${format}"/>
注意attribute
语法。
这些示例的Eclipse项目可以在这里找到。
翻译自: https://blog.frankel.ch/do-not-use-taglibs-use-tagfiles/