使用 Click 框架進行 Java Web 應用程式開發 / 為什麼選擇 Click
本主題討論了 Click 背後的設計理念和背景,並希望能解釋為什麼有人會構建另一個 Java Web 應用程式框架。
Click 是一個現代 JEE Web 應用程式框架,提供了一種自然的富客戶端風格的程式設計模型。Click 的主要功能包括
Click 被設計成易於學習,以便新開發人員能夠在一天內快速上手。對於具有廣泛技能水平和動機的商業開發團隊來說,這一點非常重要。
我將 Tapestry(2.3)引入開發團隊的經驗是,它對於普通開發人員來說過於複雜,難以學習。我引入了 Tapestry 的兩個開發團隊最終放棄了它,並恢復使用 Struts。
Click 也比 Struts 更容易學習。Struts 框架雖然本質上是一個簡單的命令模式設計,但它的設計卻相當複雜和混亂。
為了支援易於採用,Click 提供了開源框架中最完善的文件,幷包含了許多工作示例。
如果您使用過 Swing、VB 或 Delphi 等傳統 GUI 程式設計,您就會知道 JEE Web 開發存在嚴重問題。JEE Web 開發速度緩慢、複雜且容易出錯。
第一代 JEE Web 框架之一是 Struts,它提供了一種命令模式設計和一組 JSP 標籤庫。不幸的是,使用 Struts,您仍然需要處理底層細節,將 URL 對映到操作,並使用原始的 ActionForms。它並沒有為您提供太多幫助。
Tapestry 是最早的基於元件的 JEE Web 框架之一,引入了元件層次結構、頁面和基於事件的程式設計模型。這是一種更高效的工作方式,也是我們在開發桌面 GUI 應用程式時所期望的。
Click 的理念是採用這種面向頁面和元件的設計方法,並使其更容易使用,更容易理解。
Click 提供了一種面向頁面的設計,包含了控制元件元件和基於事件的程式設計模型。Click 內建了 40 個控制元件,對應於主要的 HTML 元素。這是一種更簡單的程式設計方法。
Click 表單和控制元件提供自動驗證和渲染功能,使表單開發非常快速且健壯。
Click 無需 JSP 和 MVC。這是一件好事!
JSP 與 MVC 模式的錯誤應用多年來一直阻礙著 JEE Web 開發。我知道這是一個大膽的斷言,請讓我解釋一下。
MVC 是一種桌面 GUI 設計模式,它支援 UI 設計中角色的分離。模型是資料,檢視負責渲染,控制器負責修改資料。現在 MVC 是一種相當複雜的 UI 模式,它解決了多個檢視和控制器共享相同資料的難題。
然而,對於大多數 UI 開發來說,MVC 過於複雜。控制器和檢視通常是同一個東西。例如,選擇框就是檢視和控制器,它還包含模型。在 Swing 中,幸運的是,大多數 MVC 設計隱藏在表面之下。在 VB 和 Delphi 中,根本沒有 MVC。
在 JEE Web 開發的早期階段,設計模式被高度轉換,MVC 被抓取,早期的 Servlet/JSP 設計被貼上了 MVC 的標籤。在他們的分析中,模型通常是 DAO,檢視是 JSP,控制器是 Servlet。
這種做法的結果是鎖定了一種設計理念,其中 UI MVC 角色嚴格分離。這與將層分離的通用架構原則以及 JSP 實際上只適合渲染輸出這一事實相符。
不幸的是,這種嚴格分離的代價是封裝。大多數富客戶端 UI 元件封裝了它們的渲染和控制功能。Click 元件(控制元件)負責渲染自身(檢視)以及理解其含義(控制)。
為了檢視此概念的實際應用,讓我們以一個包含 ActionLink 控制元件的簡單 Click 頁面為例。
public class ExamplePage extends Page
{
public ActionLink myLink = new ActionLink(this, "onClick");
public boolean onClick()
{
System.out.println("onClick invoked");
return true;
}
}
我們在 HTML 頁面模板中包含了我們的myLinkActionLink 控制元件
<a href="$myLink.href">Click Me</a>
在執行時,控制元件的 href 屬性會渲染為
<a href="/mycorp/example-page.htm?actionLink=myLink">Click Me</a>
如果使用者點選連結,ActionLink 控制元件將呼叫頁面的 onClick() 方法。
相反,使用 JSP MVC 架構,JSP 可以告訴你一些東西,但它不能理解它剛剛說了什麼。請思考一下。沒有單個 UI 元件負責自己的操作。那麼誰來承擔這個責任呢?
您需要負責將眾多部分連線起來以使其正常工作。在 Struts 中,這可能包括
- 編寫一個自定義的操作類
- 編寫一個自定義的ActionForm類
- 在struts-config.xml檔案中指定操作元素
- 在form-bean元素在操作元素
- 在表單元素在validation.xml元素
- 中指定表單欄位驗證元素在validation.xml元素
- 確保 XML 元素之間的所有繫結都正確struts-config.xml, form-bean, 表單, 欄位
- 在 JSP 檔案中指定標籤庫包含
- 在 JSP 檔案中正確指定 <htm:form> 和 <html> 欄位標籤 XML 元素和屬性
在大型應用程式的開發中,這將成為一項繁瑣、乏味且容易出錯的任務。
這些設計中的另一個方面是將邏輯從 Java 程式碼轉移到 XML 配置檔案。Tapestry 和 Spring MVC 也大量使用 XML。這樣做的問題是編譯時錯誤現在只會在執行時出現。此外,編寫和維護大量 XML 比 Java 程式碼更困難。Java IDE 重構工具比現有的 XML 工具要強大得多。
Click 使您能夠應用面向物件的設計原則,例如子類化來擴充套件其他控制元件,或聚合來構建更復雜的 UI 元件。例如,Click 控制元件CreditCardField"是" 的子類TextField,並且"包含"Select控制元件用於指定卡型別。
對於渲染 HTML,Click 使用 Velocity 模板引擎。Velocity 具有簡單的指令集,非常容易學習和使用。例如,請檢視下面的模板。
#if (!$session.order.lineItems.empty)
<table>
<tr>
<th>Name</th> <th>Quantity</th> <th>Total Price</th>
</tr>
#foreach ($lineItem in $session.order.lineItems)
<tr>
<td>$lineItem.name</td>
<td>$lineItem.quantity</td>
<td>$lineItem.totalPrice</td>
</tr>
#end
</table>
#else
No items have been ordered.
#end
您應該對這段程式碼的功能有一個很好的瞭解,而無需查閱任何標籤庫文件。Velocity 的易用性使其成為 Click 的理想選擇。
Velocity 中唯一棘手的部分,配置,由 Click 自動處理。
請注意,您也可以在 Click 中使用 JSP 進行渲染。應該說,JSP 2.0 和 JSP 表示式語言在近年來提高了 JSP 的可用性。