网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  web框架对比: wicket vs struts     
  文章作者:未知  文章来源:水木森林  
  查看:72次  录入:管理员--2007-11-17  
 
一、概貌

wicket是基于web应用框架的高级组件,其主要特点:
    * 在html和java之间的明确分隔
    * oo组件模式
    * 自动状态管理
    * 高度生产化
    * 低学习投入
    * 屏蔽servlet api、http协议细节
    * 无需xml配置文件
    * 易于构造可重用组件
struts是以model2 mvc 为蓝本构建的web应用框架。其工作围绕着处理http请求的action类来完成。配置方式采用xml文件。
下文将对wicket和struts在体系、http请求处理、servlet api和http协议抽取、状态管理、配置这六方面进行比较。

二、比较第一方面:体系

struts体系基于解释每个http请求并将其定向到某个处理该类型请求的指定action类。每个action类将处理后的结果返回,并决定下一步走向——通过转发或者重定向到另一个action或者将控制权交给输出html的jsp页面。从技术较大来讲,虽然每个部分之间做到了很好的解耦,但是基于http请求的处理模式可谓与时代不符(与wicket相比就是过时了)。两大原因如下:
    * struts并不是真正意义上的纯粹面向对象,每个action类定义了一个abstraction(抽取),但是abstraction是由http协议的请求机制决定的,而并非面向对象的分析。
    * 除非我们在java代码中直接输出html(当然除非我们疯了),那么为了输出html我们就要学习另外的主流技术,比如jsp和自定义tag。使用在jsp中使用tag并非易事,尤其是当我们把这项工作交给美工小组时,这会直接导致两个结果:jsp代码被他人作的一沓糊涂,或者是我们自己完成这项任务。

而wicket的处理方式则不同,从整体来讲应该说是更加优雅些。它采用面向对象的组件技术实现web与用户的交互(这点有些如swing)。在wicket中的每一页是由若干的使用组合设计模板生成的组件构成。页面和组件各自渲染自己,并直接或者间接的与markup文件(标识文件,形式就像jsp)关联。当http请求到来时,这些请求被转换、传递到组件上的相应事件中来,这一点与微软的vs很相象。所以wicket能够解决struts体系中存在的问题:
    * wicket是完全面向对象的。我们可以利用组件的继承性设计自己的应用。这里不需要为处理http协议的请求/响应而作任何工作。
    * wicket所使用的markup文件与纯粹的html很接近,所以容易上手使用。wicket在markup文件中所引入的内容非常整洁,并符合xhtml标准。任何了解html的开发者都可以如编辑html文件那样编辑wicket的markup文件,就好似他并不知道这是wicket的markup文件一样。

三、http请求处理

在struts中,一个http请求被接收后,struts将在配置文件中查找request path和相应的action类。如果这些已经被配置好了,它将将提取请求参数放入到actionform bean中,并执行一些验证。然后http请求、回应和actionform对象都将作为参数传入到action类中。从这点可以看出action的开发者掌握着应用的方方面面:他们必须处理http session,维护http请求和session的属性,并在action执行完时建立需要返回的信息,最后还要返回相应的actionforward以使struts知道下一步在哪里。假如此时actionforward将控制权交给了jsp页面,开发者就要使用struts自定义的tag库编写jsp代码。如此繁复的工作环节很容易出现错误,而且struts还需要三个位置保持一致:struts xml配置文件、java action类、jsp自定义tag。

而在wicket中,一个http请求被接收后,wicket将确认http所请求的那个页面和在这个页面关联的组件。如果请求的目的是form,wicket将自动提取请求参数、验证参数、进行一些预先规定好的类型转换、设置form组件中的model(模式,这里用法与mvc中类似,但有不同)值;接着转化请求为相应类型的事件、调用目标组件上的相应事件侦听器,这样就会导致事件处理代码运行来执行业务逻辑;然后,事件处理器还将指定下一步页面的位置,被指定的页面将初始化(如果页面从未被初始化的话)并自动渲染;渲染处理将按照顺序访问每个页面组件,要求它们进行自我渲染。在markup文件中能够组件仅通过名字与html元素进行映射。

wicket出色的原因:
    * 每个组件知道如何处理自己事件。因此我们只需要将组件放到页面上,编写事件处理器就行了。如果一个页面中存在20个能引发事件的不同的组件,我们除了进行将它们添加到页面上的工作外没有别的工作。但如果在struts中,我们可能需要建立20个不同的action类或者一个具有20个分支语句的action类,并要在xml配置中逐一添加。
    * wicket带给了我们考虑组件/事件重用的机会。而不用将注意力放到如何处理http请求和回应上。
    * 与struts相比使用wicket会降低我们的代码量,这正是重用组件带来的益处。wicket本身不使用任何的xml配置文件。只需要修改web容器的web.xml文件中的servlet声明部分。

