Dreamweaver開發JSP頁面
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)。
【編輯推薦】