Macromedia Dreamweaver 为 HTML 提供了丰富的可视化编辑环境,这些功能是所有的 Web 开发环境中都需要的。与其他工具相比,Dreamweaver 提供了更好的代码编辑功能,包括为 Web 站点使用的宏,它们可以使用某种页面语言,例如 ASP、ASP.Net、JSP、ColdFusion 和 PHP。扩展宏让您可以自动进行登录,实现类似何时隐藏的功能,自动显示结果集,创建客户结果集等等。您可以编辑并添加自己的代码宏。在不同的页面之间可能存在一些可以共享的代码(HTML 或脚本)。对于 JSP 的支持来说,Dreamweaver 为 JavaBeans 和 JSP 定制标签库提供了完整的方法/标签。
Dreamweaver开发JSP:视图
让我们开始创建一个视图来显示所有的书籍。首先在 Server Behaviors 中为 JSP 添加一个 RecordSet,并选择希望在该表中显示哪个表以及该表中的哪些列:
图 2. Recordset 对话框
您可以看到我们已经选择从数据库的 Books 表中显示 Title、Authors 和 Publisher 字段;我们还会根据 Title 字段,对结果进行排序。在完成这个步骤之后,就可以将这些字段从 Bindings 窗口拖动到 Web 页面上:
图 3. Bindings 窗口
由于我们正在创建一个视图,应该创建一个表来显示文档中的每一行的内容:
图 4. Categories 视图
注意,该视图中有几个“Repeat”指示器,并且高亮显示了表中的某一行,指出这是一个 Repeating Region。这就是 Dreamweaver 的显示 RecordSet 的方式,它通过循环遍历记录并重复 HTML 部分的内容来显示 RecordSet。您也可以指定在 Repeat Region 对话框中显示多少条记录:
图 5. Repeat Region 对话框
最后,您可以在该页面中为结果添加一个导航条。虽然我们可以使用一个文本或图形形式的导航条,但是为了简便起见,此处我们将使用一个文本导航条:
图 6. 导航条
现在我们可以看到在 Web 浏览器中显示这个页面时的样子:
图 7. Web 页面
注意,如果您现在在第一个页面中,那么导航条隐藏 Prev/First 部分。这个导航条还知道如何根据结果进行分页。由于您的重复字段被设置为一次只显示 10 个结果,因此当您单击 Next 时,这个导航条就会显示下 10 条结果。当您在最后一个页面中时,它还会隐藏导航条中的 Next/Last 部分。
Dreamweaver开发JSP:用户身份验证
要支持 Notes 中那种对书籍进行编辑或分类的功能,还需要提供一个单独的 Web UI。然而,首先需要创建一个登录页面,因为我们并不希望每个用户都可以修改书籍的类别。可以在页面中放上几个登录字段来实现这种功能,如果登录失效,就显示一条错误消息:
图 8. 无效的登录界面
您可以通过创建一个表单区域来实现这种功能,然后添加一个包含字段和字段标签的表。矩形的红色区域是表单的边界。表单操作被设置为跳回这个登录页面,因此必须添加一些代码来处理实际的登录操作。我们已经添加了一条消息( JSP 图标边上的文本)来显示登录失败的用户信息。
接下来我们要向这个页面中添加一个 Login Server Behavior:
图 9. Log In User 对话框
正如您可以看到的,允许您指定使用数据库中的哪个表来进行身份验证,并允许您指定登录用户的访问级别(AccessLevel 字段)。您还可以指定用户登录成功或失败之后将转向哪个页面。在登录失败时,我们添加了一个查询字符串参数 “lf”。我们还添加了一些定制的代码(这就是 JSP 图标指示的内容)来处理这种功能:
- < % if (request.getParameter("lf") != null) { %>
- < p align="center">Invalid Login!< /p>
- < % } /* end request.getParameter(lf) != null */ %>
不幸的是,并不存在这种内嵌的 Dreamweaver Server Behavior,这与视图的导航条的隐藏功能不同。由于这个原因,您需要使用一个很好的 Java 工具来实现这种等效的自动隐藏功能,除非您使用的是一个具有这种自动隐藏功能支持的 JSP 定制标签库。
Dreamweaver开发JSP:访问控制
Dreamweaver 有一种显示对特定页面的访问的方便方法,除非用户具有特定的访问权限,否则将不能访问特定页面。Dreamweaver 对特定页面的访问是通过向页面中添加一个 Restrict Access Server Behavior 实现的:
图 10. Restrict Access to Page 对话框
在这种情况中,只有哪些在自己的登录中具有管理员权限的用户可以访问这个页面。真正实现这种功能的代码(在该页面的可视化表示中,您看不到这些代码)如下所示:
- < %
- // *** Restrict Access To Page: Grant or deny access to this page
- String MM_authorizedUsers="Administrator";
- String MM_authFailedURL="accessdenied.jsp";
- boolean MM_grantAccess=false;
- if (session.getValue("MM_Username") != null && !session.getValue
- ("MM_Username").equals("")) {
- if (false || (session.getValue("MM_UserAuthorization")=="") ||
- (MM_authorizedUsers.indexOf((String)session.getValue("MM_UserAuthorization"))
- >=0)) {
- MM_grantAccess = true;
- }
- }
- if (!MM_grantAccess) {
- String MM_qsChar = "?";
- if (MM_authFailedURL.indexOf("?") >= 0) MM_qsChar = "&";
- String MM_referrer = request.getRequestURI();
- if (request.getQueryString() != null) MM_referrerMM_referrer
- = MM_referrer + "?" + request.getQueryString();
- MM_authFailedURLMM_authFailedURL = MM_authFailedURL + MM_qsChar
- + "accessdenied=" + java.net.URLEncoder.encode(MM_referrer);
- response.sendRedirect(response.encodeRedirectURL(MM_authFailedURL));
- return;
- }
- %>
正如您可以看到的,它是与 Login Server Behavior 紧密地绑定在一起的。
Dreamweaver开发JSP的缺点
Dreamweaver 为编辑页面语言 Web 页面提供了很好的环境(尽管它不能生成部署描述符)。不幸的是,异常行为会违反良好的 Web 架构的一条规则:保持 UI 和逻辑分离。对于简单的站点,可以这样做,但是对于复杂而健壮的站点来说,必须保持二者是分离的。因为要将数据库访问操作和代码直接加入 JSP 中,这使得对 Web 站点的管理变得更加困难,除非您严格使用 Dreamweaver 开发环境,或编写自己的操作。即使您继续使用 Dreamweaver 环境,也会有很多问题,因为您可能会更新 Dreamweaver 的版本, Server Behaviors 可能会发生变化,因此可能无法与以前的代码匹配,这样您就需要直接修改 JSP 代码。
JSP 标签
JSP 定制标签和 JavaBeans 使得将用户界面和业务逻辑分离成为可能。JSP 定制标签对于 Web 开发人员来说就像是定制的 HTML 标签。JavaServer Page Standard Tag Library(JSTL)是 JSP 1.3 中必不可少的一部分。JSTL 包含可以用来循环遍历结果集并实现 Hide-When 功能使用的标签。它还提供了 XML 处理和转换标签的功能,并且可以引用与 JavaScript 类似的对象。最后,它还提供了对 JDBC 源的 SQL 访问功能,不过如果您试图将 UI 和业务逻辑分隔开,就应该避免使用这些标签。
举例来说,如果登录失败,那么登录页面将显示一条“invalid login”消息。然而,这需要知道如何编写一个 Java if 表达式,以及要从什么对象中获取查询字符串参数:
- < % if (request.getParameter("lf") != null) { %>
- < p align="center">Invalid Login!< /p>
- < % } /* end request.getParameter(lf) != null */ %>
使用 JSP 定制标签重新编写这段应用程序,代码如下:
- < c:if test="${!empty param.lf}">
- < p align="center">Invalid Login!< /p>
- < /c:if>
这就简单多了,也不必要求 Web 页面的设计者必须了解 Java 的语法了。
所有的数据库访问都应该隐藏在 JavaBeans 中,以防止将 Web 站点的 UI 限制在数据库中的数据上。降低数据的耦合度可以防止数据库模式的变化,这会导致业务逻辑和用户界面发生巨大的变化。如果处理适当,那么 JSP Web 页面的设计者需要知道的惟一一件事情就是如何读取 JavaBean 的值(这样就可以在页面中的适当部分显示)和要将页面中的 POST 部分发往哪个 URL(通常是一个 servlet)。