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>
```


## 组件

* 基本组件，如表单、链接、循环等等为内置。参见http://www.wicket-library.com/wicket-examples/compref/ 
* 更多的，参见https://cwiki.apache.org/confluence/display/WICKET/Index 

## 版本

## 参见

* Vaadin
* Tapestry
* 
* ZK
* RichFaces
* Echo (架构)

## 参考文献

* 
* 
* 
* {{en}
* 

### 注释

## 外部链接

### 介绍文章

* IBM Wicket：一个用于构建及测试动态网页的简化框架 
* Wicket框架一瞥 
* 关于Wicket 1.0的服务器端讨论 
* 服务器端讨论 
* Javalobby采访Martijn Dashorst（项目主席）
* Martijn Dashorst讲Wicket

### 博客

* Wicket在运转 
* Martijn Dashorst 
* 布鲁诺·博尔赫斯
* 神秘的程序员 

### 文档

* Wicket的可重用组件和模式
* 
* 操作指南的Wiki、手册及更多 
* 在现实世界使用Wicket的众多例子
* 一个免费且全面的Wicket用户指南