`
marszgl
  • 浏览: 53737 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Web框架对比: Wicket vs Struts

阅读更多

原文: Web框架对比: Wicket vs Struts

一、概貌

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

分享到:
评论
7 楼 hqman 2007-09-14  
struts 没spring mvc好使
:idea:
6 楼 eltonto 2007-05-21  
struts没有活路了吗?

苦于没有WICKET站收录,如果有的话请登记到
http://www.wicket.com.cn

谢谢
5 楼 blueclothes 2007-05-20  
简单的试了一下,wicket真是不错啊。看来struts真的可以安心的去了。
4 楼 wl95421 2007-05-08  
JSF的View还是完全基于标签的
这个我觉得很难和美工协作

Tapestry其实在很大程序上与Wicket相似,特别是在View层,但是感觉Tapestry的学习曲线有点高,而且太复杂了一些。我研究过一段时间,虽然自己用起来没有问题,但是让下面初级程序员用,实在是没有这个胆子。
3 楼 lyo 2007-05-06  
如果是基于事件的,可以和 Tapestry或者 JSF比一下,看看优势在哪里
2 楼 pigfly 2007-04-10  
good
1 楼 pigfly 2007-04-10  

相关推荐

    Wicket vs Struts

    本文将对比两个流行的Java Web框架:Wicket和Struts,旨在帮助开发者更好地理解它们的特点、优势以及适用场景。 **Wicket** Wicket是一个基于组件的MVC(Model-View-Controller)框架,它的核心理念是"一切都是一...

    Wicket开发指南

    - **Struts**:Struts是早期流行的MVC框架之一,但它的配置较为繁琐,且在处理复杂的Web交互时显得不够灵活。 - **Tapestry**:Tapestry同样支持组件化开发,但在性能和易用性方面不如Wicket。 - **ASP.NET**:...

    apache-wicket

    2. **Wicket与其它组件框架的对比**:文档中提到Wicket与其他组件框架的对比,这暗示了Wicket的设计和特点与其他流行的框架如JSF(JavaServer Faces)、Struts或者Spring MVC存在差异。了解这些差异有助于开发者根据...

    Wicket中文开发指南

    **1.3 Wicket与其他Web框架的比较** - **Struts概述**:Struts是最早的MVC框架之一,强调配置文件的使用,而Wicket则更注重代码本身的逻辑处理。 - **Tapestry概述**:Tapestry也是基于组件的Web框架,但相较于...

    apache-wicket-1.3.0.zip_wicket

    Apache Wicket 是一个开源的Java Web应用程序框架,它专注于提供组件化的、声明式的编程模型,以简化Web开发。Wicket 1.3.0 版本是该框架的一个早期版本,尽管相对较旧,但仍然包含了许多核心特性,有助于开发者构建...

    Java Web层框架之比较—比较JSF、Spring MVC、Stripes、Struts 2、Tapestry和Wicket.doc

    本文将深入对比六种流行的Java Web层框架:JSF、Spring MVC、Stripes、Struts 2、Tapestry和Wicket。 **JavaServer Faces (JSF)** JSF作为Java EE的一部分,拥有广泛的支持和市场需求。它的优点在于快速上手和丰富...

    Wicket开发指南-简体版

    **1.3 Wicket与其他Web框架的比较** - **Struts概述**:Struts是一个流行的MVC框架,但相比Wicket来说,它的配置更为复杂,学习曲线较高。 - **Tapestry概述**:Tapestry也采用了组件化的方式,但在灵活性和性能...

    Wicket.pdf(Wicket开发指南)

    - **与 Struts 比较:** Wicket 更加注重组件化和 MVC 的分离,提供更好的代码组织结构;而 Struts 更侧重于表单处理和数据验证。 - **与 Tapestry 比较:** 两者都强调组件化开发,但 Wicket 在性能优化方面做得...

    wicket 基础知识培训

    Wicket 是一个开源的Java Web框架,用于构建可重用且易于维护的Web应用程序。它以其组件模型和数据绑定机制而闻名,与Struts等传统MVC框架相比,提供了更直观和面向对象的编程方式。 在Wicket基础知识培训中,首先...

    wicket 开发指南

    - **定义**: Wicket 是一款基于 Java 的 Web 开发框架,与 Struts、WebWork 和 Tapestry 等框架相类似。 - **特点**: - 对 HTML 和代码进行了有效的分离,便于程序员和前端设计师的合作。 - 基于规则的配置,减少...

    framework:类似Struts的Web框架

    "framework:类似Struts的Web框架"这个标题暗示了我们将讨论一种与Apache Struts类似的框架,Struts是Java EE领域中广泛使用的开源MVC(Model-View-Controller)框架。 Struts框架的核心特性包括: 1. **MVC架构...

    JAVA框架对比(author:Matt raible)

    描述:本资源由Matt Raible提供,深入比较了六个主要的Java Web框架:JSF、Spring MVC、Stripes、Struts2、Tapestry和Wicket,旨在帮助开发者根据项目需求选择最适合的框架。 知识点: 1. **JSF (JavaServer Faces...

    J2EE页面框架-几十种样式

    页面框架是一种软件设计模式,它提供了一种组织和管理Web应用用户界面的方法,简化了开发过程,提高了代码的可重用性和可维护性。"J2EE页面框架-几十种样式"这个主题显然关注的是在J2EE环境中用于构建多样化、美观...

Global site tag (gtag.js) - Google Analytics