Wicket

Apache Wicket，通常稱為Wicket，是一種輕量級的基於組件的Java Web應用框架，其概念類似於JavaServer Faces和Tapestry。它最初由喬納森·洛克在2004年4月編寫。2005年6月發布1.0版。2007年6月，它成功成為Apache頂級項目。

## 基本原理

傳統的MVC框架依據整個請求和整個網頁來工作。在每個請求周期內，輸入請求被映射到一個控制器對象的一個方法上，然後控制器產生全部的輸出響應，通常是從一個模型拉出數據，並填入一個由特殊的模板標記寫成的視圖。這種方式保證了應用的控制流簡單清晰，但會導致控制器的代碼很難被復用。

與此相反，Wicket儘量模仿有狀態的GUI框架，如Swing. Wicket應用像一棵組件的樹，其使用監聽器委託來響應基於連結和表單的HTTP請求，並使用類似Swing組件的方式來響應滑鼠和鍵盤事件。Wicket被歸類為一個基於組件的框架。

## 設計

Wicket使用簡單的XHTML作為模板（其強制將展示和業務邏輯進行明確的分離，並允許使用傳統的所見即所得設計工具來編輯模板）。每個組件對應於XHTML中一個命名的元素，並負責在最後的輸出中渲染該元素。網頁僅僅是頂級的組件容器，並匹配一個XHTML模板。使用一個特殊標籤，一組獨立的組件可以抽象成一個單獨的組件——面板，然後面板就可以作為一個整體，在該網頁，其它網頁，甚至其它面板重複使用。

每個組件由它自己的模型支持，由模型來表現組件的狀態。該框架並沒有說明組件如何與它們的模型交互，它被視為黑箱，並會在請求間自動序列化和持久化。更加複雜的模型，甚至可以做成可拆分的，並提供軟體鉤子在每一個請求周期的開始和結束來安排自己的存儲和恢復。Wicket並沒有特定的對象持久化或ORM層，所以應用通常結合Hibernate對象、EJB或POJO作為模型使用。

在Wicket中，所有伺服器端狀態都是自動管理的。永遠不要直接使用HttpSession或類似的對象來存儲狀態，而要讓狀態關聯到組件上。每個伺服器端頁面組件擁有一個有狀態組件的內嵌層級，在那裡每個組件的模型最終是一個POJO。

Wicket一切從簡。Wicket沒有配置文件需要學習。Wicket是一個對組件結構有一致方法的簡單類庫。

## 舉例

一個Hello World Wicket應用有四個文件：

HelloWorld.html：XHTML模板。

```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="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>
    <span wicket:id="message" id="message">消息放在这里</span>
</body>
</html>
```

HelloWorld.java：將與模板關聯的頁面組件。而它又結合一個子組件（該標籤組件名為「message」）。

```java
package org.wikipedia.wicket;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;

public class HelloWorld extends WebPage {
    /**
     * Constructor
     */
    public HelloWorld() {
        add(new Label("message", "Hello World!"));
    }
}
```

HelloWorldApplication.java：應用主類，它將首頁的請求導向HelloWorld頁面組件。

```java
package org.wikipedia.wicket;

import org.apache.wicket.protocol.http.WebApplication;

public class HelloWorldApplication extends WebApplication {
    /**
     * Constructor.
     */
    public HelloWorldApplication() {
    }

    /**
     * @see org.apache.wicket.Application#getHomePage()
     */
    public Class getHomePage() {
        return HelloWorld.class;
    }
}
```

web.xml：該servlet應用的部署描述符，它安裝Wicket作為默認的servlet處理程序，並安排HelloWorldApplication在啟動時實例化。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns: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>Wicket Example</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>
```

## 組件

- 基本組件，如表單、連結、循環等等為內置。參見
- 更多的，參見

## 版本

版本號｜日期｜說明

1.3.7｜2009-07-30

1.4｜2009-07-30｜「……我們開始告別Java 1.4，並要求使用Java 5作為最低JDK版本。通過使用Java 5作為所需的最低平台，我們能夠利用Java 5來提高我們API的類型安全性。」

1.4.1｜2009-08-21

1.4.9｜2010-05-24｜「……超過十五處修復和改進」

1.4.10｜2010-08-11｜「……超過三十處修復和改進。」

1.4.16｜2011-02-25｜「這主要是一個在1.4.x（穩定）分支上發布的小修正。」

1.4.17｜2011-04-02｜「這主要是一個在1.4.x（穩定）分支上發布的小修正。」

1.4.18｜2011-08-09｜「這主要是一個在1.4.x（穩定）分支上發布的小修正。」

1.4.19｜2011-10-19｜「這主要是一個在1.4.x（穩定）分支上發布的小修正。」

1.5.0｜2011-09-07｜「Apache Wicket 1.5已經開發了兩年了，相比以前的版本，它帶來了許多改進。」

1.5.1｜2011-09-29｜「……超過40處修復和15處改進。」

1.5.2｜2011-10-24｜「……超過25處修復和5處改進。」

1.5.3｜2011-11-14｜「……超過40處修復和改進。」

1.6｜2012-09-05｜開始集成jQuery，完全基於AJAX請求來控制，改進在瀏覽器的事件註冊，支持大數據集、客戶端JavaScript庫的依賴管理，實驗性地支持websocket

1.6.3｜2013-01-02｜jQuery 1.8.2；修正IE7和IE8中的JavaScript錯誤。

1.6.4｜2013-01-14｜jQuery 1.8.3、Bootstrap 2.2.2、JSR 303 BeanValidation支持，層級反饋面板

## 外部連結

### 介紹文章

- IBM Wicket：一個用於構建及測試動態網頁的簡化框架
- Wicket框架一瞥
- 關於Wicket 1.0的伺服器端討論
- 伺服器端討論
- Javalobby採訪Martijn Dashorst（項目主席）
- Martijn Dashorst講Wicket

## 基本資料

- 日語原文：Apache Wicket
- 創辦人：Jonathan Locke
- 開發者：Apache軟體基金會
- 狀態：活躍
- 軟體版本週期：7.4.0
- 作業系統：跨平台（Java虛擬機）
- 程式語言：Java
- 類型：Web應用框架
- 許可協議：Apache許可證2.0