Wicket 开发教程


Wicket Wicket Wicket Wicket 开发指南 作者:王磊(wl_95421@yahoo.com.cn) 版本 时间 作者 备注 0.1 2006-9-21 王磊 初稿 0.2 2006-09-24 王磊 添加 Ajax 章节 0.5 2006-09-25 王磊 定稿 0.6 2006-10-21 王磊 修改了前言,添加了几张图片 0.7 2006-12-31 王磊 大量更新,可参见更新日志 Wicket 开发指南 第 2 页 共344 页 目录 目录..................................................................................................................................................2 序言................................................................................................................................................13 更新备忘录....................................................................................................................................15 关于作者........................................................................................................................................16 阅读指南........................................................................................................................................17 1. Wicket 简介............................................................................................................................... 18 1.1. Wicket 前生后世篇............................................................................................................18 1.2. 关于重新发明轮子的争论................................................................................................ 19 1.3. Wicket 与目前 Web 框架的比较...................................................................................... 20 1.3.1. Strust 概述:..................................................................................................................20 1.3.2. Tapestry 概述..............................................................................................................21 1.3.3. ASP.NET 概述............................................................................................................23 1.3.4. Wicket 概述................................................................................................................ 23 1.4. Wicket 的特性....................................................................................................................24 1.4.1. 更加纯粹的 Java 和OO.............................................................................................24 1.4.2. 分离关注点,易于协同开发.....................................................................................24 1.4.3. 安全.............................................................................................................................25 1.4.4. 可以无缝支持集群.....................................................................................................25 1.4.5. 控件复用.....................................................................................................................25 1.4.6. 支持表单数据验证.....................................................................................................25 1.4.7. Session 类型安全........................................................................................................26 1.4.8. 扩展工厂.....................................................................................................................26 1.4.9. 可懒加载的 Model......................................................................................................26 1.4.10. 支持所有基本 Html 元素的功能.............................................................................26 1.4.11. 通过程序控制 Html 的属性 26 1.4.12. 类型自动转换 26 1.4.13. 动态图片 27 1.4.14. 数据分页 27 1.4.15. 树形控件 27 1.4.16. 国际化 27 1.4.17. 单元测试 27 Wicket 开发指南 第 3 页 共344 页 1.4.18. 例子...........................................................................................................................27 1.5. Wicket 的用途....................................................................................................................28 1.6. Wicket 的不足....................................................................................................................28 1.7. Wicket 的前景....................................................................................................................28 2. 如何配置 Wicket 来开发 Web 程序.........................................................................................28 2.1. 安装 Wicket 自带的例子程序...........................................................................................28 2.2. 使用 Eclipse 开发 Wicket 程序.........................................................................................30 2.2.1. 安装 Eclipse 开发环境:..............................................................................................30 2.2.2. 配置 Eclipse 开发 Wicket 的环境:.............................................................................31 3. 第一个例子................................................................................................................................36 3.1. 老姜一块--"Hello World"...................................................................................................36 3.2. Wicket 程序的开发步骤....................................................................................................37 3.2.1. 制作一个 Html 模板...................................................................................................37 3.2.2. 编写 Java 控制代码:...................................................................................................38 3.2.3. 编写 Application.........................................................................................................39 3.2.4. 使用 web.xml 配置 Web 程序....................................................................................40 4. Wicket 的基本结构................................................................................................................... 43 4.1. 结构概述............................................................................................................................ 43 4.2. MVC 结构.......................................................................................................................... 44 4.2.1. 基本结构.....................................................................................................................44 4.2.2. View 与Control 的映射.............................................................................................44 4.3. Wicket 的控件体系............................................................................................................45 4.3.1. Component 的继承体系............................................................................................. 45 4.3.2. MarkupContainer 的继承体系....................................................................................46 4.3.3. Link 的继承体系........................................................................................................ 47 4.3.4. FormComponent 的继承体系.....................................................................................48 4.3.5. WebMarkupContainerWithAssociatedMarkup 的继承体系......................................49 4.3.6. 完整的 Wicket 继承体系 50 4.4. Wicket 事件驱动 50 4.4.1. Wicket 的事件驱动结构 51 4.4.2. Wicket 如何调用 Listener 53 4.5. Wicket 如何处理用户请求 53 4.6. Wicket 的状态管理 56 4.7. 部署 Wicket 程序 57 Wicket 开发指南 第 4 页 共344 页 5. Wicket 基本控件....................................................................................................................... 58 5.1. 信息输出控件.................................................................................................................... 58 5.1.1. 单行信息输出控件 Label...........................................................................................58 5.1.2. 多行信息输出控件 MutlineLabel.............................................................................. 60 5.2. 控件容器............................................................................................................................ 61 5.2.1. 容器面板 WebMarkupContainer................................................................................61 5.2.2. 组合面板 Panel...........................................................................................................62 5.2.3. 边框控件 Border.........................................................................................................62 5.2.4. 包含控件 Include........................................................................................................63 5.3. 超链接控件........................................................................................................................ 64 5.3.1. 普通链接控件 Link.................................................................................................... 64 5.3.2. 外部链接控件 ExternalLink.......................................................................................66 5.3.3. 页面链接控件 PageLink.............................................................................................66 5.3.4. 书签链接控件 BookmarkablePageLink ....................................................................67 5.3.5. 文件下载链接 DownloadLink....................................................................................69 5.3.6. 弹出窗口设置 PopupSetting...................................................................................... 70 5.4. 表单输入控件.................................................................................................................... 71 5.4.1. 表单控件 Form........................................................................................................... 71 5.4.2. 信息输出控件 FeedbackPanel....................................................................................72 5.4.3. Button 控件..................................................................................................................73 5.4.4. 图片按钮 ImageButton...............................................................................................76 5.4.5. 提交链接 SubmitLink.................................................................................................76 5.4.6. 输入文本控件 TextField............................................................................................ 77 5.4.7. 支持数据必填的文本控件 RequiredTextField..........................................................78 5.4.8. 密码输入控件 PasswordTextField.............................................................................79 5.4.9. 多行输入文本控件 TextArea.....................................................................................80 5.4.10. 选择框控件 CheckBox.............................................................................................80 5.4.11. 多选框控件 CheckBoxMultipleChoice 81 5.4.12. 增强的多选框控件 84 5.4.13. 下拉框控件 DropDownChoice 86 5.4.14. 单选列表框控件 ListChoice 87 5.4.15. 多选列表框控件 ListMultipleChoice 89 5.4.16. 单选组合框控件 RadioChoice 89 5.4.17. 增强的单选组合框控件 91 Wicket 开发指南 第 5 页 共344 页 5.4.18. 图像控件 Image........................................................................................................93 5.4.19. 文件上传控件 FileUploadField................................................................................94 5.5. 数据列表控件.................................................................................................................... 96 5.5.1. 简单的数据分页控件 ListView.................................................................................96 5.5.2. 支持数据分页的列表控件 PageableListView...........................................................98 5.6. 日历控件 DatePicker........................................................................................................101 6. 国际化 Wicket 程序................................................................................................................ 103 6.1. 使用 StringResourceModel 进行国际化......................................................................... 103 6.2. 通过标签进行国际化...................................................................................................... 103 6.3. 通过 Html 实现国际化....................................................................................................104 7. Wicket 最佳实践一................................................................................................................. 106 7.1. 支持用户注册的表单程序.............................................................................................. 107 7.1.1. 编写用户实体类.......................................................................................................108 7.1.2. 编写相应的 Html 页面模板.....................................................................................108 7.1.3. 编写 Java 页面代码..................................................................................................110 7.1.4. 不要忘记我们的 Application...................................................................................113 7.1.5. 使用 web.xml 配置 Web 程序..................................................................................113 7.2. 为表单程序添加数据验证.............................................................................................. 115 7.2.1. 验证信息何处来?..................................................................................................... 116 7.2.2. Form 验证数据的流程............................................................................................. 118 7.2.3. 完整的 Html 模板.....................................................................................................120 7.2.4. 完整的 Java 代码......................................................................................................120 7.3. 支持文件上传的表单程序.............................................................................................. 123 7.3.1. 增加文件上传控件...................................................................................................123 7.3.2. 完整的结果...............................................................................................................126 7.4. 一个简单的数据列表程序.............................................................................................. 127 7.4.1. 定义书籍的实体类...................................................................................................128 7.4.2. 实现我们的功能 129 7.5. 一个支持分页的数据列表程序 131 7.6. 在数据列表程序中添加超链接和选择框 133 7.7. 使用 Proxy 和Lazy-Loading 帮助 List 动态载入数据 137 8. Wicket 的Model 及数据绑定 140 8.1. 最简单的 Model 141 8.2. 支持国际化的 Model 142 Wicket 开发指南 第 6 页 共344 页 8.2.1. 使用 JavaBean 的属性来格式化国际化字符串......................................................143 8.2.2. 使用 Map 来格式化国际化字符串..........................................................................144 8.3. 利用反射来访问对象属性的 Model...............................................................................145 8.4. 嵌套的 Model...................................................................................................................146 8.5. 不要修改我的数据.......................................................................................................... 147 8.6. 如何支持集群.................................................................................................................. 147 8.7. 更方用的动态数据模型 LoadableDetachableModel......................................................148 9. 数据转换..................................................................................................................................148 9.1. Wicket 数据转换的设计..................................................................................................149 9.2. 自定义 Converter............................................................................................................. 149 9.3. 灵活的 ITypeConverter....................................................................................................151 9.4. 将URLConverter 加入到整个系统中............................................................................ 153 10. 编写自己的控件....................................................................................................................155 10.1. 一个最简单的邮件通知面板控件................................................................................155 10.2. 为控件添加 Css 和JavaScript.......................................................................................158 11. Wicket 的Html 标签............................................................................................................. 163 11.1. wicket:id......................................................................................................................... 163 11.2. .......................................................................................................... 164 11.3. ............................................................................................................164 11.4. ..................................................................................................................167 11.5. ................................................................................... 167 11.6. .................................................................................168 11.7. ......................................................................................................... 173 11.8. ......................................................................................................177 11.9. ............................................................................................................. 178 11.10. ..............................................................................................................178 12. Wicket 高级控件................................................................................................................... 178 12.1. 树型控件 Tree................................................................................................................179 12.2. 超强的 TreeTable 182 12.3. 数据分页控件 186 12.3.1. RepeatingView 控件 187 12.3.2. DataView 控件 190 12.3.3. GridView 控件 193 12.3.4. DataGridView 控件 197 12.3.5. DataTable 控件 200 Wicket 开发指南 第 7 页 共344 页 12.4. 聪明的向导,简单页面流............................................................................................203 12.4.1. 向导的结构.............................................................................................................204 12.4.2. 向导的相关控件.....................................................................................................206 12.4.3. 如何使用向导.........................................................................................................206 12.5. 交换我们数据 Palette.................................................................................................... 206 12.6. 聪明的超链接................................................................................................................208 12.7. Tab 控件.........................................................................................................................209 13. Wicket 最佳实践二............................................................................................................... 213 13.1. 一个简单的向导............................................................................................................213 13.1.1. 写一个简单的功能介绍.........................................................................................215 13.2. 编写"选择报表"的向导 Panel.......................................................................................216 13.3. 编写"填写报表参数"的向导 Panel...............................................................................219 13.4. 编写"浏览报表"的向导 Panel.......................................................................................221 14. Ajax 控件及其使用............................................................................................................... 223 14.1. 使用 AjaxLink................................................................................................................224 14.2. 提交表单及数据验证....................................................................................................226 14.3. 灵活的连动下拉框........................................................................................................229 14.4. 自动完成文本框............................................................................................................232 14.5. 动态数据分页................................................................................................................234 14.6. Tab 控件.........................................................................................................................235 14.7. 模态窗口........................................................................................................................235 14.8. Wicket 的Ajax 可以在哪些浏览器中运行..................................................................242 15. 构建安全的 Wicket 程序...................................................................................................... 243 15.1. 常见的安全处理............................................................................................................243 15.2. Wicket 的安全处理........................................................................................................244 15.3. 一个简单的安全实例....................................................................................................245 16. 构建 Wicket 集群.................................................................................................................. 246 16.1. 安装基本环境 247 16.2. 安装 Tomcat 247 16.3. 配置 Tomcat 248 17. Wicket 的单元测试 249 17.1. WicketTester 的结构 250 17.2. 操作 WicketTester 250 17.2.1. 页面控制 250 Wicket 开发指南 第 8 页 共344 页 17.2.2. 测试控件控制.........................................................................................................250 17.2.3. 测试数据交互.........................................................................................................251 17.2.4. 断言.........................................................................................................................251 17.3. 测试我们的"Hello World".............................................................................................252 17.4. 测试链接........................................................................................................................253 17.5. 测试我们的表单数据....................................................................................................253 17.6. 测试 Ajax 程序.............................................................................................................. 254 17.6.1. 将WebPage 输出为 Html...................................................................................... 255 18. Wicket 利器--Wicket Bench..................................................................................................255 18.1. 什么是 Wicket Bench.................................................................................................... 255 18.2. 安装 Wicket Bench........................................................................................................ 256 18.2.1. 使用 Eclipse 的Update 在线安装......................................................................... 256 18.2.2. 下载安装包.............................................................................................................259 18.3. Wicket_Bench 的功能................................................................................................... 259 18.3.1. Wicket Editor.......................................................................................................... 259 18.3.2. Wicket 向导............................................................................................................ 259 18.3.3. Wicket 页面向导.................................................................................................... 260 18.3.4. Wicket 面板向导.................................................................................................... 261 18.3.5. 定制 Wicket 页面的模板...................................................................................... 261 18.3.6. 快速修正错误.........................................................................................................262 18.3.7. 支持 Wicket 重构................................................................................................... 262 18.3.8. 自动生成 Form 代码..............................................................................................263 18.3.9. Wicket 解析器........................................................................................................ 264 19. Wicket 的FAQ...................................................................................................................... 265 19.1. 关于本文档....................................................................................................................265 19.1.1. 这份文档是免费的吗?...........................................................................................265 19.1.2. 我可以修改这份文档吗?.......................................................................................266 19.1.3. 这份文档会更新吗?...............................................................................................266 19.1.4. 我可以引用这份文档中的内容吗? 266 19.1.5. 代码中使用的一些类如 List,Date 分别是什么? 266 19.2. 关于开发环境 267 19.2.1. 如何编写 Properties 文件 267 19.2.2. 使用什么工具开发 Wicket 的Html 模板啊? 267 19.2.3. 为什么下载的源码与书上的不一致呢? 268 Wicket 开发指南 第 9 页 共344 页 19.3. Wicket 概念....................................................................................................................268 19.3.1. Wicket 的Session 与J2EE 的Session 有什么区别?............................................268 19.3.2. 存放数据时应该如何选择 Session........................................................................269 19.3.3. 系统有许多功能,是不是要为每个功能写一个Application的子类,那Web.xml 会不会很庞大呢?................................................................................................................ 269 19.3.4. Wicket 将数据存放在 ISessionSotre,何时释放这些数据................................. 269 19.3.5. Wicket 中有没有像 Struts 中的全局资源文件?...................................................270 19.3.6. 如果能定义多个 Properties 文件,那 Wicket 的搜索顺序如何?....................... 270 19.4. Wicket 控件....................................................................................................................273 19.4.1. Wicket 的WebPage 有五个构造函数,如何使用啊?.........................................273 19.4.2. 如何避免将 Wicket 属性输出到客户端?............................................................. 273 19.4.3. 如何避免将 Html 标签输出到客户端?.................................................................274 19.4.4. 能不能一劳永逸的关闭 Html 标签输出功能?.....................................................276 19.4.5. 为什么我的标签没有被正常输出啊?...................................................................276 19.4.6. 如何转向一个非 Wicket 页面............................................................................... 277 19.4.7. 如果一个连接指向当前页面,如何使其失效?...................................................277 19.4.8. 系统中有大量 Word,Excel 内容,但都是以二进制的方式存放在数据库中,并 没有在硬盘上存放文件,这种情况如何处理呢?............................................................ 278 19.4.9. 如果商务合作的一个网站,经常更换 Logo,所以希望直接引用那个 Logo,在 Wicket 如何处理这样的问题呢?........................................................................................279 19.4.10. 我可以在 Wicket 中使用 Frame 吗.....................................................................280 19.4.11. 我能够动态的指定 Html 元素的某个属性值吗?...............................................280 19.4.12. 在前面基础控件介绍中,有一个增强的多选框控件,是否一定要提供一个 boolean 属性?.......................................................................................................................284 19.4.13. 我可以动态改变页面上的控件吗?.....................................................................284 19.4.14. 我可以对数据验证时产生的错误进行排序吗?.................................................288 19.5. Wicket 表单....................................................................................................................289 19.5.1. 验证表单输入时,如何在 Properties 中动态指定错误信息? 289 19.5.2. 如果两个 Form 在同一页面上,如何控制错误信息的输出? 289 19.6. Wicket 列表控件 291 19.6.1. Wicket 提供了太多的列表控件,我应该用哪个呢? 291 19.6.2. 客户希望对数据列表的某一列进行排序,应该如何处理? 293 19.6.3. 为什么 AjaxPagingNavigator 和GridView 结合使用时无效呢? 293 19.6.4. 这样的明细表格如何实现呢? 295 Wicket 开发指南 第 10 页 共344 页 19.6.5. 如何使用下拉框或者文本框来导航数据列表.....................................................302 19.6.6. 如何定制导航条中的页码文字.............................................................................302 19.6.7. 想定制导航条中首页,尾页的文字.....................................................................304 19.6.8. 如何定制一个按字母顺序分页的数据列表啊.....................................................305 19.7. Wicket 树控件................................................................................................................310 19.7.1. 如何更改 Wicket 树上结点的文字呢?................................................................. 310 19.7.2. 如何更改 Wicket 树上结点的图标呢?................................................................. 310 19.7.3. 如何更改 Wicket 树上结点被点击时的行为?..................................................... 310 19.7.4. 为什么我找不到 Wicket 中的 TreeTable 控件啊.................................................311 19.7.5. 为什么我使用 Tree 控件得到结果与书上写的不一样?......................................311 19.7.6. Wicket 在核心包和扩展包中都提供了 Tree 控件,两者有什么区别呢?.........313 19.8. 调试 Wicket 程序...........................................................................................................313 19.8.1. Wicket 常见的错误有哪几种?.............................................................................. 313 19.8.2. 每次修改Html 文件或者是Java 文件,Tomcat 都要半天才能使用,如何加快调 试速度?................................................................................................................................ 314 19.9. 关于 Ajax....................................................................................................................... 314 19.9.1. Wicket 的Ajax 可以在哪些浏览器中运行.......................................................... 314 19.9.2. 我使用 Ajax 的时候,为什么出现了 Wicket Ajax Debug 的字样?................... 315 19.9.3. 如何查看 Ajax 的运行信息,方便调试...............................................................315 19.9.4. 我写了 Ajax 程序,但是没有更新客户端的内容...............................................315 19.10. Wicket 系统配置......................................................................................................... 315 19.10.1. 我一定要把 Html 模板同 Java 放置在一起吗?................................................. 315 19.10.2. 如果我只是想调整 Html 模板,还需要每次重新部署程序吗?.......................316 19.10.3. 为什么按照前面所说的方式设置了资源目录,转变Html文件后更新很慢?317 19.10.4. 如何得知程序运行在何种模式下?.....................................................................317 19.10.5. 如何编程设置当前用户的国家和地区...............................................................317 19.10.6. 如何设置 Wicket 的日志,以便查看详细的运行信息?................................... 318 19.10.7. 为什么会经常出现页面过期的问题? 319 19.10.8. 为了提高集群的速度,我不希望将页面保存在 Session 中,而是数据库中, 如何处理呢? 319 19.10.9. 我可以定义自己的过期提示页面吗? 320 19.10.10. 我可以定义自己的错误处理页面吗,象过期页面一样? 320 19.10.11. 如何获得原始的 HttpServletRequest 和HttpServletResponse 320 19.10.12. 如何获得原始的 HttpSession 321 Wicket 开发指南 第 11 页 共344 页 19.10.13. 我使用 Wicket 自带的 Session 保存用户名,为什么总会丢失呢?...............321 19.10.14. 如何在 Wicket 中支持 Http 安全协议..............................................................321 19.10.15. 在Wicket 中,所有的页面都是有状态的吗?.................................................321 19.10.16. 我在页面中输出中文字符不正确?...................................................................322 19.10.17. Wicket 将页面放置在 Session 中,如何减少内存占用呢?............................322 19.11. 关于 URL.....................................................................................................................323 19.11.1. WIcket 的Url 太难看了,可以变漂亮一些吗?.................................................323 19.11.2. 我觉得 Wicket 自动生成的 Url 还不够安全,如何处理?................................323 19.11.3. 对于通过 mount 设置的 URL,如何卸载?........................................................324 19.11.4. 如何使得一个 URL 在指定时间内有效.............................................................325 19.12. 关于 Model.................................................................................................................. 325 19.12.1. Wicket 提供了多个 Model 的实现,还有抽象类,应该如何使用?................325 19.13. 深入 Wicket................................................................................................................. 326 19.13.1. 我想将 Wicket 输出的页面保存成 Html,可以吗?..........................................326 19.13.2. 我已经对 Wicket 有所了解,如何才能进一步学习 Wicket 呢....................... 326 19.14. 安装问题......................................................................................................................326 19.14.1. 如何下载 2.0 版本................................................................................................326 19.14.2. 如何下载最新版本的 Wicket..............................................................................327 20. 附录........................................................................................................................................327 20.1. Wicket 与Struts 两个框架比较.................................................................................... 327 20.2. Wicket 与Tapestry 两个框架比较................................................................................331 20.3. 从1.2 移植到 2.0...........................................................................................................335 20.3.1. 支持 JDK5 而不再支持 JDK1.4............................................................................335 20.3.2. 控件构造函数的变化.............................................................................................336 20.3.3. 通过 Html 配置控件...............................................................................................337 20.4. Wicket 提供的 Validator............................................................................................... 338 20.5. 网友对 Wicket 的评价...................................................................................................341 20.5.1. 来自 Ryan Crumley 的评价 341 20.6. 开发 Wicket 的一些网站和资料 342 20.6.1. Wicket 342 20.6.2. Wicket-Stuff 342 20.6.3. Wicket-Quickstart 342 20.6.4. Wicket-Library 342 20.6.5. DataBinder 343 20.6.6. Hibernate 343 Wicket 开发指南 第 12 页 共344 页 20.6.7. QWicket.................................................................................................................. 343 20.6.8. Wicket Bench..........................................................................................................343 20.6.9. Mail-Archive...........................................................................................................343 20.6.10. 一些 Blog..............................................................................................................344 Wicket 开发指南 第 13 页 共344 页 序言 想写一份如何开发 Wicket 的指南文档,源于 2005 年中,那是用 Wicket1.0 完成了一个 项目以后的想法,觉得如此好的一个Web框架,应该让更多的开发人员了解和使用它。因 此在05年9月份的时候开始了这份文档的初稿,前面十几页正文都是那个时候写就的,但 是因为忙于自己的开源项目,再加上后来也没有机会使用 Wicket 开发 Web程序,文档也 就这样耽误下来了。今年,由于几个同事和朋友说起培训和使用Wicket 时缺少资料,所以 决定将这份文档完成,算是给自己一个交待吧,也当为开源软件作一些自己的贡献。通过 近六周的笔耕,这份《Wicket 开发指南》终于写完了。这是第一次写这么长的文档,开心 的是毕竟坚持下来了,这个序言,不仅仅让读者了解这份文章,也是写给自己的,聊作一 个记念。 在撰写本书时,几个普元软件的朋友阅读了初稿,给出了一些中肯的意见,在本书发 布时,也得到了普元公司的大力支持,本文得以发布在 GoCom 网站上,有了栖身之所, 而网站的负责人也为此热心的开辟了一个 Wicket 的BBS 版面,用来讨论,希望在 GoCom 以及更多读者,用户的支持下,可以将它变成中国Wicket 网站的大本营。你可以通过以下 链接访问这个 BBS。http://gocom.primeton.com/modules/newbb/viewforum41.htm 在撰写本书前,先在Wicket 网站上逛了一段时间,发现Wicket 的开发人员非常勤奋, 版本更新也比较快,其勤奋度在 SourceForge 上也是前几十名。据最新的 SourceForge 排 名,它已经到了前 40 名,对于一个有着数十万开源软件的网站而言,已经非常出色了。 再回头看看最新发布的 Wicket1.2.4,无论是结构上,还是代码质量上都已经比较成熟了。 特别是最新的 Wicket 版本已经支持了当前灸手可热的Ajax,有了更加灵活的客户端功 能。而且近一年来,许多热心的开发人员为 Wicket 开发了很多的控件和工具,如 Eclipse 插件 WicketBench,Hibernate 的数据绑定控件 DataBinder 等。 在审核本文的时候,从 Wicket 网站得到了一个新的好消息,Wicket 正在从 SourceForget 移到了 Apache,Apache 无疑是许多 Java 开发人员心中开源软件的 No.1,这 一举动,无疑在 Wicket 的身上加了一个重重的筹码,相信更加有利于 Wicket 的推广。值 得商榷的是,Tapestry已经成为Apache 的一级项目(象IBatis 也是),那么Wicket 会是几 级呢,会与 Tapestry 同级,或者暂时栖身于 Jakarta,成为一个二级子项目呢。让我们拭目 以待吧。另外,也有一个公司现在开始提供Wicket 方面的技术支持,包括培训,服务等, 由此可见 Wicket 的魅力所在。使用 Wicket 开发,正当其时。 Wicket 开发指南 第 14 页 共344 页 这份文档前前后后花了近六周的时间,因为平时还需要上班,主要是利用晚上的时间 来写文档,所以问题肯定有不少,如果有哪位朋友发现了问题,烦请指出,我会虚心接 受,我的相关资料也写在文档中,可以与我联系。 一份作品的好坏,不仅取决于作者,更重要的是在于读者的参与。 很喜欢北京奥运的那句口号:同一个世界,同一个梦想(One World,One Dream),希 望在软件的世界也是如此。 最后,谢谢几个朋友和同事,他们为这份文章也出力颇多,由于一些原因,不太方便 列出他们的名字,但是非常感谢他们的支持。 谢谢,所有的读者。 Wicket 开发指南 第 15 页 共344 页 更新备忘录 以下是0.7 0.7 0.7 0.7 版本的更新内容(因为这个版本更新的内容比较多,所以加了备忘录) 1. 修正了一些文字上的错误 2. 在国际化章节中添加了的内容 3. 添加了《Wicket 标签》章节 4. 添加了《数据转换》章节 5. Wicket 基本结构这一章添加了以下内容  Wicket 控件体系  事件驱动  部署程序 6. 为Wicket 基本控件章节添加了以下内容  ImageButton  弹出窗口连接 7. Wicket 的Model 这一章节添加关于 LoadableDetachableModel 的使用说明 8. FAQ 章节添加了以下内容  关于开发环境  Wicket 概念  Wicket 表单  Wicket 列表控件  Wicket 树控件  安装问题 9. 附录中对《Wicket2.0 的新特性》这一节添加了内容 10. 附录中添加《网友对 Wicket 的评价》 Wicket 开发指南 第 16 页 共344 页 关于作者 我叫王磊,在一家公司做着一个普通程序员,喜欢编码,偶尔也会写一些文章。 如果你对这份文档有意见,可以去我的 Blog(http://www.blogjava.net/wl95421/)发表 意见,你可以提出意见,但是建议不要人身攻击,谢谢。 因为我本身还有许多工作要做,只能利用晚上或者周末的时间来回答问题时,可能不 会很及时,请原谅。不过我会不定期的更新文档,将最新的 Wicket 技术以及 Wicket 常见 的问题放到文档中,方便查找。 另外,还有一个论坛,这是普元公司的提供的 Wicket 论坛 (http://gocom.primeton.com/modules/newbb/viewforum41.htm),你可以在上面发贴询问关 于Wicket 的问题,相信会有开发人员帮助你解决问题。 我的 Email 是wl_95421@yahoo.com.cn,但是这个邮箱只回答非技术问题(如建 议),如果有技术问题,请还是去上面的 Wicket 论坛提问。 Wicket 开发指南 第 17 页 共344 页 阅读指南 因为 Wicket 国内的用户还比较少,所以阅读本书的不少朋友可能都是刚刚接触 Wicket,在这时给出一些阅读意见,希望可以帮助大家快速的了解书的结构,进而更快的 学习 Wicket。 如果你是一个从未使用过 Wicket 的程序员,建议你从头到尾的阅读本书,虽然第一章 并没有什么技术方面的内容,但是至少可以提供一些 Wicket 设计以及其它方面的背景知 识,而 FAQ 中的内容则不必全文阅读,可以在必要的问题,来查询使用。 如果你对 Wicket 已经有了一些了解,那我建议你可以重点阅读以下章节,也可以根据 自己的需要阅读某些章节:  第4章Wicket 的基本结构  第8章Wicket 的Model 及数据绑定  第9章编写自己的控件  第11章Wicket 的Html 标签  第15 章构建安全的 Wicket 程序  第17 章Wicket 的单元测试 如果你是一个 Wicket 高手,可能的话,不妨帮我挑挑错,对于个人的学习,Wicket 的 MailList 可能会更合适一些,也欢迎你来论坛帮助更多的人来使用 Wicket。 Wicket 开发指南 第 18 页 共344 页 1.1.1. 1. Wicket Wicket Wicket Wicket 简介 1.1.1.1.1.1. 1.1. Wicket Wicket Wicket Wicket 前生后世篇 Wicket 是什么?简单点说,它是一个基于Java 的Web开发框架,与Struts,WebWork, Tapestry相类似。其特点在于对Html 和代码进行了有效的分离(有利于程序员和美工的合 作),基于规则的配置(减少了 XML 等配置文件的使用),学习曲线较低(开发方式与 C/S 相似),更加易于调试(错误类型比较少,而且容易定位)。如果你对微软并不反感,可 以把它看作 Java 平台上的 ASP.NET。 Wicket 现在是 Sourceforge 上一个非常活跃的项目,源码的发布和使用基于 Apache 协 议(即 APL,也是最宽松,对商业最友好的的源码协议,可以通过 http://www.apache.org/licenses/LICENSE-2.0),项目位于 http://wicket.sourceforge.net,另 外它还有一个独立的域名网站 http://www.wicketframework.org/。最新的消息则是,Wicket 已经成为 Apache 孵化器项目,可以通过 http://incubator.apache.org/projects/wicket.html 来 访问,但SourceForge 上的网站仍然可以访问。 Wicket 出现时,著名的 J2EE 网站 TSS(即 http://www.TheServerSide.com,以后简称 TSS),对该项目也进行了讨论,有一段旷日持久的论战(地址: http://www.theserverside.com/news/thread.tss?thread_id=28162:),论战主力当然就是Wicket 的主要作者 Jonathan Locke 和Tapestry 的作者 Howard Lewis Ship,争论的内容十分广泛, 从URL 的格式到系统结构,从扩展性到界面开发,如果有时间的话,我尽量将其中部分 内容翻译过来,还是很精彩的。(TSS 上很多的讨论都非常精彩,如果英文好的话,建议 经常上去看看,国外的牛人就是多啊。有时候我也觉得很奇怪,这些人都不用睡觉的吗, 看他们的帖子,完全覆盖了 24 小时,感觉他们的老板真是宽容啊)。 Wicket 的作者中有几个是原 Sun 公司 Swing 小组的开发人员(现在可能大部分已经不 是了,我认为尽管 Swing 从界面来看,实在不算一个很成功的作品,但其设计却是非常的 优秀),因此 Wicket 的框架中带有浓厚的 C/S 色彩。而他们的开发计划中,还包括了 Swing,Flash 平台的支持,也就是说使用 Wicket 不仅可以可以输出 Html,而且可以支持 Swing 和Flash,不过和朋友经过讨论后,觉得这个计划看起来有一点不切实际,毕竟 Html,Swing,Flash 之间的差别还是很大,恐怕想要无缝移植,还是有点难度的。单是一 个JavaScript,恐怕就够头痛了。 Wicket 带有强烈 C/S 结构的 UI色彩,这一点有助于美工和程序人员的分工,它与 Delphi 的开发方式非常类似(Delphi 使用.frm 文件保存UI控件的定义,便于可视化设计, 而用.pas 文件存储代码,从而对控件进行操作)。Wicket 则是使用 Html 描述 UI,并将具 Wicket 开发指南 第 19 页 共344 页 有特殊标记的Html 元素定义为UI控件,在java文件中则直接使用代码操作这些UI控件, 控制其输出及行为,样式等。这一点和 Tapestry,以及.NET 平台上的 ASP.NET 极为相 似,也怪不得与 Tapestry 的作者争论了这么久,毕竟两者的用户群有很多的重复。其实从 结构上看来,无论是 Tapestry,ASP.Net,Wicket 估计都借鉴了 Applet 平台上的 WebObjects,还有 Delphi。(不要忘了,Delphi 的创建者 Anders Hejlsberg 就是.net 框架的 架构师,所以 C#和Asp.net 怎么看都带着 Delphi 的影子。) Wicket 目前最新的版本是 1.2.4版,已经很好的支持了 AJAX,但感觉这个框架的发展 时间毕竟还是短了一点,尽管设计思想很不错,但还是有许多问题存在的,包括控件的数 量,BUG 较多,还有社区的文档也较少(开源软件的文档一直都开源社区心口永远的 疼。)等,希望 2007年它可以更加成熟,能够得到更广泛的应用。 1.2.1.2.1.2. 1.2. 关于重新发明轮子的争论 谈到Wicket,恐怕第一个感觉就是在Java 的Web开发中又多了一个轮子,这一点国内 外的程序员好象都是一样。 有一个国外的Blog 专门写了一篇关于轮子的文章,说明了重复发明轮子的必要性。我 个人对于这种轮子是持一种欢迎的态度,因为没有人会去写一段功能完全一样的东东,总 是要修正了原有轮子的不足,这样就不能简单当作一种重复。 即使是功能重复,就不需要轮子了吗?JSP 能完成 Struts 的所有功能,而 Tapestry 能做 到的,Struts 也全部可以做到,但Struts,Tapestry就不需要了吗?Struts 的MVC 结构比JSP 更加优秀,在很大程度上减轻了开发人员开发量,而 Tapestry 基于组件的开发方式,则是 开创了一种新的 Web 开发方式,对于多语言的支持也有了新的方式。以往开发多语言页 面时,往往使用 properties 保存字符串资源,但是页面通常都没有什么变化。而 Tapestry 可以通过不同的 Html 为不同的国家指定不同的页面。 Wicket 吸收了 Tapestry 的一部分内容,但我最喜欢的就是,它是基于规则的,而并非 XML 配置的方式,这不仅有利于程序员学习,对系统的维护及开发规范都很有效,毕竟 XML 的编写并不见得就比写一段程序来得更容易。(这里插一句题外话,我觉得 XML 文 件用来表示数据和资源,而不是行为,所以对于 XML 我只用来存放多语言资源或者用来 做数据交换。象 Spring 这种大量使用 XML 方式,我并不欣赏,Spring 也意识到了这一 点,在 2.0 版本中努力的简化 Xml 的配置,但是并不尽如人意)。如果使用简单的规则来 配置或者管理一个系统,用户就会很容易的查找到自己需要的内容。而通过配置文件,不 管这样的一个配置文件的结构如何好,也需要在其中查找自己需要的内容,开发效率肯定 要低一些。 因此对于这种有创新性的轮子,多几个,或许 Java 世界可以跑得更快一些。 Wicket 开发指南 第 20 页 共344 页 去年就听说不少 Web 框架的开发人员要联合起来开一个 Web 框架,在 Yahoo 上还有 一个讨论组,上去看了一下。但是这个事件对我的第一感觉就是晕,第二感觉就是特别的 晕,虽然目前 Java 世界的 Web 框架一通混战,但这样一个联盟,所给出的东西很可能是 第二个 EJB。 1.3.1.3.1.3. 1.3. Wicket Wicket Wicket Wicket 与目前 Web Web Web Web 框架的比较 说到比较,不免有些头痛,毕竟我并不喜欢进行比较,而且我用过的 Web 框架不算 多,除 Wicket 外,仔细算来,也就只得 Struts,Tapestry 和ASP.NET 几个,其它的框架也 就止于耳闻而已,在这样一个基础上要对 Java 世界中的 Web 框架进行比较,实在有些力 不从心,因此这里所比较的框架仅限于 Strust,Tapestry 和ASP.NET,其它的不再涉及, 对于这些框架的一些说法,多半来自于自身的开发体验,如果有不足的地方,大家尽可讨 论。 1.3.1.1.3.1.1.3.1. 1.3.1. Strust Strust Strust Strust 概述::: : 要论当前 Java 世界中 Web 开发框架的 No1 是谁,Struts 是当之无愧的王者,它遵循 MVC 结构,在标准的 Java Servlet 和JSP 上进行封装。 在View 这一层,它还是使用JSP 来进行输出,同时提供了许多标签处理页面输出,将 指定的数据以 Html 方式输出。另外在进行数据交互的时候,使用了 ActionForm 在客户端 和服务器端进行数据传递,以property的方式来访问ActionForm中的数据。但ActionForm 被设计为一个实际类而非接口,也一直是为大家所诟病的,这样就无法使用 Pojo,而且为 了传递数据,程序员不得不编写相关的 ActionForm 实现。 对于Model这一层,Struts 没有作任何强制处理,但对于中小项目,许多时候为了加快 开发速度,Model 这一层与 View 层经常有一些重复,分离的不是很清楚,常见的就是许 多用于Model的类直接继承了ActionForm类,显然增加了系统的混乱,同时也给程序的单 元测试带来许多问题。 对于 Control 这一层,Struts 提供了 Action,它不仅可以处理 ActionForm 的数据传递, 而且可以根据 XML 文件载入相关的流程转向。程序员也可以编写相关的业务处理类进行 各种业务的处理,当然对于小系统,也可以直接在这里处理业务。而且它还支持 Token, 以避免数据的重复提交(但Struts 的Token 基于 Session,对于同一个 Session,只支持一个 Token)。 因此从上面的分析看来,Struts 并没有完整的对 JSP 和Servlet 进行了封装,程序员仍 然需要了解许多与Servlet 相关的信息,如Request 和Response,Session,Parameter 等基本 Wicket 开发指南 第 21 页 共344 页 信息。而且对于 Pojo 等支持不足,造成单元测试的困难,所谓的 StrutsTestCase 也实在没 有减少多少单元测试上的麻烦。 我个人认为Struts 最大的问题出现在View 层上,对于中小项目而言,UI层的开发绝对 不是一个可以忽略的因素,在我负责及参与的多个中小项目中,View 层开发的工作量一 般不低于 30%,原因可能是多方面的: 1. 用户的需求会产生各种变化,经常需要对界面进行调整; 2. Struts 对界面的控制度比较差,如果要控制一个文本框或者是一段文字不可见,需 要编写大量的 Tag 进行控制,如等,当然也可以由开发人员编写 Tag,这样的处理并不比直接在 JSP 页面中使用 Java 代码来的轻松; 3. 由于 Struts 仍然使用 JSP 作为主要的 View 载体,而对于美工而言,使用 Tag 几乎 是一件不可能完成的任务,虽然网上有些朋友建议美工学习一下标签,但是这个 不太现实,毕竟分工不同。对于已经含有 Tag 的网页,如果经过美工处理,结果 往往是惨不忍睹,不能很好的协同工作,对于开发效率无疑是一个重大的影响因 素。 4. JSP 通常在执行的时候才能看到效果,而且要经过编译,因此每次修改以后,其 测试也是一件很痛苦的事(JSP 属于模板结构,混合了代码和界面,所以无论对 哪方面的修改,都要重新编译和运行,其执行时是编译成 Servlet 的Java 代码来运 行,因此需要比较多的时间来编译和执行,速度比较慢),而且许多 Tag 的异常 和页面的异常无法准确定位,这个也是程序员十分讨厌的一件事。(一些新版本 的Web 服务器,遵循了 JSR 标准,如 Tomcat5,WebLogic8 都可以很好的支持 JSP 错误定位了)。 关于 Wicket 与Struts 的详细比较,大家可以参见附录中我翻译的这篇文章。 1.3.2.1.3.2.1.3.2. 1.3.2. Tapestr y Tapestr y Tapestr y Tapestr y 概述 对于第一次见到 Tapestry 的我来说,只能用"惊艳"两个字来形容当时的感觉,原来在 Java 的世界中,Web 程序也可以这样开发(在此这前,我有 ASP.NET 的开发经验,这也 是我对Struts 不满的一个原因)。当时的Tapestry已经是3.0的版本了,让我印象最深在于 它的错误处理页面,可以将出错的地方进行准确的定位,对于一个困惑于 JSP 出错处理的 程序员来讲,无异于上帝的福音。花了一段时间进行研究,发现它的结构与 ASP.NET 相 似,但不是基于控件处理,而是基于Bean的Property进行处理。也就是通过一个配置文件 在UI和Bean 之间进行绑定(Page 文件),根据 JavaBean 的属性来控制 UI控件,如 UI 控件是否可见和文本框中的值。最令人高兴的是,Tapestry 当时是 Apache 下Jakarta 小组 的一个子项目,Apache 出品,必属佳作,这在 Java 世界里是已经公认的。 Wicket 开发指南 第 22 页 共344 页 Tapestry 的4.0 也发布了一段时间,而 Tapestry5 也蓄势待发,但我没有仔细看过其内 容,据网上而言,变化很大,而且与 HiveMind 绑定了,我觉得作为一个比较成熟的框 架,Tapestry 应该是很容易与其它的 IOC 容器进行整合的,毕竟走回头路的人不会太多, 果不其然,很快就有大量的文章来讲述,如何同时使用 Tapestry 和Spring。(说到 Tapestry5,前几天在 Wicket 的邮件组中看到有邮件说,在 Tapestry 的网站上有 Wicket 用 户说Tapestry5 象是Wicket 的重构,惹得Tapestry的作者Howard Lewis Ship 大动肝火,而 还有一个Wicket 的用户颇为好事,竟然在TSS 上的那份文章找到Tapestry用户当时的一句 话,说是 Wicket 是Tapestry 的重构,读到这份邮件,不知道 Wicket 和Tapestry 的用户是 不是有三十年河东,三十年河西的感觉。看来国外关于这些讨论的火药味并不比国内逊 色。) 对于 2006 年,Tapestry 则是喜事连连,先是获得 2006年Duke s Choice 大奖,而且升 级为 Apache 的顶级项目,不再是 Jakarta 小组的一个下属项目。 因为基于组件结构,所以它不使用 Tag,而且在 Tapestry中使用了 JavaAssist 进行二进 制级的优化,与 JSP 相比,性能得到了很大的提高。另外 Tapestry 的多语言支持,使得不 同国家地区的浏览看到的内容不仅仅是文字上的翻译,还可以是整个风格的变迁,应该说 Tapestry 是我见过最为优秀的 Java Web 开发框架。 如果非要说它的缺点,我觉得有点勉强,就是它的开发思想比较特殊,完全区别与以 往的JSP,Struts,与老式的C/S 开发也不相同,基于JavaBean和配置文件管理页面,是一 种全新的组件方式,这也使得 Tapestry 的学习曲线比较高,对于一个生手而言,短期里很 难上手。我个人认为这是Tapestry在Java 世界用户相对较少的一个主要原因,因为无论是 习惯以前 JSP 开发还是习惯 Delphi 那种 C/S 开发方式的人,学习 Tapestry 时,几乎都要重 头再来,而且并不是所有的程序员都有很好的设计基础和OO思想,学习 Tapestry 还是很 费力气的。如果想好好学习 Tapestry,更深入的了解 OO,会带来学习上的便利。 当年一度想在公司推广 Tapestry,但考虑到风险各方面,最终还是放弃了,如果 Tapestry的学习曲线与Wicket 持平的话,恐怕今天的Web 框架要少许多,而且Struts 恐怕 也会被请下神台,我常在想,如果 Tapestry 是一个产品的话,可能又是一个技术成功,而 市场失败的产品。 今天的 Tapestry 已经很成熟了,象 J2EE 的No.1 网站 TSS,就是构建在 Tapestry 的基 础上,而且据测试,性能较 JSP 有两倍的提高。 关于 Wicket 与Tapestry 的详细比较,大家可以参见附录中我翻译的这篇文章,不过很 可惜那篇文章作者并没有写完,所以翻译的也不全。 (说句题外话,Tapestry 的新图标据说是一个独角兽,而我怎么看,都觉得象是一只 兔子,难道是最近天府传说的兔头吃多了:)))。 Wicket 开发指南 第 23 页 共344 页 1.3.3.1.3.3.1.3.3. 1.3.3. ASP.NET ASP.NET ASP.NET ASP.NET 概述 说到 ASP.NET,不得不佩服微软的功力(即使我喜欢 Java 的开放,反对微软的封 闭),当我第一次接触到ASP.NET,加上一个Visual Studio,当时的Web开发,只得一个 字"爽",这也是我后来不喜欢 Struts,而喜欢 Tapestry 和Wicket 的一个主要原因,大概这 就是"第一眼恋情"吧。 在ASP.NET 中,微软有效的移植了 C/S 开发的优点,使得大量 C/S 程序员有着最低的 学习曲线就可以快速的使用 ASP.NET 开发 B/S 程序(大家可以看一个 WinForm 和 WebForm 这两个类,何其相似),这也是 ASP.NET 能在很短的时间就与 Java 在企业市场 上正面交锋的资本。作为程序员,你可以象开发 C/S 程序一样,快速的操作各种控件,包 括基本的Html控件,还有一些支持数据绑定的控件,再加上Visual Studio 这样快速,精致 的IDE,很难不让程序员心服。一句话,Anders Hejlsberg 真的是天才,ASP.NET 就是 B/S 世界中的 Delphi,俨然一副王者风范。 1.3.4.1.3.4.1.3.4. 1.3.4. Wicket Wicket Wicket Wicket 概述 用Wicket 小组的话说,Wicket 与Tapestry 和Echo 相类似,事实如此。Wicket 在UI 的处理上,与 Tapestry 采用了同一手法,即使用原生的 Html 元素,但通过添加 Html 元素 的属性来表明这个特殊的控件,然后由后台的 Html 解析器进行分析,抽取这些元素,再 由后台进行处理,最终输出 Html。这样做的好处: 1.避免了开发一个专用的 IDE 用来处理 Html。毕竟 Java 的Web 框架往往是个人和小 组织的产品,做一个 Web 开发的 IDE 未免力不从心。而直接使用 Html,则可以充分利用 市场上各种Html编辑工具,如DreamWeaver。当然,如果愿意的话,用Visual Studio 也是 一个不坏的主意。这一点我认为Wicket 偷了Tapestry的师。(额外说一句,如果你坚持免 费的话,NVU 也是个不错的网页编辑器,对于美工或许不足,而程序员,基本够了,另 外微软最新的网页编辑器 WebDesigner 的CTP 版本也是免费的,还是很好用的) 2.多语言的支持其实对于 Web 框架是非常重要的。以往的 Web 框架一般在属性文件 中放置各种资源,而自从 Tapestry 后,不仅支持语言的改变,还支持布局的变化,Wicket 对多语言的支持与 Tapestry 如出一撤。(又是偷的?也难怪 Howard Lewis Ship 生气) 以上的优点同样适用于 Tapestry,但 Wicket 最大的优点在于学习曲线。在后台的处理 上与 ASP.NET 相同,直接将前台的 Html 中的控件映射到 Java 对象中,通过 Java 对象来 直接操作控件的输出和行为。例如设置一个文本框不可见,只需要用 textField.setVisiable(false)即可,这样看起来是不是和ASP.NET 以及以前的C/S 程序非常相 似啊。而且 Wicket 根据文件名自动查找 Html(也可以定制查找的方式),不需要一个 XML 文件在 Java 文件和 Html 文件间进行绑定。事实上个人认为,在这里使用 XML 文件 Wicket 开发指南 第 24 页 共344 页 的方式,弊大于利。使用规则的方式进行绑定,还有利于代码的规范。因为如果不规范, 就无法正常运行,带有一定的强制性。 Wicket 不仅清楚的区分了程序和美工的工作范围,而且清楚的划分了 Web 开发的层 次,也有利于程序的开发和维护。 Wicket 可以自动管理服务器端和客户端的数据交互和状态,有效的避免了"脏数据"," 重复提交",而且支持 Pojo,有利于单元测试。 Wicket 还可以定义各种控件,有利于复用。 最后就我个人而言,Wicket 和Tapestry 的开发思想非常相似,仅仅在程序员的开发方 式上有所不同。Wicket 较之 Tapestry 的最大优点在于学习曲线低。而 Tapestry 则是一个非 常成熟的 Web 框架,其成熟度不是目前 Wicket 可以相比的。 1.4.1.4.1.4. 1.4. Wicket Wicket Wicket Wicket 的特性① 1.4.1.1.4.1.1.4.1. 1.4.1. 更加纯粹的 Java Java Java Java 和OOOOOO OO Wicket 的结构与Swing 非常相似,Wicket 是很纯粹的Java 代码,所以可以很好的应用 OO思想,使用封装,继承还有各种事件,可以很完善的支持 OO设计,不象 JSP 那种模 板脚本语言,代码与显示内容混在一起,扭曲设计。 1.4.2.1.4.2.1.4.2. 1.4.2. 分离关注点,易于协同开发 虽然 Wicket 包含了 Java 和Html 两部分内容,但是它不是一种模板语言,并没有将 Java 代码与 Html 混合在一起,也不需要强制在 Html 代码中添加新的语法。Wicket 通过在 Html 标签中加入 ID 号这样的方式将 Java 代码与 Html 页面进行关联。这样开发人员可以 使用自己的IDE,而美工就可以使用各种Html编辑器编辑页面,如DreamWeaver,由于不 使用标签,所以文件的修改不会带来混乱。相信做过 JSP 页面的程序员说到这个,都是心 有戚戚焉。这下和美工 MM 有更多聊天的时间了:)) ① 以下内容大部分是翻译自 Wicket 网站上的功能特性说明,可以在下面的地址中获得原文信息: http://wicket.sourceforge.net/Features.html Wicket 开发指南 第 25 页 共344 页 1.4.3.1.4.3.1.4.3. 1.4.3. 安全 Wicket 从结构上就是比较安全,它的URL 经过了处理,不包含敏感的信息,所以很难 直接通过URL 来访问某一个功能。而新版本Wicket 还允许用户自行定义URL 加密,以便 Web 站点更加安全。 Ajax 的安全问题向为安全专家所诟病,但 Wicket 对Ajax 的支持却使得 Ajax 安全问题 很容易被处理。因为 Ajax 的输出也是使用了 Wicket 的控件,可以统一在安全框架下进行 处理,所以较一般的 Ajax 程序,要安全得多。 1.4.4.1.4.4.1.4.4. 1.4.4. 可以无缝支持集群 Wicket 程序都可以工作于集群环境下,而无须特别的处理。另外也易于调优,一旦确 定一个瓶颈所在,就可以自行管理页面状态数据的复制,优化系统。Wicket 的下一个版本 将支持客户端状态,可以更好的支持集群。这个功能应该与 ASP.Net 中的 ViewState 相 似,将状态信息保存在客户端,可以有效的减少服务端的负载,提高性能。虽然我认为这 个功能对服务器端内存占用会有一定的好处,但是会占用大量的网络带宽,利是否大于 弊,还得靠开发人员来选择了。 但是 Wicket 支持集群带来的一个副作用就是很多实体类都要实现 java.io.Serializable, 还是有一点讨厌的,毕竟这个世界还是没有免费的午餐。 1.4.5.1.4.5.1.4.5. 1.4.5. 控件复用 C/S 结构程序为什么更容易开发,固然是因为有好的 IDE,更重要的是它能提供更多 的控件,方便程序员复用,软件的开发,其实也就是一个软件复用的历程,没有复用,我 们今天仍然处于软件开发的洪荒时代。在 Wicket 中,也可以很容易的创建一个控件,用 以复用。开发人员既可以复用 Wicket 提供的或者其它人扩展的一些控件,也可以定义自 己的控件,如表格,树等。 1.4.6.1.4.6.1.4.6. 1.4.6. 支持表单数据验证 在Wicket 对表单提交的数据进行验证是非常容易,为错误信息定制国际化也是小菜一 碟。 Wicket 开发指南 第 26 页 共344 页 1.4.7.1.4.7.1.4.7. 1.4.7. Session Session Session Session 类型安全 Wicket 可以避免用户手动管理Session中的对象。页面以及控件的状态都被自动的存放 在Session 中。如果需要的话,开发人员也可以实现一个自己的 Session 类来管理相关的数 据,比如说将 Session 中的数据通过序列化后,放置在数据库中。如果使用 HttpSession, 所有在Session 中存放的数据在集群状态下,都会被自动复制,以便在多个集群主机中进 行数据同步。 1.4.8.1.4.8.1.4.8. 1.4.8. 扩展工厂 Wicket 的扩展性非常好,大部分功能都可以通过抽象工厂或者是工厂方法来进行定 制。 1.4.9.1.4.9.1.4.9. 1.4.9. 可懒加载的 ModelModelModel Model 因为 Wicket 中的 Model 默认情况下是放置在 Session 中的,会占用大量的内存,如果 要支持集群,就会占用大量的网络带宽。通过可懒加载的 Model,就可以在需要的时候才 从数据库或者其它地方载入 Model。如果这个 Model 不再需要了,就可以将这个 Model 中 的数据从 Session 中移去。通过这种机制,可以节约资源,提高性能。 1.4.10. 1.4.10. 1.4.10. 1.4.10. 支持所有基本 Html Html Html Html 元素的功能 Wicket 支持图片,超链接,表单,以及基本的 Html 元素。可以在 Wicket 中使用这些 基本的 Html 元素 1.4.11. 1.4.11. 1.4.11. 1.4.11. 通过程序控制 Html Html Html Html 的属性 程序开发人员可以通过编程来控制 Html 元素的所有属性,包括标准或者非标准的属 性,都可以编程设置。 1.4.12. 1.4.12. 1.4.12. 1.4.12. 类型自动转换 Wicket 内置了许多类型转换器,支持常用的数据转换。当校验一个 From 中的数据是 否正确时,因为提交的数据通常是以字符串的方式存在的,所以 Wicket 首先将用户提交 Wicket 开发指南 第 27 页 共344 页 的数据转换成 Model 中需要的格式,然后再放置到 Model 中。用户也可以自行定义数据转 换器以处理特殊数据。 1.4.13. 1.4.13. 1.4.13. 1.4.13. 动态图片 Wicket 可以使用很简单的方式来支持动态图片,只需要实现一个paint 方法即可绘制自 定义的图片。这下编写验证码就不再头痛了。而且通过Ajax,也可以很容易在页面绘制各 种图形了,希望 Wicket 小组能早日提供象 Tapestry 中的 JCharts 控件。 1.4.14. 1.4.14. 1.4.14. 1.4.14. 数据分页 利用控件 PageableListView 能够很容易的实现数据分页。可以在 ListView 中的每一列 可以放置任何控件,甚至可以在 PageableListView 中再放置一个 PageableListView ,从而 能够更好的支持显示数据。 而扩展包中的 DataView,DataTabe 更是功能超强,从此分页不再痛苦。 1.4.15. 1.4.15. 1.4.15. 1.4.15. 树形控件 Wicket 支持树形控件,可以很方便实现页面导航,Wicket 除了支持静态树以外,还可 以通过 Ajax 支持动态树。 1.4.16. 1.4.16. 1.4.16. 1.4.16. 国际化 Html 页面,图片,各种字符串都可以被国际化。 1.4.17. 1.4.17. 1.4.17. 1.4.17. 单元测试 Wicket 为单元测试提供一个 WicketTester 类,可以在不启动 Web 服务器的情况下来测 试一个 Wicket 页面和控件。而且同时还支持 Ajax 的测试,从此单元测试不再痛苦。 1.4.18. 1.4.18. 1.4.18. 1.4.18. 例子 Wicket 提供了大量的例子来演示前面所说的特性,开发人员可以通过这些例子快速的 上手。 Wicket 开发指南 第 28 页 共344 页 1.5.1.5.1.5. 1.5. Wicket Wicket Wicket Wicket 的用途 Wicket 的用途就目前而言,只能用来开发Web程序,至于Swing,Flash等,还是海市 蜃楼。 个人认为 Wicket 非常适合开发中小型项目。因为此类项目的 UI开发工作量较大,而 且时间较短,人力资源也容易出现紧张的情况,因此选择一个学习曲线低的 Web 框架, 可以保证人力资源的培养(新程序员容易学会,熟悉C/S 的程序员也容易上手),而且UI 层的变化量也易于控制和测试(就我个人经验而言,一个有少许 Java 基础和 Html 基础的 程序员,一周左右就可以开发 Wicket 程序)。 至于能否在大型项目中使用 Wicket,我个人暂时持怀疑态度,一是自身并没有多少大 型项目的开发经验,没有多少发言权;二是 Wicket 还算不上成熟,能否经得起大型项目 的考验,包括负载、并发,现在说还有点言之过早了。所以不建议在大型项目中使用 Wicket,但对于中小项目,个人认为 Wicket 应该是最合适的了。 1.6.1.6.1.6. 1.6. Wicket Wicket Wicket Wicket 的不足 Wicket 的最大问题在于开发时间短,自项目设立至今不过两年。对于一个Web框架, 时间还是有些短了。这使得无论是在设计、编码和功能上都还并不齐全,而且还有许多工 作有待开发,例如 JAAS 的整合,更多的 Wicket 控件等。 1.7.1.7.1.7. 1.7. Wicket Wicket Wicket Wicket 的前景 写了这个标题以后,有些后悔,因为在IT 世界里,预测无疑是最愚蠢的一件事,想了 一下,傻瓜做一半,只写标题,不写内容。:)) 2.2.2. 2. 如何配置 Wicket Wicket Wicket Wicket 来开发 Web Web Web Web 程序 2.1.2.1.2.1. 2.1. 安装Wicket Wicket Wicket Wicket 自带的例子程序 Wicket 提供了许多例子,可以方便程序员学习Wicket 开发。在安装这些例子前,需要 先安装一些软件: Wicket 开发指南 第 29 页 共344 页 1. JDK,建议使用1.4.2以上版本(因为接下来的例子使用Eclipse3.2进行开发,它需 要1.4.2 以上版本的 JDK)。下载地址: http://java.sun.com/javase/downloads/index.jsp 2. Tomcat,建议使用5.0.28系列版本,这是比较稳定的版本。而5.5版本需要运行在 JDK5 以上版本,而 4.0 系列版本则没有经过测试,不敢妄言。安装完成后,使用 默认配置,服务端口为 8080。下载地址:http://tomcat.apache.org/download-55.cgi 3. 在Wicket 官方网站下载 Wicket-Example 的压缩包,最新版本为 1.2.4,地址为: http://wicket.sourceforge.net/Download.html,下载完成后得到一个zip的压缩包,其 中包含有相关的源代码和 Build 文件。可以使用 Ant 来构建一个完整的 war 包,也 可以直接将其中的 wicket-examples-1.2.4.war 解压后使用。(如何使用 Ant 进行 Build,网上已经有了许多资料,这里就不多说了,免得有滥加文字之嫌)。得到 的war包名称默认为wicket-examples-1.2.4.war,先将它改名为wicket.war(这样修 改主要是避免 Web 程序名称过长,不好输入在浏览器输入访问地址)。将这个 war 包放置到 Tomcat 目录下面的 webapps 目录下面,然后再运行 Tomcat。待 Tomcat 正常启动后,这个程序就会被正确部署了。运行浏览器,然后在地址栏中 输入如下 URL:http://127.0.0.1:8080/wicket/ Wicket 开发指南 第 30 页 共344 页 如果看到了这样一个界面,说明已经成功安装了 Wicket 的例子。那么从这里就可以 开始 Wicket 开发之旅了。 2.2.2.2.2.2. 2.2. 使用Eclipse Eclipse Eclipse Eclipse 开发Wicket Wicket Wicket Wicket 程序 2.2.1.2.2.1.2.2.1. 2.2.1. 安装Eclipse Eclipse Eclipse Eclipse 开发环境::: : Eclipse 已经成为当前最主流的开发工具,所以这里将 Eclipse 作为 Wicket 程序的开发 工具。(前几天发现离开 Eclipse 竟然不会写程序了,有点感觉害怕。) 在开发程序前,请准备以下内容: 1. JDK,和运行 Wicket Example 的要求一样。 2. Tomcat,和运行 Wicket Example 的要求一样。 3. Eclipse,个人建议使用 Eclipse3.2。但是本文中所有的操作与 Eclipse3.X 都应该是 兼容的,另外请安装 WTP 平台插件。也可以直接下载 Eclipse 的WTP 整合版本。 Wicket 开发指南 第 31 页 共344 页 下载地址:http://download.eclipse.org/webtools/downloads/drops/R1.5/R-1.5.0- 200606281455/:,请根据你的操作系统选择对应的的 All-In-One 版本。 2.2.2.2.2.2.2.2.2. 2.2.2. 配置Eclipse Eclipse Eclipse Eclipse 开发Wicket Wicket Wicket Wicket 的环境::: : 2.2.2.1.2.2.2.1.2.2.2.1. 2.2.2.1. 配置配置配置 配置 Web Web Web Web 服务器 服务器 服务器 服务器 ::: : 点击菜单项"Windows->View->Other",出来如下界面,然后选择"Server->Servers"这 一个视图结点。(备注:请一定要确认安装了WTP WTP WTP WTP 平台) 在Servers 视图上通过右键菜单来添加一个 Server,请选择前面安装的 Tomcat5 作为新 的Server。 Wicket 开发指南 第 32 页 共344 页 Wicket 开发指南 第 33 页 共344 页 2.2.2.2.2.2.2.2.2.2.2.2. 2.2.2.2. 创建创建创建 创建 Web Web Web Web 项目 项目 项目 项目 在成功配置 Web 服务器以后,开始创建新的 Web 项目。 通过"File->New->Project"后,在向导页面上选择"Dynamic Web Project",如下图所示: Wicket 开发指南 第 34 页 共344 页 在项目名称处填写 Wicket(可以按照自己的习惯来命名),然后使用刚才定义的 Server。 Wicket 开发指南 第 35 页 共344 页 然后可以直接点击"Finish"来创建"Wicket"这样一个 Web 项目。如果有必要,也可以 进行其它的配置,Web 项目的配置不在这里多说了。 2.2.2.3.2.2.2.3.2.2.2.3. 2.2.2.3. 为为为 为 Web Web Web Web 项目添 加 项目添 加 项目添 加 项目添 加 Wicket Wicket Wicket Wicket 支持 支持 支持 支持 为Web 项目添加 Wicket 运行库,为了简单起见,可以直接将 $Tomcat\webapps\wicket\WEB-INF\lib 目录下面的 8个jar 包复制到当前 Web 项目的 WEB- INF 下面的 lib 目录中。 以下是 jar 包的列表名称: 1. commons-collections-2.1.jar 2. commons-lang-2.0.jar 3. commons-logging-1.0.4.jar 4. ehcache-1.1.jar 5. jcaptcha-all-1.0-RC-2.0.1.jar 6. log4j-1.2.13.jar 7. wicket-1.2.4.jar 填写项目名称 使用前面定义 的Server Wicket 开发指南 第 36 页 共344 页 8. wicket-extensions-1.2.4.jar 添加了WTP 插件以后,Eclipse 会有一个WebApp Library,它可以自动将WEB-INF\lib 中的所有 jar 文件作为引用库。 通过以上的配置,可以在 Eclipse 中创建一个使用 Wicket 框架开发 Web 程序的项目, 接下来的实例,都是在这个项目的基础上进行开发。 3.3.3. 3. 第一个例子 3.1.3.1.3.1. 3.1. 老姜一块------ -- "Hello"Hello"Hello "Hello World"World"World" World" 接下来要做的程序就是那个人人耳熟能祥的"Hello World"(写这个例子时犹豫了很 久,因为 Hello World 已经快成为一个俗语,回念一下,俺也是俗人一个,免不了啊)。 这个程序将在客户端输出一个简单的页面,页面上只显示"Hello,World"这个字符串。 客户端的浏览器将接收到以下的Html: Wicket 支持库 Wicket 开发指南 第 37 页 共344 页 麻雀虽小,五脏俱全,程序尽管简单,但一样不少。在这个程序中,我们使用 Wicket 提供的一个叫做"Label"的控件来输出"Hello,World"这个字符串。这个程序包括两方面内容:  Html 页面模板,用来定义基本的 Html 样子  Label 控件,用来控制输出的内容 3.2.3.2.3.2. 3.2. Wicket Wicket Wicket Wicket 程序的开发步骤 为了便于理解,在这个例子中没有使用样式表,脚本或其它Html元素。开发人员可以 根据自己的需要加入 CSS样式表,也可以使用 JavaScript。但对于第一个 Wicket 程序,尽 量的省略掉这些元素,将重心放在如何编写 Wicket 程序上。 3.2.1.3.2.1.3.2.1. 3.2.1. 制作一个 Html Html Html Html 模板 在开发 Wicket 程序的时候,尽管没有 Visual Studio 这么好的开发工具,但是仍然可以 使用象 DreamWeaver,或者是 Microsoft 提供的 Web Designer(目前是 CTP 版本,可以免 费使用)来设计 Html 模板。对于当前这个简单的例子,也可以直接使用 Eclipse 提供的 Html 编辑器来编写 Html 模板,模板名称为 HelloWorldPage.Html。 在这里,使用 Html 中的元素,同时加入 wicket:id 属性将自己标记为一个需要 Wicket 处理的控件(备注:其实也可以使用其它属性来指定一个 Wicket 控件,如 id="wicket-message"等,以后会有相关的文档专门讨论这个问题,不过 Wicket 和Tapestry Hello World! 我要在这里输出Hello World Wicket 开发指南 第 38 页 共344 页 都使用这种方式,这是因为 id 这个属性许多时候会被 JavaScript 所调用,所以使用 wicket:id 仍然是 Wicket 推荐的方式,而且这个属性还会被 Ajax 所使用)。 除了以 后,象
还剩343页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 7 人已下载

下载pdf

pdf贡献者

shijy

贡献于2016-01-20

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf