Wicket

Wicket

Apache Wicket,通常被稱為wicket,她是一個輕量級的基於組件、事件驅動的Java web應用程式框架。在概念上類似於JSF和Tapestry。她最初是由喬納.森洛克(Jonathan Locke)於2004年4月開發。1.0版本正式發布於2005年6月。她於2007年6月結束孵化期,正式成為Apache Software Foundation的頂級項目。

原理

傳統的MVC框架需要處理每一個http請求和對應的頁面。在每一個請求周期中,傳入的請求映射到控制層對象上的某一個方法,然後生成輸出,通常由取出的模型數據來填充視圖頁面。視圖頁面一般是由模板標記語言來編寫的。這種開發方式使應用程式的流程控制簡單明了,但同時也使控制層的代碼復用困難。

設計

Wicket, 從一方面來說,她和其他的一些有狀態的桌面GUI框架很相似,比如說Swing。Wicket的組件是樹形結構的,這些組件監聽著由頁面的超連結或者表單傳送到伺服器的http請求。類似於Swing中的組件監聽著鍵盤和滑鼠的點擊事件一樣。所以將wicket歸類於基於組件的框架(component-basedframework)。wicket使用普通的XHTML作為她的模板標記語言,這樣就清晰的分離了界面和業務邏輯,而且xhtml可以使用任何你喜歡的編輯器去開發,包括所見即所得的圖形化編輯器。wicket的每一個組件和同名的xhtml模板進行綁定。並以此xhtml模板來進行頁面的渲染。模板代碼可以和對應的組件一起被服用,用特定的標籤在需要使用此模板的地方引用就可以了。

Wicket是完全面向對象的。我們可以利用組件的繼承性設計自己的套用。這裡不需要為處理HTTP協定的請求/回響而作任何工作。
Wicket所使用的markup檔案與純粹的HTML很接近,所以容易上手使用。Wicket在markup檔案中所引入的內容非常整潔,並符合XHTML標準。任何了解HTML的開發者都可以如編輯HTML檔案那樣編輯Wicket的markup檔案,就好似他並不知道這是Wicket的markup檔案一樣。

Wicket出色的原因:
*每個組件知道如何處理自己事件。因此我們只需要將組件放到頁面上,編寫事件處理器就行了。如果一個頁面中存在20個能引發事件的不同的組件,我們除了進行將它們添加到頁面上的工作外沒有別的工作。但如果在struts中,我們可能需要建立20個不同的Action類或者一個具有20個分支語句的Action類,並要在XML配置中逐一添加。
*Wicket帶給了我們考慮組件/事件重用的機會。而不用將注意力放到如何處理HTTP請求和回應上。
*與struts相比使用Wicket會降低我們的代碼量,這正是重用組件帶來的益處。Wicket本身不使用任何的XML配置檔案。只需要修改web容器的web.xml檔案中的servlet聲明部分。
假如我們曾經編寫過WindowsAPI、並用過VisualBasic或者BorlandDelphi的話,下面的比較會更加讓人印象深刻。使用struts開發就像使用WindowsAPI一樣:接收原始訊息,解碼原始訊息,然後再處理這些訊息。由於WindowsAPI是基於訊息循環工作的,所以系統除了訊息回應外不期望任何的返回值。
從另一方面看,Dephi在TApplication類中隱藏了windows訊息循環,使開發人員圍繞著TApplication類建立其他的類。原始的系統訊息就這樣被Dephi內建類接收,被內建類解析並被確定其接納者。訊息被轉換為一個事件,並被傳送到某個特定的對象。
如Windows應用程式一樣,Wicket套用也具有服務於文本和HTML模板的資源檔案。從這點看,Wicket象用Delphi做桌面開發一樣被用來做web開發。

樣例

Hello World 程式樣例

HelloWorld.html

這是標記模板
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
xml:lang="en"lang="en">
<body>
<spanwicket:id="message"id="message">Messagegoeshere</span>
</body>
</html>
HelloWorld.java

這個頁面組件將會綁定到上面的模板。在它裡面,又綁定了一個名稱為message的Label組件。
packageorg.wikipedia.wicket;
importorg.apache.wicket.markup.html.WebPage;
importorg.apache.wicket.markup.html.basic.Label;
publicclassHelloWorldextendsWebPage{
/**
*Constructor
*/
publicHelloWorld(){
add(newLabel("message","HelloWorld!"));
}
}

HelloWorldApplication.java

此為該程式的主入口。它會將該web程式的主頁的請求轉發到HelloWorld頁面組件中
packageorg.wikipedia.wicket;
importorg.apache.wicket.protocol.http.WebApplication;
publicclassHelloWorldApplicationextendsWebApplication{
/**
*Constructor.
*/
publicHelloWorldApplication(){
}
/**
*@seeorg.apache.wicket.Application#getHomePage()
*/
publicClassgetHomePage(){
returnHelloWorld.class;
}
}
web.xml

該web程式的描述定義。該檔案表示將在web程式啟動的時候初始化wicket,並將所有的請求交由HelloWorldApplication來處理。
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"version="2.5">
<display-name>WicketExample</display-name>
<filter>
<filter-name>HelloWorldApplication</filter-name>
<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
<init-param>
<param-name>applicationClassName</param-name>
<param-value>org.wikipedia.wicket.HelloWorldApplication</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>HelloWorldApplication</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

組件

常用的基本組件類似於表單、超連結、表格等在如下網址可以找到http://wicketstuff.org/wicket14/compref/
更多的說明在此 http://wicketstuff.org/confluence/display/STUFFWIKI/Wiki

相關詞條

相關搜尋

熱門詞條

聯絡我們