假如我们曾经编写过windows api、并用过visual basic或者borland delphi的话,下面的比较会更加让人印象深刻。使用struts开发就像使用windows api一样:接收原始消息,解码原始消息,然后再处理这些消息。由于windows api是基于消息循环工作的,所以系统除了消息回应外不期望任何的返回值。

从另一方面看,dephi在tapplication类中隐藏了windows消息循环,使开发人员围绕着tapplication类建立其他的类。原始的系统消息就这样被dephi内建类接收,被内建类解析并被确定其接纳者。消息被转换为一个事件,并被传送到某个特定的对象。

如windows应用程序一样,wicket应用也具有服务于文本和html模板的资源文件。从这点看,wicket象用delphi做桌面开发一样被用来做web开发。

四、servlet api和http协议的抽取

struts没有隐藏servlet api和http协议的细节。为了使用struts,我们必须乐于和httpservletrequest、httpservletresponse 和httpsession类打交道。并围绕着请求和回应建立应用。这便是所有model2 mvc wen框架与生俱来的弱点。

正如上面说的,wicket隐藏了servlet api和http协议的细节。对于一些应用,我们甚至触及不到这些细节。甚至对于非常复杂的应用,我们也仅使用适当的wicket协议抽取类。而经常用到的是java组件类、pojo业务模型、纯html标记文件。

五、状态管理

使用struts开发,我们将获得全部的状态管理权。这对于建立大规模的、高升级空间的、集群应用来讲是很好的,因为我们将获得对httpsession上每件事物的控制权。但是对于中小型应用,我们将没有缘由编写一些额外的代码。这样将导致应用变得复杂和编写费时。

在状态管理上,wicket可以作为一个不错的选择。wicket框架默认代管所有的组件状态。这对于中小型应用,在状态管理上的代码量几乎为0。但是wicket也提供了一些api使我们进行标准状态管理和实现自己的状态管理。这样,即使是大型应用,我们也能够全权掌握状态管理。事实上,即使在使用wicket编写大型应用时,通常也是先让wicket代管所有的状态,然后再慢慢的实现自己定义的状态管理以提高应用性能。

六、配置

不言自明,struts需要一个xml文件:定义对http请求和响应的映射和所有的actionform对象等。这个文件可能非常大而且复杂。而新版本的struts提供了将这个文件分解为多个模块的方法,虽然这样可以将模块分类,但是这样同样要维护许多的小文件。

wicket不需要配置文件。wicket通过一个简单的应用配置类或者通过编写web容器的web.xml文件中servlet init参数来完成程序的初始化。而http请求到组件事件的映射、组件如何输出html等被包含在了wicket的应用逻辑里,从而极大地简化了配置。

七、wicket1.2的roadmap

    * javascript support
    * css support
    * markup inheritence
    * experimental ajax support
    * improved url handling
    * include of external markup
    * simplified choice component
    * improved feedback support
    * thread safe validation (bug fix)
    * immediate button support for forms
    * panel support for treeview
    * date picker component
    * component reference examples
    * ajax support
    * portlet support (jsr 168)
    * clean and pretty url's
    * jaas/acegi/other security integration

八、参考资料
http://wicket.sourceforge.net/
http://www.wicket-wiki.org.uk/wiki/index.php/newuserguide
 
 
上一篇: 创建struts1.2 + hibernate3.0 web工程    下一篇: 用struts+spring+hibernate组装web应用
  相关文档
一种纯java的数据库—jdatastore 11-17
品味spring 的魅力 11-16
java用oci驱连oracle数据库的实现方法 11-17
从.class文件中寻找类名 11-17
关于线程的停止问题 11-17
用javabean实现文件上载(目录) 11-16
使用 struts portlet 实现页面导航 11-17
给所有刚学java以及常来此版的兄弟 11-17
chinasourcing借国际会展打造国家公共品牌 05-08
java基础:看看流行的和过时的鼠标事件 11-16
给你的java应用程序加上日志功能 11-17
java入门笔记2_applet 11-17
getutcfullyear 方法 11-16
采用多线程制作动画 11-17
实现游戏中的简单打字功能 11-17
mvc设计模式在通用报表系统中的应用 11-17
java的网络功能与编程 一(转)---建议放入精华区 11-17
sun java认证问答 11-17
struts controller 11-17
jdb 的简单使用 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息