国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用Struts管理大型的復雜網站

2019-11-18 16:00:43
字體:
來源:轉載
供稿:網友

本文介紹 Struts,它是使用 servlet 和 javaServer Pages 技術的一種 Model-View-Controller 實現。Struts 可幫助您控制 Web 項目中的變化并提高專業化水平。盡管您可能永遠不會用 Struts 實現一個系統,但您可以將其中的一些思想用于您以后的 servlet 和 jsp 網頁的實現中。

簡介

小學生也可以在因特網上發布 Html 網頁。但是,小學生的網頁和專業開發的網站有質的區別。網頁設計人員(或者 HTML 開發人員)必須理解顏色、用戶、生產流程、網頁布局、瀏覽器兼容性、圖像創建和 javascript 等等。設計漂亮的網站需要做大量的工作,大多數 Java 開發人員更注重創建美麗的對象接口,而不是用戶界面。JavaServer Pages (JSP) 技術為網頁設計人員和 Java 開發人員提供了一種聯系鈕帶。 

假如您開發過大型 Web 應用程序,您就理解變化這個詞的含義。“模型-視圖-控制器”(MVC) 就是用來幫助您控制變化的一種設計模式。MVC 減弱了業務邏輯接口和數據接口之間的耦合。Struts 是一種 MVC 實現,它將 Servlet 2.2 和 JSP 1.1 標記(屬于 J2EE 規范)用作實現的一部分。盡管您可能永遠不會用 Struts 實現一個系統,但了解一下 Struts 或許使您能將其中的一些思想用于您以后的 Servlet 的 JSP 實現中。

在本文中,我將以一個 JSP 文件為起點討論該網頁的優缺點,該文件中使用的元素可能是您所熟悉的。隨后我將討論 Struts,并說明它是如何控制您的 Web 項目中的變化并提高專業化水平的。最后,我將重新開發這個簡單的 JSP 文件,在開發過程中我已顧及到網頁設計人員和變化。 

一個 JSP 文件就是一個 Java servlet 

JavaServer Page (JSP) 文件只是審閱 servlet 的另一種方式。JSP 文件的概念使我們能夠將 Java servlet 看作一個 HTML 網頁。JSP 消除了 Java 代碼中經常出現的討厭的 PRint() 語句。JSP 文件首先被預處理為 .java 文件,然后再編譯為 .class 文件。假如您使用的是 Tomcat,則可以在 work 目錄下查看預處理后的 .java 文件。別的容器可能將 .java 和 .class 文件存儲在其他位置;這個位置與容器有關。圖 1 說明了從 JSP 文件到 servlet 的流程。 

圖 1. 從 JSP 文件到 servlet 的流程

(這與 Microsoft 的 Active Server Page (asp) 明顯不同。ASP 被編譯到內存中,而不是編譯到一個單獨的文件中。)

簡單的獨立 JSP 文件

在小型 JSP 應用程序中,經常會看到數據、業務邏輯和用戶界面被組合在一個代碼模塊中。此外,應用程序通常還包含用來控制應用程序流程的邏輯。清單 1 和圖 2 展示了答應用戶加入一個郵件列表的一個簡單 JSP 文件。

清單 1. join.jsp -- 一個簡單的請求和響應 JSP 文件 <%@ page language="java" %>

<%@ page import="business.util.Validation" %>

<%@ page import="business.db.MailingList" %>

<%

String error = "";

String email = request.getParameter("email");

// 是否有電子郵件地址

if( email!=null ) {

// 驗證輸入...

if( business.util.Validation.isValidEmail(email) ) {

// 存儲輸入...

try {

business.db.MailingList.AddEmail(email);

} catch (Exception e) {

error = "Error adding email address to system.  " + e;

}

if( error.length()==0 ) {

%>

// 重定向到歡迎頁...

<jsp:forward page="welcome.html"/>

<%

}

} else {

// 設置錯誤消息并重新顯示網頁

error = email + " is not a valid email address, please try again.";

}

} else {

email = "";

}

%>

<html>

<head>

<title>Join Mailing List</title>

</head>

<body>

<font color=red><%=error%></font><br>

<h3>Enter your email to join the group</h3>

<form action="join.jsp" name="joinForm">

<input name="email" id="email" value=<%=email%>></input>

<input type=submit value="submit">

</form>

</body>

</html>



