使用 NetBeans IDE 5.0 开发标记库教程
标记库是用于处理 JavaServer Pages™ 页面(JSP™ 页面)中常用功能(如格式化文本、加载图形和显示当前日期)的标记集合。根据在 JSP 文件中它的正文内容可以对标记进行分类:
无脚本标记(默认标记):正文内容包含除脚本元素之外任何内容的标记。例如,在本教程中您将创建无脚本的具有 style 属性的 FormatTextTag :
<disp:FormatTextTag style="official">My Company</disp:FormatTextTag>
该标记使用 JavaServer Pages™ 技术(JSP™ 语法”)或 Java™ 编程语言的语法来格式化文本“My Company”。
空标记:不接受正文内容的标记。例如,在本教程中您将创建空的具有 size 属性的 DisplayLogoTag :
<disp:DisplayLogoTag size="large"/>
该标记使用 JSP 语法或 Java 编程语言来显示图形:
与标记有关的标记:不应该计算正文内容的标记,例如,传递给查询标记的 SQL 声明。本教程中不涉及该标记。
由于 NetBeans IDE 5.0 实现了 JavaServer Pages™ 2.0 规范,因此,您可以选择用 JSP 语法创建标记文件 或用 Java 编程语言创建标记句柄 ,或两者都使用。标记文件对标记句柄的作用就像 JavaServer Pages 页面对 Java™ servlet 的作用:它们使 web 开发者能够创建复杂的功能,而不需要熟悉 Java 编程语言。
标记库描述符 (TLD) 是一个 XML 文档,该文档将库中的每个标记映射到它关联的标记句柄,或者映射到它关联的标记文件。TLD 描述了与标记库中标记关联的参数和脚本变量。
尽管它是一个 taglib 指令,但是却可以将标记库用于使用 JavaServer Pages™ 技术(JSP™ 页面)创建的页面。
标记库教程向您介绍如何创建自己的标记库以及如何在 web 应用程序中使用它的标记。但是,通常您不需要创建自己的标记,因为其他人已经创建了很多标记。本教程向您介绍如何将这些外部标记合并到您自己的 web 应用程序中。
本教程中构建的 web 应用程序将向您介绍如何执行以下操作:
本教程可以在一个小时内完成。
设置 Web 应用程序
创建新的 web 应用程序
选择 File > New Project。在 Categories 下选择 Web。在 Projects 下,选择 Web Application 并单击 Next。
在 Name and Location 面板中,在 Project Name 下键入 MyCompany 。然后将 Project Location 设置为您计算机上的任何文件夹。从现在起,我们将此文件夹称为 $PROJECTHOME 。选中 Set as Main Project 复选框。注意,Context Path 是 /MyCompany 。单击 Finish。
IDE 将创建 $PROJECTHOME/MyCompany 项目文件夹。项目文件夹包括所有的源代码和项目元数据,例如项目 Ant 脚本。MyCompany 项目在 IDE 中打开。可以在 Projects 窗口中查看其逻辑结构,在 Files 窗口中查看其文件结构。
访问和包含图形
从 http://www.netbeans.org/files/documents/4/688/taglib.zip 下载 taglib.zip 。
将 taglib.zip 文件解压缩到您的 web 应用程序的 web 文件夹。您可以在 Projects 窗口中看到 $PROJECTHOME/MyCompany/web/logos 文件夹。该文件夹包含 LogoLarge.gif 文件和 LogoSmall.gif 文件,如下所示:
访问外部标记
通常,您不需要自己创建自定义标记。在 web 应用程序中可以免费使用很多自定义标记。
访问 bundled JSTL 1.1 库中的标记
在本教程的后面部分,您将创建使用 JSTL 1.1 库中标记的标记文件。该库是与 NetBeans IDE 5.0 一起打包的。但是,您需要将它添加到您项目的类路径中。
在 Projects 窗口中右键单击 MyCompany 项目的 Libraries 节点,并选择 Add Library。将显示您的库以及与 NetBeans IDE 5.0 一起打包的库。JSTL 1.1 是打包的库之一。
选择 JSTL 1.1 并单击 Add Library。
现在 Libraries 节点包含两个由 JSTL 1.1 库组成的 JAR 文件:
访问 Jakarta 项目的 DateTime Tag Library 中的标记
在本教程的后面部分,您将创建使用 Jakarta 项目的 DateTime Tag Library 中标记的 JSP 文件。该库包含可以用于处理与日期和时间有关的功能的标记。例如,用于格式化日期以便进行输出的标记、从 HTML 格式输入生成的日期的标记、使用时区和本地化的标记。
从 http://jakarta.apache.org/site/downloads/downloads_taglibs.html 下载 DateTime Tag Library,然后解压缩。
在 Projects 窗口中,右键单击 MyCompany 项目的 Libraries 节点,并选择 Add JAR/Folder。
浏览并选择 taglibs-datetime.jar 文件。
现在 Libraries 节点包含 taglibs-datetime.jar 文件。
创建标记库描述符
对于您在本教程中创建的每个标记句柄 ,IDE 生成从 SimpleTagLib TLD 文件到标记句柄的 Java 类中标记的实现。只有您希望在本教程中使用标记句柄 的情况下,例如使用 Java 源文件而不是 JSP 文件,则需要创建一个 TLD。标记文件 即在 JSP 语法中而不是在 Java 编程语言中定义的标记,不需要 在 TLD 中注册,因此,此处也不需要 IDE 注册。
右键单击 MyCompany 项目节点并选择 New > File/Folder。在 Categories 下选择 Web。在 File Types 下,选择 Tag Library Descriptor 并单击 Next。
在 Name and Location 面板中,在 TLD Name 文本框中键入 SimpleTagLib 。
在 URI 文本框中,键入 http://netbeans.org/tlds/SimpleTagLib 。
单击 Finish。 IDE 创建 web/WEB-INF/tlds 文件夹并向它中添加标记库描述符。SimpleTagLib.tld 在 Source Editor 中打开。
创建用来显示图形的空标记
您不需要了解 Java 编程语言也可以创建标记。如果喜欢使用 JSP 语法,则使用方案 1 来创建标记文件。否则使用方案 2 创建使用 Java 编程语言标记句柄。
方案 1:JSP 语法
右键单击 MyCompany 项目节点并选择 New > File/Folder。在 Categories 下选择 Web。在 File Types 下,选择 Tag File 并单击 Next。
在 Tag File Name 文本框中,键入 DisplayLogoTag 。注意,IDE 将向 WEB-INF/tags 文件夹添加此标记文件。单击 Finish。DisplayLogoTag.tag 在 Source Editor 中打开。
用以下内容替换默认代码:
<%@tag description = "Display logo" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@attribute name="size" required="true"%>
<c:choose>
<c:when test="${size == 'large'}">
<img
src='logos/LogoLarge.gif'
align='Center'>
</c:when>
<c:otherwise>
<img
src='logos/LogoSmall.gif'
align='Center'>
</c:otherwise>
</c:choose>
<jsp:doBody/>
注意: 此标记文件包含一个 <%@taglib> 指令和一个 uri 属性,它指定前缀 c 是指 JSTL 1.1 库中的标记句柄。有关此指令的详细信息,请参阅下面的使用标记 部分。为了能够使用 JSTL 1.1 库,您必须将它添加到您的 web 应用程序中,如上面的访问打包的 JSTL 1.1 库中的标记 部分所述。
按 Ctrl-Shift-F 格式化该文件。
按 Ctrl-S 保存文件。
方案 2:Java 编程语言
右键单击 MyCompany 项目节点并选择 New > File/Folder。在 Categories 下选择 Web。在 File Types 下,选择 Tag Handler 并单击 Next。
在 Class Name 文本框中键入 DisplayLogoTag 并在 Package 下拉列表中键入 org.me.logo 。注意,IDE 将向 org.me.logo 包添加此标记句柄。确保选中 SimpleTagSupport 并单击 Next。
单击 Browse 并在 WEB-INF/tlds 文件夹中选择 SimpleTagLib 标记库。
在 Body Content 下选择 Empty。
单击 New。在 Attribute Name 文本框中,键入 size 并选择 Required Attribute 复选框。单击 OK。
单击 Finish。DisplayLogoTag.java 在 Source Editor 中打开。
如果看不到 Navigator,则选择 Window > Navigator (Ctrl-7)。在 Navigator 中,选择 doTag() 。将光标放在 doTag 方法上。
通过用以下代码替换第一个 // TODO 部分来修改 doTag 方法:
if (size.equals("large"))
out.println("<img src='logos/LogoLarge.gif' align='Center' />");
else
out.println("<img src='logos/LogoSmall.gif' align='Center' />");
按 Ctrl-Shift-F 格式化该文件。
按 Ctrl-S 保存文件。
创建用来格式化文本的无脚本的标记
同样,您不需要了解 Java 编程语言也可以创建标记。如果喜欢使用 JSP 语法,则使用方案 1 来创建标记文件。否则使用方案 2 创建使用 Java 编程语言标记句柄。
方案 1:JSP 语法
右键单击 MyCompany 项目节点并选择 New > File/Folder。在 Categories 下选择 Web。在 File Types 下,选择 Tag File 并单击 Next。
在 Tag File Name 文本框中,键入 FormatTextTag 。注意,IDE 将向 WEB-INF/tags 文件夹添加此标记文件。单击 Finish。FormatTextTag.tag 在 Source Editor 中打开。
用以下内容替换默认代码:
<%@tag description = "Format text" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@attribute name="style" required="true"%>
<c:choose>
<c:when test="${style == 'official'}">
<b><i><font size='+3' color='red'>
</c:when>
<c:otherwise><font size='+1'></c:otherwise>
</c:choose>
<jsp:doBody/>
<c:choose>
<c:when test="${style == 'official'}">
</font></i></b>
</c:when>
<c:otherwise></font></c:otherwise>
</c:choose>
注意: 此标记文件包含一个 <%@taglib> 指令和一个 uri 属性,它指定前缀 c 是指 JSTL 1.1 库中的标记句柄。有关此指令的详细信息,请参阅下面的使用标记 部分。为了能够使用 JSTL 1.1 库,您必须将它添加到您的 web 应用程序中,如上面的访问打包的 JSTL 1.1 库中的标记 部分所述。
按 Ctrl-Shift-F 格式化该文件。
按 Ctrl-S 保存文件。
方案 2:Java 编程语言
右键单击 MyCompany 项目节点并选择 New > File/Folder。在 Categories 下选择 Web。在 File Types 下,选择 Tag Handler 并单击 Next。
在 Class Name 文本框中,键入 FormatTextTag 。确保 IDE 将向 org.me.logo 包的 Source Packages 文件夹中添加此标记句柄。确保选中 SimpleTagSupport 并单击 Next。
单击 Browse 并在 WEB-INF/tlds 文件夹中选择 SimpleTagLib 标记库。
确保选中 Body Content 下的 Scriptless。
单击 New。在 Attribute Name 文本框中,键入 style 并选择 Required Attribute 复选框。单击 OK。
单击 Finish。FormatTextTag.java 在 Source Editor 中打开。
从 Navigator 中选择 doTag。将光标放在 Source Editor 中的 doTag 方法上。
修改 doTag 方法如下:
用以下内容替换第一个 // TODO 部分:
if (style.equals("official"))
out.println("<b><i><font size='+3' color='red'>");
else
out.println("<font size='+1'> ");
用以下内容替换第二个 // TODO 部分:
if (style.equals("official"))
out.println("</font></i></b>");
else
out.println("</font>");
按 Ctrl-Shift-F 格式化该文件。
按 Ctrl-S 保存文件。
在 JSP 文件中使用标记
编译和执行 web 应用程序
构建项目
选择 Build > Build Main Project (F11)。将构建 MyCompany 项目。
运行项目
从 Run 菜单选择 Run > Run Main Project (F6)。双击 Output 窗口的标题栏使它最大化,以便能看到所有的输出。最后,它使用 IDE 的默认服务器部署 web 应用程序,如下所示:
双击 Output 窗口的标题栏使它还原为正常大小。选择 Files 窗口并展开该项目节点。构建类文件位于 build 文件夹中。构建 WAR 文件 (MyCompany.war ) 位于 dist 文件夹中。
生成 Javadoc
在 Projects 窗口中,右键单击该项目节点,并选择 Generate Javadoc for Project。将在 Output 窗口中显示 Javadoc 输出,此时显示 Javadoc 的 Web 浏览器将打开。
故障排除
如果您选择 Java 方法(方案 2)来创建标记句柄,则您只能使用以下两个故障解决策略。
验证您的标记是否使用规定的正文内容
本教程中创建的 SimpleTagLib TLD 文件将库中的标记映射到关联的标记句柄 。当您编译 index.jsp 文件时,NetBeans IDE 识别在 JSP 文件中使用的映射和相应的标记使用方法之间的冲突。为了说明此问题,请执行以下操作:
展开 MyCompany 项目节点,展开 Web Pages 节点,展开 WEB-INF 节点,接着展开 tlds 节点。双击 SimpleTagLib.tld 节点。该标记库描述符将在 Source Editor 中打开。
将 FormatTextTag 的 <bodycontent> 标签的值从 scriptless 更改为 empty 。
双击 index.jsp 文件。将在 Source Editor 中打开此文件。注意,FormatTextTag 不为空。例如,它的第一个实例如下:
<disp:FormatTextTag style="official">My Company</disp:FormatTextTag>
将其与 DisplayLogoTag 的实例对比,DisplayLogoTag 的实例在 index.jsp 文件中为为 空。
<disp:DisplayLogoTag size="large"/>
<disp:DisplayLogoTag size="small"/>
确保您的 JSP 文件的 <%@taglib> 指令指向 SimpleTagLib.tld 标记库描述符。<%@taglib> 指令应该看起来类似以下行:
<%@taglib uri="http://netbeans.org/tlds/SimpleTagLib" prefix="disp" %>
右键单击 index.jsp 并从上下文菜单中选择 Compile File (F9)。由于以下错误无法编译 JSP 文件:
org.apache.jasper.JasperException: According to TLD, tag disp:FormatTextTag
must be empty, but is not
在 SimpleTagLib.tld 文件中,将 FormatTextTag 的 <bodycontent> 标签的值从 empty 更改回 scriptless 。
再次右键单击 index.jsp 并从上下文菜单中选择 Compile File (F9)。将编译 JSP 文件。
验证您的标记是否使用规定的标记库
PermittedTaglibsTLV 验证器是 JSTL 1.1 库的一部分。它允许 TLD 限制除了它自身之外可能导入到 JSP 文件中的标记库。
注意: 您必须在 <param-value> 部分中指定允许的标记库的 URI。标记库具有一个 URI 属性,而标记文件没有。因此,PermittedTaglibs 验证器是标记句柄当前唯一支持的验证器。
右键单击 MyCompany 项目节点并选择 New > Tag Library Descriptor。
在 Class Name 文本框中,键入 ApprovedTagLibs 。
在 URI 文本框中,键入 http://netbeans.org/tlds/ApprovedTagLibs 。
单击 Finish。IDE 向它中添加此标记库描述符。ApprovedTagLibs.tld 在 Source Editor 中打开。
在 Source Editor 中,用以下内容替换默认的 <validator> 标记:
<validator>
<validator-class>
javax.servlet.jsp.jstl.tlv.PermittedTaglibsTLV
</validator-class>
<init-param>
<param-name>permittedTaglibs</param-name>
<param-value>
http://jakarta.apache.org/taglibs/datetime-1.0
</param-value>
</init-param>
</validator>
向 index.jsp 文件中添加一个 taglib 指令以参考 ApprovedTagLibs TLD 文件:
<%@taglib uri="http://netbeans.org/tlds/ApprovedTagLibs" prefix="apptglib" %>
右键单击 index.jsp 并从上下文菜单中选择 Compile File (F9)。由于以下错误无法编译 JSP 文件:
org.apache.jasper.JasperException: <h3>Validation error messages from TagLibraryValidator
for accepted-taglibs<p>null: taglib apptglib (urn:jsptld:/WEB-INF/tlds/accepted-taglibs)
allows only the following taglibs to be imported: [http://jakarta.apache.org/taglibs/datetime-1.0]</p>
在 ApprovedTagLibs.tld 文件中,将 http://netbeans.org/tlds/SimpleTagLib 行添加到 <param-value> 部分。现在该验证器应该如下所示:
<validator>
<validator-class>
javax.servlet.jsp.jstl.tlv.PermittedTaglibsTLV
</validator-class>
<init-param>
<param-name>permittedTaglibs</param-name>
<param-value>
http://jakarta.apache.org/taglibs/datetime-1.0
http://netbeans.org/tlds/SimpleTagLib
</param-value>
</init-param>
</validator>
再次右键单击 index.jsp 并从上下文菜单中选择 Compile File (F9)。将编译 JSP 文件。
下一步
有关使用 NetBeans IDE 5.0 的更多信息,请参见以下参考资料:
要发送评论和建议、获得支持和随时获得关于 NetBeans IDE J2EE 开发特性的最新发展情况,请加入 nbj2ee@netbeans.org
nbj2ee @ netbeans.org
邮件列表 。有关 NetBeans IDE 中即将到来的 J2EE 开发特性的更多信息,请参见 j2ee.netbeans.org
。有关 NetBeans IDE 中即将到来的 J2EE 开发特性的更多信息,请参见 j2ee.netbeans.org
.