Apache Wicket ,通常称为Wicket ,是一种轻量级的基于组件的Java Web应用框架 ,其概念类似于JavaServer Faces 和Tapestry 。它最初由乔纳森·洛克在2004年4月编写。2005年6月发布1.0版。2007年6月,它成功成为Apache 顶级项目。[ 2]
基本原理
传统的MVC 框架依据整个请求 和整个网页来工作。在每个请求周期内,输入请求被映射到一个控制器 对象的一个方法上,然后控制器 产生全部的输出响应,通常是从一个模型 拉出数据,并填入一个由特殊的模板标记 写成的视图 。这种方式保证了应用的控制流 简单清晰,但会导致控制器的代码很难被复用 。
与此相反,Wicket尽量模仿有状态 的GUI 框架,如Swing . Wicket应用像一棵组件 的树,其使用监听器委托 来响应基于链接和表单的HTTP 请求,并使用类似Swing组件的方式来响应鼠标和键盘事件。Wicket被归类为一个基于组件的框架。
设计
Wicket使用简单的XHTML 作为模板(其强制将展示和业务逻辑 进行明确的分离,并允许使用传统的所见即所得 设计工具来编辑模板[ 3] )。每个组件对应于XHTML中一个命名的元素,并负责在最后的输出中渲染该元素。网页 仅仅是顶级的组件容器,并匹配一个XHTML模板。使用一个特殊标签,一组独立的组件可以抽象成一个单独的组件——面板 ,然后面板就可以作为一个整体,在该网页,其它网页,甚至其它面板重复使用。
每个组件由它自己的模型支持,由模型来表现组件的状态。该框架并没有说明组件如何与它们的模型交互,它被视为黑箱 ,并会在请求间自动序列化 和持久化 。更加复杂的模型,甚至可以做成可拆分 的,并提供钩子 在每一个请求周期的开始和结束来安排自己的存储和恢复。Wicket并没有特定的对象持久化或ORM 层,所以应用通常结合Hibernate 对象、EJB 或POJO 作为模型使用。
在Wicket中,所有服务器端状态都是自动管理的。永远不要直接使用HttpSession或类似的对象来存储状态,而要让状态关联到组件上。每个服务器端页面组件拥有一个有状态组件的内嵌层级,在那里每个组件的模型最终是一个POJO。
Wicket一切从简。Wicket没有配置文件需要学习。Wicket是一个对组件结构有一致方法的简单类库。
举例
一个Hello World Wicket应用有四个文件:
HelloWorld.html
XHTML模板。
<!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”)。
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页面组件。
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 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 (页面存档备份 ,存于互联网档案馆 )
版本
版本号
日期
说明
1.3.7
2009-07-30
[ 4]
1.4
2009-07-30
“……我们开始告别Java 1.4,并要求使用Java 5作为最低JDK版本。通过使用Java 5作为所需的最低平台,我们能够利用Java 5来提高我们API的类型安全性。”[ 5]
1.4.1
2009-08-21
[ 6]
1.4.9
2010-05-24
“……超过十五处修复和改进”[ 7]
1.4.10
2010-08-11
“……超过三十处修复和改进。”[ 8]
1.4.16
2011-02-25
“这主要是一个在1.4.x(稳定)分支上发布的小修正。”[ 9]
1.4.17
2011-04-02
“这主要是一个在1.4.x(稳定)分支上发布的小修正。”[ 10]
1.4.18
2011-08-09
“这主要是一个在1.4.x(稳定)分支上发布的小修正。”[ 11]
1.4.19
2011-10-19
“这主要是一个在1.4.x(稳定)分支上发布的小修正。”[ 12]
1.5.0
2011-09-07
“Apache Wicket 1.5已经开发了两年了,相比以前的版本,它带来了许多改进。”[ 13]
1.5.1
2011-09-29
“……超过40处修复和15处改进。”[ 14]
1.5.2
2011-10-24
“……超过25处修复和5处改进。”[ 15]
1.5.3
2011-11-14
“……超过40处修复和改进。”[ 16]
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支持,层级反馈面板
参见
参考文献
注释
外部链接
介绍文章
博客
文档