为什么是Wicket?

译者注英文原文来自Jonathan Locke的《Why Wikcet?》,借着Wicket 1.3发布的东风把本人原来翻译并发布在BlogJava上的文章再拿到JavaEye上晒晒,与大家共享。

 

    为什么是Wicket?

    如果您正在寻求使用Java开发Web应用程序,目前,您有很多的选择。实际上,存在如此众多的Web应用程序框架显得有点搞笑。来自于互联网一个博客站点的问题:您能说出多少Java Web应用框架的名字?他们展现的结果如下:

    框架,到处都是框架,参看后面附带的表格。

    为什么要“重新发明轮子”?

    从这个角度看,您对于“另一个Web应用程序框架有多好”这个问题总是耿耿于怀?确实,为什们要“重新发明轮子”呢?对这个古老的谚语的答复是:因为这一次可以使轮子更圆!

    但是对于高质量的期待并不是构建Wicket框架的唯一动因。甚至有很多的观点,认为没有其他的Web工具集填补这一空白,而Wicket做到了。实际上,Wicket与上面提及的众多框架不太一样。

    与Wicket最相近的或许是Tapestry和Echo,但是这种相似性也很有限。和Tapestry一样,Wicket使用特定的HTML属性来标识 组件(Components)声明,这可以方便使用一般的HTML编辑器进行文件编辑。和Echo一样,Wicket拥有一流的组件模型。但是基于 Wicket的应用程序和那些基于Tapestry和Echo的应用程序不一样,这是因为从Wicket框架中两方面都可以受益。您获得了一流的组件模型 和对HTML没有干扰所带来的益处。在很多情况下,这种复合的好处可以带来非常重要的开发优势。

    理解了构建Wicket的动机有助于您理解为什么Wicket会表现的不一样。

 EchoCocoon
Millstone
OXF
 StrutsSOFIA
Tapestry
WebWork
RIFE
Spring MVC
Canyamo  Maverick
JPublish
JATO
Folium
Jucas
Verge
Niggle
Bishop
Barracuda
Action Framework
Shocks
TeaServlet
 wingS
Expresso
Bento
jStatemachine
jZonic
OpenEmcee
Turbine
Scope
Warfare
JMAA
Jaffa
Jacquard
Macaw
Smile
MyFaces
Chiba
JBanana
Jeenius
JWarp
Genie
Melati
Dovetail
Cameleon
JFormular
Xoplon
Japple
Helma
Dinamica
WebOnSwing
Nacho
Cassandra
Baritus
 
    动机

   目前存在的大多数Web框架对于服务端的状态管理都仅仅提供了较弱的支持。

   这就意味着在Web应用程序中存在着很多特殊的代码来处理和维护繁复的状态管理机制。虽然Wicket并不允许对服务端的状态完全不考虑,但是它在状态管理的简便性和透明化方面做了很多的工作。

   在Wicket中,所有服务端的状态都被纳入了自动的管理。您始终不需要直接使用HttpSession对象或者类似的封装对象去存储状态信息。相反,状 态信息已经都与组件关联起来,而在组件后端的数据模型都是传统的Java对象(POJO)。Wicket在每个用户会话期内维护着页面的映射表 (Map)。这个页面映射表(以及每个一面内的组件层次)的目的在于使得框架隐藏了组件以及数据模型访问的细节。您只需要处理简单而熟悉的Java对象, 而Wicket则处理诸如URL、会话期标识以及GET/POST请求的任务。

   您接着也会发现这种结构良好的服务端状态使得解决令人恐惧的“后退按钮问题”变得十分的容易。实际上,针对页面内组件数据模型的结构性变化带来的数据过期,Wicket提供了通用而且健壮的解决方案,这个方案可以有效地对浏览器缓存页面进行甄别和过期检测。

   最后,Wicket在设计的时候就考虑与诸如JDO和Hibernate的普通Java对象(POJO)序列化框架协同工作。这一点使得构建数据驱动的Web应用程序显得非常简单。

   对于很多应用程序来说,必须在额外服务端状态导致服务器负载增加和其带来的好处之间进行权衡,服务端状态管理可以降低开发成本、减少维护成本、加快对市场 的响应时间以及生产高质量的软件。这里提出的基本观点是:软件是十分昂贵、复杂的,而来自于E-machines和Dell的服务器则相对便宜。

