Dreamweaver開發(fā)JSP頁面
Macromedia Dreamweaver 為 HTML 提供了豐富的可視化編輯環(huán)境,這些功能是所有的 Web 開發(fā)環(huán)境中都需要的。與其他工具相比,Dreamweaver 提供了更好的代碼編輯功能,包括為 Web 站點(diǎn)使用的宏,它們可以使用某種頁面語言,例如 ASP、ASP.Net、JSP、ColdFusion 和 PHP。擴(kuò)展宏讓您可以自動進(jìn)行登錄,實(shí)現(xiàn)類似何時隱藏的功能,自動顯示結(jié)果集,創(chuàng)建客戶結(jié)果集等等。您可以編輯并添加自己的代碼宏。在不同的頁面之間可能存在一些可以共享的代碼(HTML 或腳本)。對于 JSP 的支持來說,Dreamweaver 為 JavaBeans 和 JSP 定制標(biāo)簽庫提供了完整的方法/標(biāo)簽。
Dreamweaver開發(fā)JSP:視圖
讓我們開始創(chuàng)建一個視圖來顯示所有的書籍。首先在 Server Behaviors 中為 JSP 添加一個 RecordSet,并選擇希望在該表中顯示哪個表以及該表中的哪些列:
圖 2. Recordset 對話框
您可以看到我們已經(jīng)選擇從數(shù)據(jù)庫的 Books 表中顯示 Title、Authors 和 Publisher 字段;我們還會根據(jù) Title 字段,對結(jié)果進(jìn)行排序。在完成這個步驟之后,就可以將這些字段從 Bindings 窗口拖動到 Web 頁面上:
圖 3. Bindings 窗口
由于我們正在創(chuàng)建一個視圖,應(yīng)該創(chuàng)建一個表來顯示文檔中的每一行的內(nèi)容:
圖 4. Categories 視圖
注意,該視圖中有幾個“Repeat”指示器,并且高亮顯示了表中的某一行,指出這是一個 Repeating Region。這就是 Dreamweaver 的顯示 RecordSet 的方式,它通過循環(huán)遍歷記錄并重復(fù) HTML 部分的內(nèi)容來顯示 RecordSet。您也可以指定在 Repeat Region 對話框中顯示多少條記錄:
圖 5. Repeat Region 對話框
最后,您可以在該頁面中為結(jié)果添加一個導(dǎo)航條。雖然我們可以使用一個文本或圖形形式的導(dǎo)航條,但是為了簡便起見,此處我們將使用一個文本導(dǎo)航條:
圖 6. 導(dǎo)航條
現(xiàn)在我們可以看到在 Web 瀏覽器中顯示這個頁面時的樣子:
圖 7. Web 頁面
注意,如果您現(xiàn)在在第一個頁面中,那么導(dǎo)航條隱藏 Prev/First 部分。這個導(dǎo)航條還知道如何根據(jù)結(jié)果進(jìn)行分頁。由于您的重復(fù)字段被設(shè)置為一次只顯示 10 個結(jié)果,因此當(dāng)您單擊 Next 時,這個導(dǎo)航條就會顯示下 10 條結(jié)果。當(dāng)您在最后一個頁面中時,它還會隱藏導(dǎo)航條中的 Next/Last 部分。
Dreamweaver開發(fā)JSP:用戶身份驗(yàn)證
要支持 Notes 中那種對書籍進(jìn)行編輯或分類的功能,還需要提供一個單獨(dú)的 Web UI。然而,首先需要創(chuàng)建一個登錄頁面,因?yàn)槲覀儾⒉幌M總€用戶都可以修改書籍的類別??梢栽陧撁嬷蟹派蠋讉€登錄字段來實(shí)現(xiàn)這種功能,如果登錄失效,就顯示一條錯誤消息:
圖 8. 無效的登錄界面
您可以通過創(chuàng)建一個表單區(qū)域來實(shí)現(xiàn)這種功能,然后添加一個包含字段和字段標(biāo)簽的表。矩形的紅色區(qū)域是表單的邊界。表單操作被設(shè)置為跳回這個登錄頁面,因此必須添加一些代碼來處理實(shí)際的登錄操作。我們已經(jīng)添加了一條消息( JSP 圖標(biāo)邊上的文本)來顯示登錄失敗的用戶信息。
接下來我們要向這個頁面中添加一個 Login Server Behavior:
圖 9. Log In User 對話框
正如您可以看到的,允許您指定使用數(shù)據(jù)庫中的哪個表來進(jìn)行身份驗(yàn)證,并允許您指定登錄用戶的訪問級別(AccessLevel 字段)。您還可以指定用戶登錄成功或失敗之后將轉(zhuǎn)向哪個頁面。在登錄失敗時,我們添加了一個查詢字符串參數(shù) “l(fā)f”。我們還添加了一些定制的代碼(這就是 JSP 圖標(biāo)指示的內(nèi)容)來處理這種功能:
- < % if (request.getParameter("lf") != null) { %>
- < p align="center">Invalid Login!< /p>
- < % } /* end request.getParameter(lf) != null */ %>
不幸的是,并不存在這種內(nèi)嵌的 Dreamweaver Server Behavior,這與視圖的導(dǎo)航條的隱藏功能不同。由于這個原因,您需要使用一個很好的 Java 工具來實(shí)現(xiàn)這種等效的自動隱藏功能,除非您使用的是一個具有這種自動隱藏功能支持的 JSP 定制標(biāo)簽庫。
Dreamweaver開發(fā)JSP:訪問控制
Dreamweaver 有一種顯示對特定頁面的訪問的方便方法,除非用戶具有特定的訪問權(quán)限,否則將不能訪問特定頁面。Dreamweaver 對特定頁面的訪問是通過向頁面中添加一個 Restrict Access Server Behavior 實(shí)現(xiàn)的:
圖 10. Restrict Access to Page 對話框
在這種情況中,只有哪些在自己的登錄中具有管理員權(quán)限的用戶可以訪問這個頁面。真正實(shí)現(xiàn)這種功能的代碼(在該頁面的可視化表示中,您看不到這些代碼)如下所示:
- < %
- // *** 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開發(fā)JSP的缺點(diǎn)
Dreamweaver 為編輯頁面語言 Web 頁面提供了很好的環(huán)境(盡管它不能生成部署描述符)。不幸的是,異常行為會違反良好的 Web 架構(gòu)的一條規(guī)則:保持 UI 和邏輯分離。對于簡單的站點(diǎn),可以這樣做,但是對于復(fù)雜而健壯的站點(diǎn)來說,必須保持二者是分離的。因?yàn)橐獙?shù)據(jù)庫訪問操作和代碼直接加入 JSP 中,這使得對 Web 站點(diǎn)的管理變得更加困難,除非您嚴(yán)格使用 Dreamweaver 開發(fā)環(huán)境,或編寫自己的操作。即使您繼續(xù)使用 Dreamweaver 環(huán)境,也會有很多問題,因?yàn)槟赡軙?Dreamweaver 的版本, Server Behaviors 可能會發(fā)生變化,因此可能無法與以前的代碼匹配,這樣您就需要直接修改 JSP 代碼。
JSP 標(biāo)簽
JSP 定制標(biāo)簽和 JavaBeans 使得將用戶界面和業(yè)務(wù)邏輯分離成為可能。JSP 定制標(biāo)簽對于 Web 開發(fā)人員來說就像是定制的 HTML 標(biāo)簽。JavaServer Page Standard Tag Library(JSTL)是 JSP 1.3 中必不可少的一部分。JSTL 包含可以用來循環(huán)遍歷結(jié)果集并實(shí)現(xiàn) Hide-When 功能使用的標(biāo)簽。它還提供了 XML 處理和轉(zhuǎn)換標(biāo)簽的功能,并且可以引用與 JavaScript 類似的對象。最后,它還提供了對 JDBC 源的 SQL 訪問功能,不過如果您試圖將 UI 和業(yè)務(wù)邏輯分隔開,就應(yīng)該避免使用這些標(biāo)簽。
舉例來說,如果登錄失敗,那么登錄頁面將顯示一條“invalid login”消息。然而,這需要知道如何編寫一個 Java if 表達(dá)式,以及要從什么對象中獲取查詢字符串參數(shù):
- < % if (request.getParameter("lf") != null) { %>
- < p align="center">Invalid Login!< /p>
- < % } /* end request.getParameter(lf) != null */ %>
使用 JSP 定制標(biāo)簽重新編寫這段應(yīng)用程序,代碼如下:
- < c:if test="${!empty param.lf}">
- < p align="center">Invalid Login!< /p>
- < /c:if>
這就簡單多了,也不必要求 Web 頁面的設(shè)計者必須了解 Java 的語法了。
所有的數(shù)據(jù)庫訪問都應(yīng)該隱藏在 JavaBeans 中,以防止將 Web 站點(diǎn)的 UI 限制在數(shù)據(jù)庫中的數(shù)據(jù)上。降低數(shù)據(jù)的耦合度可以防止數(shù)據(jù)庫模式的變化,這會導(dǎo)致業(yè)務(wù)邏輯和用戶界面發(fā)生巨大的變化。如果處理適當(dāng),那么 JSP Web 頁面的設(shè)計者需要知道的惟一一件事情就是如何讀取 JavaBean 的值(這樣就可以在頁面中的適當(dāng)部分顯示)和要將頁面中的 POST 部分發(fā)往哪個 URL(通常是一個 servlet)。
【編輯推薦】


















