Web 应用程序的 NetBeans IDE 教程
欢迎使用 Web 应用程序的 NetBeans IDE 6.5 教程。在本教程中,您将在学习 NetBeans IDE 中的一些工具和技术的同时构建一个相当复杂的 Web 应用程序,还将体验从创建到部署这样一个典型的 Web 开发周期。本教程的高级部分内容从创建 Servlet 和 JSP 页开始,向您说明了如何使用 JavaServer Pages 标准标记库 (JavaServer Pages Standard Tag Library, JSTL) 来获取动态数据以及将此应用程序中使用的 JSP 页进行国际化。在本教程的结尾处将向您介绍 IDE 的 HTTP 监视器,此监视器可以帮助您在部署 Web 应用程序后对其进行分析。
注意:如果这是您第一次使用 NetBeans IDE 开发 Web 应用程序,则建议您在继续之前先学习 Web 应用程序开发简介。
预计时间:50 分钟
目录

要学习本教程,您需要具备以下软件和资源。
注意:
术语
下面是本教程中使用的一些术语的解释。
获取所需的源文件
要创建 Midnight Cookie Company 应用程序,您需要 midnight.zip 文件,该文件包含构建应用程序时所基于的源文件。源文件包括 WEB-INF 文件夹,其中包含您将在本教程中使用的 classes、docs、tlds 和 lib 文件夹。
- 在您的文件系统中,创建一个名为 midnight 的文件夹。将在这里解压缩应用程序的文件。从现在开始,我们将此文件夹称为 $UNZIPHOME。
- 单击此处下载文件。
- 使用可解压缩文件的应用程序将 midnight.zip 文件解压缩到 $UNZIPHOME。
$UNZIPHOME 现在拥有一个 WEB-INF 文件夹,该文件夹包含以下文件和文件夹:
|
文件或文件夹
|
描述
|
| web.xml |
Web 应用程序的部署描述符。 |
| classes |
包含用于国际化这些页面的资源包属性文件,还包含 com/midnightcookies/taghandlers 文件夹。taghandlers 文件夹包含 ContentHandler 标记处理程序、ButtonHandler 标记处理程序和 LinksHandler 标记处理程序的类文件。ContentHandler 包括指定 JSP 文件的内容。ButtonHandler 显示一个带有本地化消息的提交按钮。LinksHandler 显示一组来自标记属性的链接,包括分隔符。 |
| docs |
包含 header.jsp 文件、index.jsp 文件和 nonesuch.jsp 文件。在本教程中,您将创建 main.jsp 页,并将其放入此文件夹。此外还包含 cookies 文件夹,该文件夹中包括 CookieCutter.jsp 文件和 CookieMake.jsp 文件。在本教程中,您将创建 Tray.jsp 页,并将其放入此文件夹。about 文件夹包含 about.jsp 文件,该文件概述了此 Web 应用程序的体系结构。 |
| lib |
包含 standard.jar 文件和 jstl.jar 文件。这两个文件包含 JSTL 的实现。standard.jar 包含 TLD 和标记处理程序。jstl.jar 文件包含所需的其他应用程序编程接口 (API)。 |
| tlds |
包含专用的 midnight.tld。 |
开发应用程序
通过提供的源文件创建 Web 项目
- 选择“文件”>“新建项目”(Ctrl-Shift-N)。在“类别”下,选择 "Java Web"。在“项目”下,选择“基于现有源代码的 Web 项目”。单击“下一步”。
- 在“位置”中,单击“浏览”选择 Web 应用程序的文档根目录。如果按照上述说明进行操作,则文档的根目录为 $UNZIPHOME,名为 midnight。这是用于解压缩 midnight.zip 文件的文件夹。
- 在“项目名称”下,注意到 midnight 已设置。将项目名称设置为首字母大写变成 Midnight,这样做只是用于显示目的,因为项目名称通常都是首字母大写。将“项目位置”更改为计算机中的任意文件夹。从现在开始,我们将此文件夹称为 $PROJECTHOME。单击“下一步”。
- 选择要在其中部署应用程序的服务器。仅列出了已在 IDE 中注册的服务器。
- 在 Java EE 版本中,确保选择了 Java EE 5。请注意,上下文路径为 /Midnight。单击“下一步”。
-
在“Web 页文件夹”中,选择文档的根目录 ($UNZIPHOME)。请注意,系统将自动选择 $PROJECTHOME/Midnight/WEB-INF/lib 和 $PROJECTHOME/Midnight/WEB-INF/classes 文件夹分别作为库文件夹和源包文件夹,如下图所示。