在效率和生产性方面,Wicket对JSP的优越性则犹如Java语言对C语言一样。您使用Wicket可以实现的功能使用JSP也都可以实现。甚至于在 内存和CPU消耗方面效率也非常的高。但是使用JSP开发应用程序则需要耗费您更多的时间。最后,因为在JSP中进行状态管理时使用了特别的方式,您可能 发现不少的安全问题,也能看到到处蹦出来的错误。上面提及的大部分框架在这方面仅仅提供了有限的辅助。

    大部分现存的框架需要特定的HTML代码

   JSP具有最深的侵入性,它允许将Java代码直接嵌入Web页面中。但是,上面列示的框架(除了Tapestry)都不同程度地针对HTML代码引入了特殊的语法。

   因为特殊语法改变了单纯而简单的HTML标记的实质,而Web设计者对于这一点是十分的熟悉,所以特殊语法并不是十分得人心。而且预览、编辑和理解这种包含特殊语法的HTML也是十分困难的事情。

   Wicket并没引入任何新的HTML语法。相反,它通过Wicket命名空间(namespace)的标准兼容方式扩展了HTML,这完全兼容 XHTML标准。这意味这您可以使用Macromedia Dreamweaver、Microsoft Frontpage、Word、Adobe Go Live以及其他现有的HTML编辑器来编辑您的Web页面,并且可以和Wicket的组件协同工作。为了实现这个目标,Wicket始终在Wicket 命名空间内使用单个id属性(“wicket:id”)来标识那些需要框架进行特殊处理的标签。如果您并不喜欢将有Wicket命名空间修饰的标签和属性 展示给您的最终用户,通过简单的设置就可以完全消除它们,从而得到普通的与标准兼容的HTML代码。

   HTML中没有特殊的语法意味着设计者可以直接模拟页面,而您可以在开发的过程中直接使用这些页面。向HTML页面中添加Java组件就和设置组件的名称属性一样简单。然后,您可以直接将这些页面交给Web设计人员,他们可以充满信心地对其进行修改。

   与其他的应用框架相比,Wicket在各方面的分离上提供更多的支持。Web设计者在对应用程序代码不甚了解的情况下就可以编辑HTML(当然,他们不能 移除组件名称标签,而且不能任意改变组件嵌套的层次,其他的事情都是可以的)。另一方面,编程者只需要关注与HTML混在一起的Java组件,而不需要了 解页面的最终陈现是什么样子。通过这种职能清楚的工作方式,每个人都可以工作得更为顺畅。

    现存的框架易用性不好

   目前存在的大部分框架工具在对象模型方面做得不够。在一些框架中,对象模型是通过特定的XML来定义的。这些语法令人生厌,而且还需要特定的工具来编辑这 些配置信息。由于这些框架并不是单一的Java类库,您就不能使用包含编辑器、调试器和编译器的IDE工具来编辑它们。

   Wicket是化繁为简的代表。在学习Wicket的过程中不需要了解任何配置文件。Wicket就是组件结构良好的普通的类库。在Wicket中,您的 Web应用程序与普通的Swing应用程序类似,而不是JSP应用程序。如果您熟悉Java(特别是如果您熟悉Swing),那么您就已经对Wicket 有不少的了解了。

    现存的框架可复用性不好

   Tapestry和JSF虽然有可以重用的组件模型,但是您将发现与Wicket相比这并不是特别容易做到的事情。Wicket从设计之初就十分地注重组 件的复用。在Wicket中,从现有的组件扩展编制诸如SignInPanel或者AddressForm的复合组件是十分简单的事情。相对来说,针对浏 览器的新特性编制新的组件也是十分容易的事情。Wicket的组件可以使用JAR格式进行打包,直接通过库引用的方式就可以实现重用——不需要任何配置文 件!

   Web编程应该更关注编程乐趣!

   这就是我编写Wicket的个人方面的目标。现存的框架在实现开发的直接性、快捷性和简易性方面真正地吸引我。我希望Wicket在Web应用程序开发的建议性和乐趣方面能够迈出重要的一步。

    目标

    基于上面的这些动机,下面是Wicket的目标:

  1. 简单(易用性、一致性、易懂性)
    •   以POJO为核心
    • 所有代码均使用Java编写
    • 最小的概念域
    • 避免过度地使用XML配置文件
    • 全面解决“向后按钮”问题
    • 最大限度地类型安全以及编译检查
    • 最大限度地分析运行时错误
    • 对特定工具集的最小依赖
    • 组件、容器和惯例始终保持一致性
  2. 复用
    • 使用Wicket编制的组件具备高度的复用性
    • 可复用的组件可以使用JAR文件发布
  3. 无侵入
    • HTML以及其他标记性文件不会编程语法所干涉
    • 在标记方面只有一个简单的标签
    •   与任何普通的HTML编辑器兼容
    •   图形开发人员很容易识别并避免修改框架标签
    •   如果设计者不小心删除了标签,则很容易恢复它
  4. 安全
    • 默认情况下代码都是安全的
    • 在页面和URL中,只有显式的声明的链接才能公布数据状态
    • 具备最大限度类型安全逻辑
    • 很容易集成到Java安全框架
  5. 富有效率,可伸缩性
    • 在不牺牲其他目标的前提下保证效率和轻量级
    • 可依附的优选会话期支持集群
    • 通过与可分离模型的协作,会话复制形成的集群很容易实现和调整
  6. 完整
    • Wicket团队乐于为开发Java Web应用贡献可用的且特性齐全的框架。核心框架是由本篇文档的作者Jonathan Locke编写和贡献的。目前的团队包括了很多经验丰富的程序员,他们中的一些人还是上面提及的其他框架的开发者,他们也都拥有构建大型Java Web应用的经验。我们对自己的处境十分的了解,因此也更能从框架使用者的角度来开发Wicket。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 1.简介 2.如何使用示例代码 3.我为什么要学习Wicket? 3.1。我们都喜欢意大利面:-) ... 3.2。面向组件的框架 - 概述 3.3。面向组件的Web开发框架的优点 3.4。Wicket与其他面向组件的框架相比 威克特说“你好世界!” 4.1。Wicket分发和模块 4.2。Wicket应用程序的配置 4.3。HomePage类 4.4。Wicket链接 4.5。摘要 5. Wicket作为页面布局管理器 5.1。页眉,页脚,左侧菜单,内容等... 5.2。这是继承! 5.3。划分et impera! 5.4。使用wicket标记继承:扩展标记 5.5。摘要 6.保持对HTML的控制 6.1。隐藏或禁用组件 6.2。修改标签属性 6.3。生成标记属性“id” 6.4。使用WebMarkupContainer创建内嵌面板 6.5。使用标记片段 6.6。将标题内容添加到最终页面 6.7。在我们的页面/面板中使用存根标记 6.8。如何仅渲染组件主体 6.9。用wicket隐藏装饰元素:enclosure标签 6.10。使用Border包围现有标记 6.11。摘要 7.组件生命周期 7.1。组件的生命周期阶段 7.2。组件生命周期的钩子方法 7.3。初始化阶段 7.4。渲染阶段 7.5。删除阶段 7.6。独立舞台 7.7。摘要 8.页面版本控制和缓存 8.1。有状态页面与无状态页面 8.2。有状态页面 8.3。无状态页面 8.4。摘要 9.在请求处理的引擎盖下 9.1。类应用和请求处理 9.2。请求和响应类 9.3。请求处理的“主管” - RequestCycle 9.4。会话类 9.5。异常处理 9.6。摘要 10. Wicket链接和URL生成 10.1。PageParameters 10.2。可收藏的链接 10.3。使用标记wicket自动创建可收藏的链接:链接 10.4。外部链接 10.5。无状态链接 10.6。生成结构清晰的URL 10.7。摘要 11. Wicket模型和表格 11.1。什么是模特? 11.2。IModel和Lambda 11.3。模型和JavaBeans 11.4。Wicket形式 11.5。组件DropDownChoice 11.6。模型链 11.7。可拆卸型号 11.8。在组件中使用多个模型 11.9。使用型号! 11.10。摘要 12. Wicket详细说明 12.1。默认表单处理 12.2。表单验证和反馈消息 12.3。输入值转换 12.4。使用JSR 303验证 12.5。使用IFormSubmittingComponent提交表单 12.6。嵌套表格 12.7。多行文字输入 12.8。上传文件 12.9。使用FormComponentPanel创建复杂的表单组件 12.10。无国籍形式 12.11。使用单选按钮和复选框 12.12。使用ListMultipleChoices和Palette选择多个值 12.13。摘要 13.使用中继器显示多个项目 13.1。RepeatingView组件 13.2。ListView组件 13.3。RefreshingView组件 13.4。可分页的中继器 13.5。摘要 14.组件排队 14.1。标记层次结构和代码 14.2。改进了汽车组件 14.3。组件什么时候出列? 14.4。排队的限制 14.5。摘要 15.与Wicket的国际化 15.1。本土化 15.2。Wicket的本地化 15.3。捆绑查找算法 15.4。组件选择的本地化 15.5。国际化和模型 15.6。摘要 16. Wicket的资源管理 16.1。静态与动态资源 16.2。资源参考 16.3。包资源 16.4。向页眉部分添加资源 16.5。上下文相关资源 16.6。资源依赖性 16.7。使用资源包聚合多个资源 16.8。将JavaScript放在页面正文中 16.9。标题贡献者定位 16.10。自定义资源 16.11。安装资源 16.12。Lambda支持 16.13。共享资源 16.14。自定义资源加载 16.15。CssHeaderItem和JavaScriptHeaderItem压缩 16.16。NIO资源 16.17。资源通过模型得出 16.18。摘要 17.与JavaScript集成的示例 17.1。我们想做什么...... 17.2。......以及我们将如何做到这一点 17.3。摘要 18. Wicket高级主题 18.1。通过行为丰富组件 19.使用AJAX 19.1。如何使用AJAX组件和行为 19.2。内置AJAX组件 19.3。内置的AJAX行为 19.4。使用活动指示器 19.5。AJAX请求属性和调用侦听器 19.6。创建自定义AJAX调用侦
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值