NetBeans IDE 4.0 Midnight Cookie Company 教程
在此教程中生成的 Midnight Cookie Company 应用程序将向您展示如何执行以下操作:
此应用程序使用 JavaServer Pages 标准标记库 (JSTL) 来获取动态数据,并使在该应用程序中使用的 JSP 页国际化。
完成本教程大约需要两个小时。
设置环境
| 获得所需源文件 |
要创建 Midnight Cookie Company 应用程序,您需要 midnight.zip 文件,该文件包含应用程序基于的源文件。源文件包括 WEB-INF 文件夹,其中包含将在本教程中使用的 classes、docs、tlds 和 lib 文件夹。
- 在您的文件系统中,为解压缩的应用程序文件创建一个文件夹。从现在开始,将此文件夹称为 $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)。在“类别”下面,选择 "Web"。在“项目”下面,选择“包含现有源的 Web 项目”。单击“下一步”。
- 在“位置”中,单击“浏览”可选择 Web 应用程序的文档根目录。文档根目录是 $UNZIPHOME,这是您解压缩 midnight.zip 文件的文件夹。
- 在“项目名称”中,键入 Midnight。将“项目位置”更改为计算机上的任何文件夹。从现在开始,此文件夹称为 $PROJECTHOME。请注意,“上下文路径”是 /Midnight。单击“下一步”。
- 单击“完成”。IDE 创建了 $PROJECTHOME/Midnight 项目文件夹。该项目文件夹包含所有的源和项目元数据,如项目 Ant 脚本。在 IDE 中打开 Midnight 项目。您可以在“项目”窗口中查看其逻辑结构,并在“文件”窗口中查看其文件结构。
|
| 使用 servlet 创建前端控制器 |
前端控制器负责路由传入的用户请求,并且可以强制在 Web 应用程序中导航。前端控制器提供了一个入口点,几个资源的请求通过这个入口点在 Web 应用程序中传递。前端控制器可以减少 ISP 页面中代码的重复,尤其是在几个资源需要进行相同处理的时候。有关前端控制器的详细信息,请参阅“生成 Web 组件”编程系列丛书的“前端控制器”部分,可以从 Sun™ ONE Studio 开发人员资源 Web 站点的文档页面获得该丛书。
- 展开 Midnight 项目节点以及“源包”节点。
- 右键单击 com.midnightcookies 包节点,然后选择“新建”>“文件/文件夹”。在“类别”下面,选择 "Web"。在“文件类型”下面,选择 "Servlet"。单击“下一步”。
- 在“类名”文本框中输入 FrontController,并确保在“包”下拉列表中选中 com.midnightcookies 包。单击“下一步”。
- 将“URL 映射”文本框的值更改为以下值:
/docs/*, /
请注意,上一行中的 "," 是 URL 映射之间的分界符。其用于为每个 servlet 创建多个 URL 映射。
- 单击“完成”。
FrontController.java 将在“源编辑器”中打开。
- 展开 Web 页节点以及 WEB-INF 节点。双击 web.xml 节点。部署描述符文件 web.xml 的内容将显示在“源编辑器”中。注意,servlet 映射条目包含以下映射,该映射已在上述步骤 4 中定义:

servlet 映射 "/docs/*" 可以防止 FrontController servlet 向自身转发页面,而 servlet 映射 "/" 将为 FrontController servlet 提供一个 servlet 映射,以处理请求,如 http://hostname:portnumber/midnight/。
|
| 添加用于处理请求并创建 cookie 的方法 |
现在,您可以编辑 FrontController.java 文件,以包含处理 Web 应用程序所接收的请求的逻辑。您可以修改 processRequest 方法,并创建名为 createCookie 的新方法,其将说明如何创建在 Web 应用程序中使用的 cookie。
- 在“项目”窗口中,展开 FrontController.java 节点和 FrontController 类节点。将显示“字段”节点、“构造函数”节点、“方法”节点和“Bean 模式”节点。
- 展开“方法”节点并双击 processRequest 节点。源编辑器将显示 processRequest 方法。
- 在源编辑器中,右键单击左边距,并从上下文菜单中选择“显示行号”。
- 使用以下代码替换 processRequest 方法(第 39 到第 54 行)。
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.
// It is passed to the template in a request attribute.
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());
}
}
注意:将代码输入源编辑器后(通过键入或复制并粘贴),将光标放在源编辑器中,然后按 Ctrl-Shift-F 可以将代码自动重新格式化。
调用 createCookie 方法的行标有下划线并标记为错误,与下图类似。这是因为该方法尚不存在。采用以下步骤创建 createCookie 方法。
当您将光标置于错误框上(在源编辑器的左边距中带有白色十字的红色小方块)时,IDE 将描述该错误。
- 在源编辑器中,将光标放在靠近文件底部的 getServletInfo 方法后面。
- 复制以下代码并将其粘贴到源编辑器中,以创建 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-Shift-F 可以将代码自动重新格式化。
- 按 Ctrl-S 可保存文档。在源编辑器的文件标签中的星号将消失。只要存在尚未保存到磁盘的更改,此星号就会出现。
- 在“项目”窗口中,右键单击 FrontController.java 节点,然后选择“编译文件”,以检查已完成步骤中是否存在错误。“输出”窗口将显示来自编译器的消息,包含所有错误。您可以双击错误消息中的链接以查找错误的来源。在继续学习本教程之前,请首先解决在“输出”窗口中列出的所有错误。
|
| 创建接收所有请求的 JSP 页 |
main.jsp 页面将接收 FrontController servlet 处理的所有请求。动态包含语句和 LinksHandler 可用于创建该页面。
右键单击 Midnight 项目节点,然后选择“新建”> "JSP",将 JavaServer Pages 文件命名为 main。
单击“浏览”,以浏览到 WEB-INF/docs 文件夹,然后将其选中。现在 WEB-INF/docs 应显示在“文件夹”文本框中。单击“完成”。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="/WEB-INF/tlds/midnight.tld"%>
<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>
</span>
</TABLE>
</body>
</html>
注意:将代码输入源编辑器后(通过键入或复制并粘贴),将光标放在源编辑器中,然后按 Ctrl-Shift-F 可以将代码自动重新格式化。
- 按 Ctrl-S 保存所做的更改。
|
| 创建用于处理用户输入的参数文件 |
您在本部分中创建的参数文件说明如何使用标记库中的标记来处理国际化操作。这些文件还展示了如何通过“请求”参数输入,尤其是通过 JSP 表达式语言 (EL) 表达式 ${param.input}(这是在 Input.jsp 页面的输入字段中设置的)。
- 右键单击 docs 节点,并从上下文菜单中选择“新建”>“文件夹”。在“名称”文本字段中键入 parameters,然后单击“完成”。新 parameters 文件夹将出现“项目”窗口的 docs 节点下。
- 右键单击此 parameters 节点,然后选择“新建”> "JSP"。请注意,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 服务器来执行 Web 应用程序。如果缺省 Web 服务器已更改,则遵循设置缺省 Web 服务器中的步骤使 Tomcat 成为所有 Web 应用程序的缺省服务器。
-
在“项目”窗口中,右键单击 Midnight 项目节点,然后从上下文菜单中选择“运行项目”。
当应用程序已准备就绪并部署到 Web 服务器时,将出现进度监视器窗口。
在将 URL 设置为 http://hostname:port/midnight 的情况下启动 Web 浏览器。以下示例将展示在 Microsoft Windows 平台上运行的 Web 浏览器。

如果您在尝试执行此应用程序时接收到错误消息,请参见执行问题疑难解答,以获取一些可能的解决方案。
在缺省情况下,运行 Web 应用程序时会出现 HTTP 监视器。以下几节将为您介绍如何使用 HTTP 监视器来监视请求、会话和 cookies。
|
| 监视请求和会话 |
- 在“HTTP 监视器”窗口中,选择“当前记录”节点下面的最新项。
最新项表示 midnight Web 应用程序的请求。
- 选择“请求”标签,并查看如下信息。

- 选择“会话”标签,并查看如下信息。

- 在 Web 浏览器中,单击 "Parameters" 链接以显示 Input.jsp 页面。
Web 浏览器将显示如下信息。

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

- 在“HTTP 监视器”中,选择“当前记录”下面的最新项,然后选择“请求”标签。
HTTP 监视器将显示如下信息。

|
| 监视 cookies |
- 在 Web 浏览器中,单击 Cookies 链接。
Web 浏览器将显示 CookieCutter.jsp 页面。
- 在 "Name" 文本字段,键入 cookie,并在 "Value" 文本字段中,键入 chocolate。
- 单击 "Make me a cookie now!"。
Web 浏览器将显示如下信息。

- 在“HTTP 监视器”中,选择“当前记录”节点下面的最新项。
“HTTP 监视器”中的 Cookies 标签显示如下信息。
- 在 Web 浏览器中,单击 Cookie 托盘,Web 浏览器将显示如下信息。
- 在“HTTP 监视器”中,选择“当前记录”节点下面的最新项,然后选择 Cookies 标签。
HTTP 监视器将显示如下信息。
- 选择“请求”标签,“HTTP 监视器”将显示如下信息。

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

注意,nonesuch.jsp 页面的内容显示在不存在的 Bake.jsp 页面中。
|
| 启用国际化 |
- 为了查看此 Midnight Cookie Company Web 应用程序的国际化功能,应将 Web 浏览器使用的语言首选项修改为法语或瑞典语。
注意,您必须将这两种语言添加到目前可用于 Web 浏览器的语言列表。
- 重新装入或刷新您在前面的步骤中查看的页面。
注意,左侧导航栏中的链接和页底部的链接,以及一些应用程序 JSP 页的内容如何翻译为您所选择的语言。
Web 应用程序使用资源包属性文件来帮助您翻译在此 Web 应用程序中使用的一些页面。因此,翻译的范围仅限于资源包属性文件的内容。
|
执行问题疑难解答
如果执行 Midnight Cookie Company 应用程序时接收到一个错误消息,请参见以下这些有关执行问题的可能解决方案的提示:
| 当 IDE 尝试启动指定的浏览器时,接收到一个异常。 |
请检查为您所指定的与 IDE 一起使用的浏览器配置的路径是否正确:
- 从 IDE 的主窗口中选择“工具”>“选项”。
- 展开“IDE 配置”节点,然后展开“服务器和外部工具设置”。
- 选择“Web 浏览器”。
- 检查浏览器的路径是否设置正确。如果不正确,则单击浏览按钮或键入正确的路径。如果缺省浏览器是 Netscape 6.0 或 7.0,则将“DDE 服务器”属性设置为值 NETSCAPE6。
|
| 尝试显示 JSP 页时,接收到 File Not Found(找不到文件)错误。 |
如果将 Web 浏览器设置为使用代理服务器,则 Web 浏览器将试图通过代理服务器路由要查看的所有文件,包括本地文件。需要在 Web 浏览器设置中的绕过主机的列表中,添加 localhost 和您的计算机名称。有关其他信息,请参见 IDE 的核心 IDE 帮助中标题为“通过代理访问本地文件”的联机帮助页面。(从“目录”中选择“帮助”>“帮助集”>“核心 IDE 帮助”。)依次展开“配置环境”节点和“使用 Web 浏览器”节点。
|
| 执行 Web 应用程序时接收到 File not found(找不到文件)错误。 |
检查本教程中创建的 JSP 文件的名称。确保在“新建”向导中键入对象的名称时没有输入 .jsp 文件扩展名。如果需要,请重命名文件。
|
应用所学到的知识
| 添加一个“退出”链接,该链接能够将用户带入以相应的语言说“再见”的页面 |
- 右键单击 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" 节点以查看库中标记的列表。查看源编辑器中的“链接”标签及其属性,以查看它是否具有分隔符属性。
|
| 制作可从 IDE 使用的常用标记库 |
将 JSTL JAR 文件放置在永久位置中。从主菜单中选择“工具”>“库管理器”,并添加 JAR 文件。现在,通过右键单击“项目”或“文件”窗口的项目节点,然后选择“属性”,可以向任何 Web 应用程序添加这些标记库。在“项目属性”对话框中,可以使用“编译源”部分使标记库可用于代码完成,并且可以使用“包装项目”部分将标记库包含在 WAR 文件中。
|
| 调试 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 文件与本教程中的文件一样,执行起来有点困难。要在不重新启动 Web 应用程序的情况下测试修改的私有 JSP 文件并导航到该页面,一种方式是使用“HTTP 监视器”的重新显示操作。通过将表的边框设置为 10 并保存更改,修改 docs/cookies/Tray.jsp 文件。在“HTTP 监视器”中,右键单击 GET Tray.jsp 记录,然后从上下文菜单中选择“重新显示”。Tray.jsp 页面将以更大的表边框显示在浏览器中。
|
词汇表
下面是本教程中使用的一些术语的解释。
| 复合视图 |
一种设计模式,用于显示 JSP 页中的信息。该设计模式通过组件视图创建聚集视图。组件视图可能包含页面的动态部分和模块化部分。当通过多个子视图创建视图时,“复合视图”设计模式属于 Web 应用程序设计模式。复杂的 Web 页面通常由派生自各种资源的内容组成。页面布局的管理与其子视图的内容无关。例如,一个视图可能具有像“导航”、“搜索”、“功能介绍”和“标题”这样的子视图。
当创建复合视图时,可以包括静态内容和动态内容。静态内容可能由一个 HTML 文件组成。动态内容是 JSP 页的一个片段。可以在 JSP 转换时或运行时确定指定内容。
|
| 前端控制器 |
前端控制器负责路由传入的请求,并且可以强制在 Web 应用程序中导航。有关使用前端控制器设置模式的详细信息,请参见生成 Web 组件编程系列丛书的“前端控制器”部分,可以从 Sun™ ONE Studio 开发人员资源 web 站点的文档页面获得该丛书。
|
| JSP 页 |
在 Web 应用程序中使用的页面,用于向最终用户显示信息,并使来自最终用户的数据流回服务器。JSP 页必须放置在 Web 应用程序中才能使其在 IDE 中执行。
|
| Servlet |
Servlets 是在 servlet 容器中执行的 Java 类,它通常在 Web 服务器中运行。Servlets 用于执行以下操作:
- 生成动态内容。
- 扩展 Web 服务器和支持 web 的应用服务器的功能。
- 使用请求响应范例与 Web 客户机进行交互(通常是浏览器应用程序,如 Netscape 或 Internet Explorer)
|