-
单击“完成”。
系统会提示您让 IDE 删除类文件,因为在生成项目时,这些文件将自动编译到项目的 build 文件夹中。
单击“删除”让 IDE 完成删除操作。
IDE 将导入源代码,删除类文件并在 IDE 中创建 Midnight 项目。
您可以在“项目”窗口中查看其逻辑结构,在“文件”窗口中查看其文件结构。

使用 Servlet 创建前端控制器
前端控制器负责路由传入的用户请求,并且能够强制在 Web 应用程序中导航。前端控制器提供了一个入口点,通过该入口点,可以传递 Web 应用程序中多个资源的请求。前端控制器可以减少 JSP 页中的代码重复,尤其是在多个资源需要进行相同处理的情况下。有关前端控制器的详细信息,请参见 J2EE 模式目录。
- 在“项目”窗口中,展开 "Midnight" 项目节点和“源包”节点。
- 右键单击 com.midnightcookies 包节点,然后选择“新建”> "Servlet"。
- 在“类名”文本框中,输入 FrontController,并确保在“包”下拉列表中选择 com.midnightcookies 包。单击“下一步”。
- 将“URL 模式”文本框中的值更改为以下值:
/docs/*, /
请注意,上一行中的 "," 是 URL 映射之间的分隔符。通过它可以为每个 Servlet 创建多个 URL 映射。
- 单击“完成”。
将在源代码编辑器中打开 FrontController.java。
- 在“项目”窗口中,展开 "WEB-INF" 节点并双击 web.xml 节点。部署描述符文件 web.xml 的内容将显示在图形编辑器中。单击编辑器顶部的 "Servlet"。展开 FrontController Servlet 条目的节点。请注意在上面第 4 步中定义的 Servlet 的 URL 模式:
Servlet 映射 "/docs/*" 可以防止 FrontController Servlet 向自身转发页面,而 Servlet 映射 "/" 将为 FrontController Servlet 提供一个 Servlet 映射以处理请求(如 http://hostname:portnumber/midnight/)。
单击编辑器顶部的 "XML"。将以 XML 格式显示部署描述符文件的内容。Servlet 映射如下所示:

添加用于处理请求并创建 Cookie 的方法
现在您将编辑 FrontController.java 文件,使其包含处理由 Web 应用程序接收的请求所需的逻辑。您将修改 processRequest 方法,并创建名为 createCookie 的新方法,该方法将说明如何创建在 Web 应用程序中使用的 Cookie。
- 打开“导航”窗口 (Ctrl-7),然后在“项目”窗口中选择 "FrontController.java" 节点。现在您将看到该类的方法显示在“导航”窗口中:

- 在“导航”窗口中双击 processRequest 方法的节点。源代码编辑器中将显示 processRequest 方法。
- 将缺省的 processRequest 方法替换为以下代码:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id = request.getRequestURI();
id = id.substring(request.getContextPath().length());
getServletContext().log
("Midnight Cookies FrontController received a request for " + id);
// The page variable holds the path to the page that will be included
// in the content area of the template page /WEB-INF/docs/main.jsp.
String page;
// If no request is received or if the request received is
// for the root, serve /WEB-INF/docs/index.jsp
if (id == null || id.trim().equals("") || id.equals("/")){
page = "/WEB-INF/docs/index.jsp";
}
// If a request received is for a file that does not end in
// .jsp or .html, there was an error. Include the
// error page (nonesuch.jsp) and set the nonesuch attribute with
// the path requested.
else if (!id.endsWith(".jsp") && !id.endsWith(".html")) {
page = "/WEB-INF/docs/nonesuch.jsp";
request.setAttribute("nonesuch", id);
}
else {
page = "/WEB-INF".concat(id);
if (id.equals("/docs/cookies/CookieMake.jsp")) {
Cookie cookie = createCookie(request);
if (cookie == null) {
page = "/WEB-INF/docs/cookies/CookieCutter.jsp";
}
else {
response.addCookie(cookie);
request.setAttribute("cookie", cookie);
}
}
}
request.setAttribute("page", page);
try {
request.getRequestDispatcher("/WEB-INF/docs/main.jsp").forward(request, response);
}
catch(Throwable t) {
getServletContext().log(t.getMessage());
}
}
-
在源代码编辑器中单击鼠标右键,然后选择“修复导入”。
注意:在源代码编辑器中输入代码(通过键入,或者通过复制和粘贴)后,将光标放在源代码编辑器中,然后按 Alt-Shift-F 组合键即可自动设置代码的格式。要显示行号,请右键单击左边距,然后从上下文菜单中选择“显示行号”。
调用 createCookie 方法的行带有下划线并被标记为错误,与下图类似。这是因为此方法尚不存在。
-
在标记为错误的行中单击 Alt-Enter,并注意到 IDE 提供了有关如何解决此错误的建议。

- 选择该建议。IDE 将在文件结尾处创建框架 createCookie 方法。
- 通过复制以下代码并将其粘贴到源代码编辑器中来填充新的 createCookie 方法:
private Cookie createCookie(HttpServletRequest request) {
String name = (String)request.getParameter("name");
if (name == null || name.trim().equals("")) {
request.setAttribute("noname", "noname");
request.setAttribute("error", "true");
return null;
}
String value = (String)request.getParameter("value");
if (value == null || value.trim().equals("")) {
request.setAttribute("novalue", "novalue");
request.setAttribute("error", "true");
return null;
}
System.out.println(name);
System.out.println(value);
Cookie cookie = null;
try {
cookie = new Cookie(name, value);
}
catch(IllegalArgumentException ex) {
// Probably an illegal name
ex.printStackTrace();
request.setAttribute("error", "true");
request.setAttribute("noname", "badname");
return null;
}
String maxage = request.getParameter("maxage");
if (maxage != null && !maxage.trim().equals("")) {
try {
cookie.setMaxAge(Integer.parseInt(maxage));
}
catch(NumberFormatException nfe) {
nfe.printStackTrace();
request.setAttribute("badnumber", "badnumber");
request.setAttribute("error", "true");
return null;
}
}
String domain = request.getParameter("domain");
if (domain != null && !domain.trim().equals("")) {
cookie.setDomain(domain);
}
String path = request.getParameter("path");
if (path != null && !path.trim().equals("")) {
cookie.setPath(path);
}
String secure = request.getParameter("secure");
if (secure != null && secure.equals("on")) {
cookie.setSecure(true);
} else {
cookie.setSecure(false);
}
return cookie;
}
- 只要有更改尚未保存到硬盘,就会在源代码编辑器顶部该文件的标签中显示星号:
按 Ctrl-S 组合键保存文档。在源代码编辑器顶部该文件的标签中显示的星号将消失。
- 在“项目”窗口中,右键单击 "FrontController.java" 节点,然后选择“编译文件”(F9) 来检查已完成的步骤中是否引入错误。“输出”窗口将显示来自编译器的消息,包括任何错误。可以双击错误消息中的链接以查找错误来源:在继续学习本教程之前,请先解决在“输出”窗口中列出的所有错误。
创建接收所有请求的 JSP 页
main.jsp 页将接收 FrontController Servlet 处理的所有请求。动态 include 语句和 LinksHandler 用于创建该页。
- 展开 "Midnight" 项目节点和 "WEB-INF" 节点。右键单击 "docs" 节点,选择“新建”> "JSP",然后将 JavaServer Pages 文件命名为 main。单击“完成”。
现在将在源代码编辑器中打开 main.jsp。
- 在源代码编辑器中,将 main.jsp 文件中的内容替换为以下代码:
<%@page contentType="text/html;charset=UTF-8"%>
<%@page buffer="none"%>
<%-- The <midnight:content/> tag which handles the contents section
is simplistically implemented to use an include. Hence this page
cannot be buffered --%>
<%@taglib prefix="midnight" uri="http://www.midnightcookies.com/midnight"%>
<html>
<head><title>The Midnight Cookie Company</title></head>
<body text="#996633" link="#cc6600" vlink="#993300" alink="#000000">
<span font-style="sans-serif">
<TABLE border="0">
<tr>
<table border="0">
<tr><td width="80" height="100"> </td>
<td width="500" height="100"
text="#996633" bgcolor="#ffff99"
valign="center"halign="center">
<jsp:include page="/WEB-INF/docs/header.jsp"
flush="true"/>
</td>
</tr>
<tr><td width="90" height="300"
text="#996633" bgcolor="#ffff99"
valign="top">
<midnight:links separator="<br>"/>
</td>
<td width="500" height="300"
valign="top"cellpadding="15"
cellspacing="15">
<midnight:content/>
</td>
</tr>
</table>
</tr>
<tr><td width="580" height="50" text="#996633"
bgcolor="#ffff99" valign="top">
<midnight:links separator="|"/>
</td>
</tr>
</TABLE>
</span>
</body>
</html>
注意:在源代码编辑器中输入代码(直接键入,或者通过复制和粘贴)后,将光标放在源代码编辑器中,然后按 Alt-Shift-F 组合键即可自动设置代码的格式。
- 按 Ctrl-S 组合键保存更改。
创建用于处理用户输入的参数文件
在本节中创建的参数文件说明了如何使用标记库中的标记来处理国际化。这些文件还显示了如何通过请求参数传递输入,尤其是通过 JSP 表达式语言 (EL) 的表达式 ${param.input}(在 Input.jsp 页上的输入字段中设置)进行传递。
- 右键单击 "docs" 节点,然后从上下文菜单中选择“新建”>“其他”。在“类别”下,选择“其他”,在“文件类型”下,选择“文件夹”。单击“下一步”。
- 在“名称和位置”面板中的,“文件夹名称”文本字段中键入 parameters,然后单击“完成”。新的 parameters 文件夹将显示在“项目”窗口中的 "docs" 节点下。
- 右键单击 "parameters" 节点,然后选择“新建”> "JSP"。在“JSP 文件名”文本字段中键入 Input,并确保在“文件夹”文本框中选择了 WEB-INF/docs/parameters。单击“完成”。将在源代码编辑器中打开 Input.jsp。
- 在源代码编辑器中,将 Input.jsp 文件中的内容替换为以下代码:
<%@page contentType="text/html;charset=UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@taglib prefix="midnight" uri="/WEB-INF/tlds/midnight.tld"%>
<fmt:setBundle basename="com.midnightcookies.Midnight" var="bundle"
scope="page"/>
<h3><fmt:message key="provide_input" bundle="${bundle}"/></h3>
<form method="POST" action="Output.jsp">
<table>
<tr>
<td><fmt:message key="type_input" bundle="${bundle}"/>:</td>
<%-- The value of the Input field will be placed in a
request parameter named "input" and it will be
passed to Output.jsp --%>
<td><input type="text" size="20" name="input" value=""></td>
</tr>
<tr>
<td><fmt:message key="submit" bundle="${bundle}"
var="buttonLabel" scope="page"/>
<midnight:button/>
</td>
<td></td>
</tr>
</table>
</form>
按 Ctrl-S 组合键保存更改。
- 在 Parameters 文件夹中使用与创建 Input.jsp 文件相同的方法来创建 Output.jsp 文件。
- 在源代码编辑器中,将 Output.jsp 文件中的内容替换为以下代码:
<%@page contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<fmt:setBundle basename="com.midnightcookies.Midnight" var="bundle" scope="page"/>
<h3><fmt:message key="display_input" bundle="${bundle}"/></h3>
<fmt:message key="datareceived" bundle="${bundle}"/>:
<!--The following line gets the value of the request parameter named
"input". This is a demo application. For security reasons, one should
never echo user input without parsing first. -->
<c:out value="${param.input}"/>
- 按 Ctrl-S 组合键保存更改。
使用 JSTL 处理国际化
在本节中创建的 Tray.jsp 页说明如何使用 JSTL(而不是脚本)对该页进行国际化。CookieCutter.jsp 文件、CookieMaker.jsp 文件和资源包属性文件已随 midnight.zip 文件一起提供。可以仔细看看这些文件和 Tray.jsp 文件,例如,看看在此应用程序中是如何处理国际化的。
- 展开 "docs" 节点并展开 "cookies" 节点。
- 在 cookies 文件夹中,使用与创建其他 JSP 文件相同的方法来创建 Tray.jsp 文件。确保将此文件放入 cookies 文件夹。
- 在源代码编辑器中,将 Tray.jsp 文件中的内容替换为以下代码:
<%@page contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<fmt:setBundle basename="com.midnightcookies.Midnight" var="bundle" scope="page"/>
<h3><fmt:message key="cookies" bundle="${bundle}"/></h3>
<table border="1">
<tr>
<th halign="center">#</th>
<th align="left">
<fmt:message key="name" bundle="${bundle}"/>
</th>
<th align="left">
<fmt:message key="value" bundle="${bundle}"/>
</th>
<tr>
<%-- We have to use expression to get at an array.
If we use ${cookie} then we get a map and
the entries are not automatically cast --%>
<% request.setAttribute("cookies", request.getCookies()); %>
<c:set var="i" value="0"/>
<c:forEach var="ck" items="${cookies}">
<c:set var="i" value="${i+1}"/>
<tr>
<td><c:out value="${i}"/></td>
<td><c:out value="${ck.name}"/></td>
<td><c:out value="${ck.value}"/></td>
</tr>
</c:forEach>
</table>
- 按 Ctrl-S 组合键保存更改。
包装
完成上述开发阶段之后,“项目”窗口和“文件”窗口中的视图应如下所示:

注意:上面演示的应用程序将部署到 Tomcat Web Server。如果已注册并选择了不同的目标服务器,您将不会拥有 META-INF/context.xml 文件。例如,如果您的服务器是 GlassFish,您将拥有 WEB-INF/sun-web.xml 文件作为部署描述符。
运行并监视应用程序
启用 HTTP 监视器
对于 Tomcat Web Server,缺省情况下启用 HTTP 监视器。但是,对于其他服务器,您必须手动启用 HTTP 监视器。此外,必须启动 HTTP 服务器,HTTP 监视器才能为其他服务器工作。
执行以下操作来准备使用 HTTP 监视器:
- 从主窗口中选择“工具”>“服务器”。
- 选择服务器。
- 单击“启用 HTTP 监视器”,然后单击“关闭”。
- 在“运行时环境”窗口中,右键单击 HTTP 服务器节点,然后选择“启动 HTTP 服务器”。
验证上下文路径
- 右键单击 "Midnight" 项目节点,然后选择“属性”。
- 在“项目属性”对话框中单击“运行”。
- 确保“上下文路径”设置为 /Midnight。
- 确保“相对 URL”设置为 docs/index.jsp
运行应用程序
-
在“项目”窗口中,右键单击 "Midnight" 项目,然后从上下文菜单中选择“运行”。
注意:缺省情况下,将在启用“在保存时编译”功能的情况下创建项目,因此无需先编译代码即可在 IDE 中运行应用程序。有关“在保存时编译”功能的详细信息,请参见创建、导入和配置 Java 项目指南的“在保存时编译”部分。
当应用程序已准备就绪并部署到 Web 服务器时,将出现进度监视器窗口。
将启动 Web 浏览器,并且 URL 设置为 http://hostname:port/Midnight。以下示例显示了在 Microsoft Windows 平台上运行的 Web 浏览器。

- 在 IDE 中,注意到已显示 HTTP 监视器。
以下各节说明如何使用 HTTP 监视器来监视请求、会话和 Cookie。
监视请求和会话
- 在 HTTP 监视器中的“当前记录”节点下选择最后一个条目。
最后一个条目代表对 Midnight Web 应用程序的请求。
- 选择“请求”标签,您将看到类似以下内容的信息。

- 选择“会话”标签,您将看到类似以下内容的信息。

- 在 Web 浏览器中,单击 "Parameters" 链接以显示 Input.jsp 页。Web 浏览器将显示类似以下内容的信息。

- 在 "Type Input" 文本字段中,键入 hello,然后单击 "Submit data"。
Web 浏览器将显示与下面类似的 Output.jsp 页的内容。

- 在 HTTP 监视器中,选择“当前记录”下的最后一个条目,然后选择“请求”标签。
HTTP 监视器将显示类似以下内容的信息。

监视 Cookie
- 在 Web 浏览器中,单击 "Cookies" 链接。
Web 浏览器将显示 CookieCutter.jsp 页。
- 在 "Name" 文本字段中键入 cookie,并在 "Value" 文本字段中键入 chocolate。

- 单击 "Make me a cookie now!"。
Web 浏览器将显示类似以下内容的信息。

- 在 HTTP 监视器中的“当前记录”节点下选择最后一个条目。
HTTP 监视器中的 "Cookie" 标签显示类似以下内容的信息。

- 在 Web 浏览器中,单击 "Cookie tray",Web 浏览器将显示类似以下内容的信息。

- 在 HTTP 监视器中,选择“当前记录”节点下的最后一个条目,然后选择 "Cookie" 标签。
HTTP 监视器将显示类似以下内容的信息。

- 选择“请求”标签,HTTP 监视器将显示类似以下内容的信息。

- 在 HTTP 监视器中,右键单击“当前记录”节点下的同一条目 (GET Tray.jsp),然后从上下文菜单中选择“编辑并重新显示”。在“编辑并重新显示”对话框中,单击 "Cookie" 标签,然后单击“添加 Cookie”。将名称设置为 "Ingredient",将值设置为 "Sugar"。单击“发送 HTTP 请求”。浏览器将重新显示具有新 Cookie 的页面。
监视不存在的页的请求
- 在 Web 浏览器中,键入不存在的页的 URL,以查看如何使用 nonesuch.jsp 页。例如,您可以键入 URL http://localhost:8084/Midnight/docs/Bake.jsp,Web 浏览器将显示类似以下内容的信息。

- 在 HTTP 监视器中,选择“请求”标签,您将看到类似以下内容的信息。
请注意,将显示 nonesuch.jsp 页的内容来替代不存在的 Bake.jsp 页。
启用国际化
- 将 Web 浏览器使用的首选语言改为法语或瑞典语,以便查看此 Midnight Cookie Company Web 应用程序的国际化功能。
请注意,您可能必须将这两种语言添加到 Web 浏览器当前可用的语言列表中。
- 重新装入或刷新您在前面步骤中查看过的页面。
注意左侧导航栏中的链接、页面底部的链接以及一些应用程序的 JSP 页的内容如何转换为所选择的语言。
Web 应用程序使用资源包属性文件来帮助转换此 Web 应用程序中使用的一些页面。因此,只能转换资源包属性文件的内容。
应用所学知识
添加一个“退出”链接,通过该链接,用户可以转至以相应语言显示“再见”的页面。
- 右键单击 com/midnightcookies/Midnight.properties 文件,然后从上下文菜单中选择“打开”。添加以下关键字和值。
| 关键字 |
缺省值 |
法语 |
瑞典语 |
| exit |
Exit |
Sortie |
Utgång |
| closingRemark |
Goodbye |
Au revoir |
Hej då |
使用 å 来显示 å 字符。
- 添加 Exit.jsp 内容文件。使用 fmt 标记库中的消息标记来显示 closingRemark 关键字的消息(提示:查看 Output.jsp)。不要忘记为 fmt 标记库添加 taglib 指令。
- 在源代码编辑器中打开 com/midnightcookies/taghandlers/LinksHandler.java 文件,然后添加 Exit.jsp 文件的链接。使用 exit 关键字从属性包中获取链接文本。编译该类。
- 执行该 Web 应用程序。
深入探讨
以下是您可能希望探讨的其他一些 Web 应用程序功能。
检查 Midnight 标记库
展开 tlds/Midnight 节点以查看库中的标记列表。查看源代码编辑器中的“链接”标记及其属性,以确定它是否具有分隔符属性。
调试 Web 应用程序
在源代码编辑器中打开 docs/main.jsp 文件,然后通过在大约第 32 行(调用 midnight:content 的行)处的边距中单击来设置断点。在“项目”或“文件”窗口中右键单击项目节点,然后从上下文菜单中选择“调试项目”。Web 应用程序将在所设置的断点处停止。按 F7 步入代码。当由于缺少源代码而显示一个对话框时,按“确定”可选择缺省设置,即在源代码的第一行停止。继续按 F7 直到进入 ContentHandler 类的 otherDoStartTagOperations() 函数。在第 50 行 (request.getRequestDispatcher(page).include(request, response)) 设置断点,然后按 Ctrl-F5 组合键(继续)。将光标放在 "page"、"request" 和 "response" 上,查看相应的值。还可以在“局部变量”标签中查看这些值。请注意,“调用栈”标签将显示 JSP 代码和生成的 Servlet 方法之间关系。尝试设置其他断点。右键单击某个变量,然后从上下文菜单中选择“新建监视”。单击“监视”标签以查看在 Web 应用程序中执行各种页面时值的更改。选择“调试”>“完成会话”以退出会话调试。
测试 JSP 文件
要运行公共 JSP 文件(不在 WEB-INF 文件夹下的文件),只需右键单击该文件的节点,然后从上下文菜单中选择“执行”即可。如果已装入一个页面,单击浏览器的重新装入按钮将显示所做的全部修改。私有 JSP 文件(与本教程中的 JSP 文件类似)执行起来比较难度。要在无需重新启动 Web 应用程序,也无需导航到私有 JSP 文件页面的情况下测试已修改的私有 JSP 文件,使用 HTTP 监视器的重新显示功能是其中一种方法。通过将表的边框设置为 10 并保存所做的更改来修改 docs/cookies/Tray.jsp 文件。在 HTTP 监视器中,右键单击 GET Tray.jsp 记录,然后从上下文菜单中选择“重新显示”。Tray.jsp 页应该以更大的表边框显示在浏览器中。
词汇表
下面是本教程中使用的一些术语的解释。
复合视图
一种设计模式,用于显示 JSP 页中的信息。此设计模式创建一个基于组件视图的聚合视图。组件视图可能包括该页的动态部分和模块化部分。当您创建一个基于许多子视图的视图时,复合视图设计模式适用 Web 应用程序设计。复杂网页通常包含派生自各种资源的内容。页面的布局是独立于它的子视图的内容来管理的。例如,一个视图可能有“导航”、“搜索”、“功能说明”和“标题”等子视图。
创建复合视图时,可以包括静态内容和动态内容。静态内容可能包含一个 HTML 文件。动态内容是 JSP 页的一个片段。可以在 JSP 转换时或运行时确定具体内容。
前端控制器
前端控制器负责路由传入的请求,并强制在 Web 应用程序中导航。有关使用前端控制器设计模式的详细信息,请参见 J2EE 模式目录。
JSP 页
在 Web 应用程序中使用的页面,用于向最终用户显示信息,并使来自最终用户的数据流回服务器。要使 JSP 页能够在 IDE 中执行,必须将它置于 Web 应用程序内。
Servlet
Servlet 是在 Servlet 容器中执行的 Java 类,通常在 Web 服务器中运行。Servlet 用于执行以下操作:
- 生成动态内容。
- 扩展 Web 服务器以及支持 Web 的应用服务器的功能。
- 使用请求-响应范例与 Web 客户端交互(通常是浏览器应用程序,如 Firefox 或 Internet Explorer)
另请参见:
有关使用 NetBeans IDE 的详细信息,请参见以下资源:
要发送意见和建议、获得支持以及随时了解 NetBeans IDE J2EE 开发功能的最新进展,请加入 nbj2ee@netbeans.org 邮件列表。