圖 2. 在簡單的請求和響應中,JSP 文件設置數據、控制到下一個網頁的流程并創建 HTML

這個郵件列表 JSP 文件是一個獨立的、自主完成所有任務的模塊。未包含在這個 JSP 文件中的僅有代碼是包含在 isValidEmail() 中的實際驗證代碼和將電子郵件地址存入數據庫的代碼。(將 isValidEmail() 方法分離到可重用的代碼中似乎是當然的選擇,但我曾見過直接嵌入網頁中的 isValidEmail() 代碼。單頁方法的優點是易于理解,并且最初也易于構建。此外,對于各種圖形化開發工具,入門也很輕易。

join.jsp 的活動

顯示打開的輸入網頁。 

從表單參數中讀取 email 的值。 

驗證 email 地址。 

假如 email 地址有效:

將該地址添加到數據庫中。 

重定向到下一個網頁。 

假如 email 地址無效:

設置錯誤消息。 

重新顯示含有錯誤消息的 join.jsp。 

單頁方法的后果 

HTML 和 Java 強耦合在一起

JSP 文件的編寫者必須既是網頁設計者,又是 Java 開發者。其結果通常要么是很糟的 Java 代碼,要么是難看的網頁,有時甚至 Java 代碼和網頁都很糟。

Java 和 Javascript 的不足

隨著網頁逐漸變大,很輕易想到實現一些 JavaScript。當網頁中出現 JavaScript 時,這種腳本就可能與 Java 代碼產生混淆。可能產生混淆的一個例子是使用客戶端的 JavaScript 來驗證 email 域。

內嵌的流程邏輯

要理解應用程序的整個流程,您必須瀏覽所有網頁。試想一下擁有 100 個網頁的網站的錯綜復雜的邏輯。

調試困難

除了很糟的外觀之外,HTML 標記、Java 代碼和 JavaScript 代碼都集中在一個網頁中還使調試變得相當困難。

強耦合

更改業務邏輯或數據可能牽涉相關的每個網頁。

美學

在很大的網頁中,這編碼樣式看起來雜亂無章。我過去進行 Microsoft ASP 開發時,我經常看到有 1000 行的網頁。即使有彩色語法顯示,閱讀和理解這些代碼仍然比較困難。 

請別在我的 HTML 中加入太多的 Java 代碼

在清單 1 中,不是 Java 代碼中有大量的 HTML,而是在 HTML 文件中有大量的 Java 代碼。從這個觀點來看,除了答應網頁設計人員編寫 Java 代碼之外,我實際上沒做什么。但是,我們并不是一無所有;在 JSP 1.1 中,我們獲得一種稱為“標記”的新特性。

JSP 標記只是將代碼從 JSP 文件中抽取出來的一種方式。有人將 JSP 標記看作是 JSP 文件的宏,其中用于這個標記的代碼包含在 servlet 中。(宏的觀點在很大程度上是正確的。)出于同樣的原因,我不希望在 Java 代碼中看到 HTML 標記,我也不希望在 JSP 文件中看到 Java 代碼。JSP 技術的整個出發點就是答應網頁設計人員創建 servlet,而不必糾纏于 Java 代碼。標記答應 Java 程序員將 Java 代碼偽裝成 HTML 來擴展 JSP 文件。圖 3 顯示了從 JSP 網頁中抽取代碼并將它們放入 JSP 標記中的一般概念。

圖 3. JSP 標記

清單 2 是用來說明 Struts 標記的功能的一個例子。在清單 2 中,正常的 HTML <form> 標記被用 Struts <form:form> 標記替換。清單 3 顯示了瀏覽器接收到的結果 HTML。瀏覽器獲得 HTML <form> 標記,但帶有附加代碼,如 JavaScript。附加的 JavaScript 激活 email 地址域。服務器端的 <form:form> 標記代碼創建適當的 HTML,并使網頁設計人員不再接觸 JavaScript。

清單 2. Struts 的 form 標記

<form:form action="join.do" focus="email" >

<form:text   property="email" size="30" maxlength="30"/>

<form:submit property="submit" value="Submit"/>

</form:form>



清單 3. 發送給瀏覽器的結果 HTML

<form name="joinForm" method="POST" action="join.do;jsessionid=ndj71hjo01">

<input type="text" name="email" maxlength="30" size="30" value="">

<input type="submit" name="submit" value="Submit">

</form>

<script language="JavaScript">

<!--

document.joinForm.email.focus()

// -->

</script>



有關 JSP 標記的注重事項: 

JSP 標記需要一個運行 JSP 1.1 或更高版本的容器。

JSP 標記在服務器上運行,而不像 HTML 標記那樣由客戶機解釋。

JSP 標記提供了適當的代碼重用機制。

可以使用一種稱為 include 的 JSP 機制將 HTML 和 JavaScript 添加到網頁中。但是,開發人員經常會創建巨大的 JavaScript 庫文件,這些庫文件被包含在 JSP 文件中。結果返回給客戶機的 HTML 網頁要比必需的 HMTL 網頁大得多。include 的正確用法是僅將它用于生成諸如頁眉和頁腳這類內容的 HTML 代碼段。

通過抽取出 Java 代碼,JSP 標記使開發角色更加專業化。

模型-視圖-控制器 (MVC)

JSP 標記只解決了部分問題。我們還得處理驗證、流程控制和更新應用程序的狀態等問題。這正是 MVC 發揮作用的地方。MVC 通過將問題分為三個類別來幫助解決單一模塊方法所碰到的某些問題: 

Model(模型)

模型包含應用程序的核心功能。模型封裝了應用程序的狀態。有時它包含的唯一功能就是狀態。它對視圖或控制器一無所知。

View(視圖)

視圖提供模型的表示。它是應用程序的外觀。視圖可以訪問模型的讀方法,但不能訪問寫方法。此外,它對控制器一無所知。當更改模型時,視圖應得到通知。

Controller(控制器)

控制器對用戶的輸入作出反應。它創建并設置模型。 

MVC Model 2

Web 向軟件開發人員提出了一些特有的挑戰,最明顯的就是客戶機和服務器的無狀態連接。這種無狀態行為使得模型很難將更改通知視圖。在 Web 上,為了發現對應用程序狀態的修改,瀏覽器必須重新查詢服務器。

另一個重大變化是實現視圖所用的技術與實現模型或控制器的技術不同。當然,我們可以使用 Java(或者 PERL、C/C++ 或別的語言)代碼生成 HTML。這種方法有幾個缺點: 

Java 程序員應該開發服務,而不是 HTML。 

更改布局時需要更改代碼。 

服務的用戶應該能夠創建網頁來滿足它們的特定需要。 

網頁設計人員不能直接參與網頁開發。 

嵌在代碼中的 HTML 很難看。

對于 Web,需要修改標準的 MVC 形式。圖 4 顯示了 MVC 的 Web 改寫版,通常也稱為 MVC Model 2 或 MVC 2。

圖 4. MVC Model 2

Struts,MVC 2 的一種實現

Struts 是一組相互協作的類、servlet 和 JSP 標記,它們組成一個可重用的 MVC 2 設計。這個定義表示 Struts 是一個框架,而不是一個庫,但 Struts 也包含了豐富的標記庫和獨立于該框架工作的實用程序類。圖 5 顯示了 Struts 的一個概覽。

圖 5. Struts 概覽

Struts 概覽

Client browser(客戶瀏覽器)

來自客戶瀏覽器的每個 HTTP 請求創建一個事件。Web 容器將用一個 HTTP 響應作出響應。

Controller(控制器)

控制器接收來自瀏覽器的請求,并決定將這個請求發往何處。就 Struts 而言,控制器是以 servlet 實現的一個命令設計模式。struts-config.xml 文件配置控制器。

業務邏輯

業務邏輯更新模型的狀態,并幫助控制應用程序的流程。就 Struts 而言,這是通過作為實際業務邏輯“瘦”包裝的 Action 類完成的。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 夏津县| 南部县| 石阡县| 茶陵县| 龙岩市| 南澳县| 微博| 新郑市| 峨眉山市| 清原| 新竹县| 八宿县| 获嘉县| 淮安市| 佳木斯市| 威海市| 平原县| 商都县| 霍林郭勒市| 山阳县| 成都市| 东丰县| 巩义市| 防城港市| 鹿邑县| 都江堰市| 同心县| 民和| 长寿区| 山西省| 会东县| 广南县| 湘潭市| 金坛市| 新疆| 宁海县| 伊宁县| 五常市| 建德市| 伊金霍洛旗| 武陟县|