文档章节

Java Web层框架比较—— 比较JSF、Spring MVC、Struts2

白尒摩斯
 白尒摩斯
发布于 2016/02/26 18:08
字数 2718
阅读 237
收藏 0
点赞 1
评论 0

【译者按】这是Matt Raible在今年6月24-27号召开的JA-SIG夏季会议上所作的主题演讲,Matt从众多方面对Java Web层框架做了一个全面、深入的比较。笔者认为这是一份及时的文档,它对开发者如何判定一个Web层框架的好坏、如何选择适合自己项目的框架有极大的指导作用。本文是对Matt Raible演讲稿的整理归纳。 
【作者介绍】Matt Raible,开源框架AppFuse的发起者、主要开发者;《Professional JSP 2.0》、《Spring Live》等书的作者;众多会议的演讲者,MySQL User Conference, ApacheCon, ApacheCon EU等;现任Raible Designs的CEO。

     首先,Matt以自己的实践经验,指出了Java Web层框架——JSF、Spring MVC、Stripes、Struts 2、Tapestry和Wicket他们各自的优、缺点: 
     JSF 
     优点: 
     Java EE标准,这意味着有很大的市场需求和更多的工作机会 
     上手快速并且相对容易 
     有大量可用的组件库 
     缺点: 
     大量的JSP标签 
     对REST和安全支持不好 
     没有一个统一的实现。既有SUN的实现,又有Apache的实现——MyFaces。

     Spring MVC 
     优点: 
     对覆盖绑定(overriding binding)、验证(validation)等提供生命周期管理 
     与许多表示层技术/框架无缝集成:JSP/JSTL、Tiles、Velocity、FreeMarker、Excel、XSL、PDF等 
     便于测试——归功于IoC 
     缺点: 
     大量的XML配置文件 
     太过灵活——没有公共的父控制器 
     没有内置的Ajax支持

     Stripes 
     优点: 
     不需要书写XML配置文件 
     良好的学习文档 
     社区成员很热心 
     缺点: 
     社区比较小 
     不如其他的项目活跃 
     ActionBean里面的URL是硬编码的

     Struts 2 
     优点: 
     架构简单——易于扩展 
     标记库很容易利用FreeMarker或者Velocity来定制 
     基于控制器或者基于页面的导航 
     缺点: 
     文档组织得很差 
     对新特征过分关注 
     通过Google搜索到的大多是Struts 1.x的文档

     Tapestry 
     优点: 
     一旦学会它,将极大地提高生产率 
     HTML模板——对页面设计师非常有利 
     每出一个新版本,都会有大量的创新 
     缺点: 
     文档过于概念性,不够实用 
     学习曲线陡峭 
     发行周期长——每年都有较大的升级

     Wicket 
     优点: 
     对Java开发者有利(不是Web开发者) 
     页面和显示绑定紧密 
     社区活跃——有来自创建者的支持 
     缺点: 
     HTML模板和Java代码紧挨着 
     需要对OO有较好的理解 
     Wicket逻辑——什么都用Java搞定

     接着,Matt通过采访这些框架的作者,与他们讨论各种开源的Java Web框架,并且突出各个框架的长处、听取框架作者对其他框架的看法,希望借此了解这些框架的未来发展方向。

     下列是一些被采访者: 
     JSF, Jacob Hookom 
     RIFE, Geert Bevin 
     Seam, Gavin King 
     Spring MVC, Rob Harrop 
     Spring Web Flow, Rob Harrop and Keith Donald 
     Stripes, Tim Fennell 
     Struts 1, Don Brown 
     Tapestry, Howard Lewis Ship 
     Trails, Chris Nelson 
     Struts 2, Patrick Lightbody 
     Wicket, Eelco Hillenius

     Matt对采访做了如下总结: 
     JSF: 
     如果你想让web应用具有类似桌面程序的功能性,那么JSF的标准规范和大量第三方组件库的支持值得你 信赖。 
     Spring MVC: 
     综合了许多不同的技术,这使得它可以被广泛地应用到不同类型的项目中去;它可以被当作web应用开发的一个基础平台。 
     Stripes: 
     可以被应用到存在大量复杂数据交互的程序中;有强大的类型转换、绑定和验证功能;可以使管理大的复杂表单以及直接映射它们到域对象变得简单…… 
     Tapestry: 
     在中到大型项目中,表现突出(当然,你也可以只把它应用到单个页面上),在这些项目中,你可以通过简单地创建新的组件起到杠杆作用。 
     Struts 2: 
     通常更适合于那些希望可以真正开始做事并且愿意花费大量时间来学习他们使用的开源工具的小项目组。Struts 2的目标不是那些更喜欢拖放式开发的“扶手椅程序员”。 
     Wicket: 
     非常适合于这样的内/外部网应用:UI很复杂并且你希望可以充分利用你的开发者资源。

     上面的总结,基本是突出了各个框架的长处。然而,哪些又是他们不好的地方呢?

     Matt提出了评价一个框架好坏与否的标准: 
     Ajax支持        是不是内置了?是否便于使用? 
     书签能力       用户能否将某个页面收藏起来并且可以方便地返回到该页面? 
     验证        使用是否简单?是否支持客户端(JavaScript)验证? 
     可测试性      脱离容器测试控制器,是否足够简单? 
     提交和重定向      框架如何处理重复提交问题? 
     国际化       如何支持国际化?控制器利用国际化信息,是否容易? 
     页面修饰       框架支持哪种类型的页面修饰/组成机制? 
     社区和技术支持       提出问题,能否被快速地、恭敬地回答? 
     开发工具       是否有支持这个框架的好的工具,尤其是IDE? 
     市场需求       学习了这个框架,它能否帮你找到份工作? 
     岗位数量       在dice.com和indeed.com上,对这个框架技能的需求如何?

    笔者认为这个评价标准,值得大家借鉴。 

     然后,Matt按照这些评价标准,对各个框架做了以下阐述: 
     Ajax支持 
     JSF:没有内置的Ajax支持,需要使用ICEfaces和Ajax4JSF 
     Stripes:没有对应的类库,支持流输出 
     Struts 2:内置Dojo,有用于GWT和JSON的插件 
     Spring MVC:没有对应的类库,需要使用DWR和Spring MVC扩展 
     Tapestry:Tapestry 4.1中,有内置的Dojo 
     Wicket:有Dojo和Script.aculo.us支持 

     书签能力 
     JSF:可以任意提交——URL甚至不被考虑 
     Stripes:使用约定,但是你可以不加理会 
     Struts 2:有命名空间的概念,这使得收藏某个页面并返回变得容易 
     Spring MVC:允许完全的URL控制 
     Tapestry:依然存在一些丑陋的URL 
     Wicket:允许装配(mount)页面/URL     

     验证 
     JSF:默认的国际化信息丑陋,但是配置简单 
     Stripes和Wicket:用Java类进行验证——不支持客户端验证 
     Struts 2:使用OGNL完成强大的表达式验证功能;只有在Action上指定了规则,才支持客户端验证。 
     Spring MVC:允许你使用公共验证器——这是一种成熟的解决方案 
     Tapestry:有健壮的验证功能——不需自定义就有漂亮的国际化信息 

     可测试性 
     Spring MVC和Struts 2:允许利用mocks(例如EasyMock、jMock和Spring Mocks)简单地进行测试 
     Tapestry:测试困难,因为页面类被抽象、具体类被简化 
     JSF:页面类可以方便地被测试,实际上很像Struts 2 中的actions 
     Wicket:有WicketTester——一个强大的解决方案 
     Stripes:有Servlet API Mocks和MockRoundtrip 

     提交和重定向 
     解决重复提交问题的最简单方法是:在提交后重定向 
     Spring MVC:允许你将参数加到重定向URL上 
     Stripes、Tapestry和Wicket:有“flash式”的支持 
     Struts 2:需要一个自定义的解决方案 
     JSF:需要一个自定义的解决方案,国际化信息很难加入到页面bean中 

     国际化 
     JSTL的<fmt:message>标签使国际化变得简单;如何将国际化信息放到控制器类中,还没有一个统一的标准。 
     Stripes、Spring MVC和JSF:每个地区使用一个资源绑定文件 
     Struts 2、Tapestry和Wicket:提倡把每个页面/action用到的资源文件分开 
     JSF:需要在每个页面上定义资源绑定信息 
     Tapestry:<span key="key.name">标签比较可怕 

     页面修饰 
     Tiles能够用于Struts 2、Spring MVC和JSF中;需要对每个页面进行配置。 
     SiteMesh能够用于所有的这些框架中(不推荐在JSF、Tapestry或者Wicket中使用);在设置完成后, 只需要很少的维护。 

     开发工具 
     Spring MVC:Spring IDE,但是只做XML校验,不是一个UI/web工具 
     Struts 2:Eclipse 
     Tapestry:Spindle,对编码者非常有利 
     JSF:众多IDE支持,并且做得越来越好 
     Stripes和Wicket:没有任何官方工具 
     NetBeans目前支持Struts *、JSF(+Facelets)、Tapestry和Wicket,尚不支持Stripes和Spring MVC


    市场需求 
    Struts 1:需求依然很大并且被广泛使用 
    Spring MVC:越来越受关注,但大部分是因为Spring框架的一些其他特征 
    JSF:很快地变得流行起来 
    Struts 2:正在获得地盘,但是相关的工作机会很少 
    Tapestry:在过去的数年里,受欢迎程度不断增加 
    Wicket和Stripes:还是未知数

     通过以上的比较,我想大家对在自己的项目中应该选择哪种Web层框架,应该有了更清醒的认识。

     最后,Matt列出了一些相关资源,也供读者参考。 
     Struts - http://struts.apache.org 
     StrutsTestCase: http://strutstestcase.sf.net 
     Spring MVC - http://www.springframework.org 
     Spring IDE: http://www.springide.org 
     Gaijin Studio: http://gaijin-studio.sf.net 
     Struts 2 - http://opensymphony.org/webwork 
     Eclipse Plugin: http://sf.net/projects/eclipsework 
IDEA Plugin: http://wiki.opensymphony.com/display/WW/IDEA+Plugin 
     Tapestry - http://tapestry.apache.org 
     http://spindle.sourceforge.net 
     JSF - http://java.sun.com/j2ee/javaserverfaces and http://myfaces.apache.org 
     Java Studio Creator: http://sun.com/software/products/jscreator 
     MyEclipse: http://myeclipseide.com 
     IDEA: http://www.jetbrains.com/idea 
     SiteMesh: http://opensymphony.com/sitemesh 
     Testing Frameworks 
     JUnit: http://junit.org 
     EasyMock: http://easymock.org 
     jMock: http://jmock.org 
     jWebUnit: http://jwebunit.sourceforge.net 
     Canoo WebTest: http://webtest.canoo.com 
     Tapestry Test Assist: http://howardlewisship.com/blog/2004/05/tapestry-test-assist.html 
     AppFuse - http://appfuse.org

     演讲的最后,Matt以一句“If it works, use it!”作为结尾,可谓精辟!

     通过此文,相信大家可以拨开当前Java Web层框架选用上的“迷雾”,见得“月明”了。 
     原演讲稿请参见:http://raibledesigns.com/rd/entry/ja_sig_comparing_java_web

 

 

 

 

4年前的一篇文章,写的很好,对于现在最新的JSF2.1(2011-03-14)来说,AJAX早就内置了。不过我还是从中认识到了很多的东西。

例如,我现在还是在用SUN的JSF(Mojarra)实现开发,很是不方便,并且Myeclipse竟然不支持最新的JSF,更让我无语。所以我想换成Apache的MyFace了。努力学习,介绍说JSF的导航和Struts2的差不多,我还担心JSF的导航不好呢,呵呵。不过不知道有没有遵循“约定重于配置”的理念,以及通配符的处理。

还是要多说几句,现在JSF2.1的资料很少,JSF的功能我只尝到了定制组件(UI)这一项,用的还是PrimeryFaces的类库,有一个小组织的名称是SmartFaces的组件做的很漂亮,但是使用至今还是没有摸到门路,只是丑丑的显示出来。

本文转载自:http://raibledesigns.com/rd/entry/ja_sig_comparing_java_web

共有 人打赏支持
白尒摩斯
粉丝 0
博文 17
码字总数 6754
作品 0
程序员
大型Java多用户商城系统设计开发的心得和困难

大型Java多用户商城系统设计开发的心得和困难 http://www.iteye.com/topic/1119514 表示层struts, spring mvc, jsf,tapestry... 控制层:spring 数据持久层:hibernate/ibatis/jdbc,归根到底...

ddatsh
2012/02/16
0
0
大型Java多用户商城系统开发的心得和困难

看到别的朋友在ITEYE上发表的“开发电子商务网站技术选型“有感而发。地址是 http://www.iteye.com/topic/1119464 本人一直从事Java企业级开发,因此接触过不少Java的开发框架。目前作一个多...

chenruibing
2015/08/18
0
1
【第一章】 Spring概述 ——跟我学Spring3

1.1.1 Spring是什么 Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。应用程序是由一组相互协作的对象组成。...

君辰
2015/07/23
0
0
从java程序员到CTO的成长路线图

很多新人不知道从事java开发,具体的发展路径是怎么样的,甚至很多人都不能区分程序猿和攻城师的区别。包括不少小白,从事java开发都半年,甚至1年了,对职业发展还没有清晰的认证。这非常不...

6pker
2013/10/24
0
2
Spring实战读书笔记(1)

Spring的根本使命是? 简化Java开发 为了降低Java开发的复杂性,Spring采取了哪4种关键策略? 1、基于POJO的轻量级和最小侵入性编程 2、通过依赖注入和面向接口实现松耦合 3、基于切面和惯例...

祥林会跟你远走高飞
2014/12/30
0
0
【第1章 Spring概述与结构】1.1 Spring起源与概述

Rod Johson在2002年编著的《Expert one to one J2EE design and development》一书中,对Java EE正统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新之道。以此书为指导思...

陶邦仁
2015/05/15
0
0
第二章:springmvc入门

2.1、Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是...

xiejunbo
2014/12/16
0
0
【第1章 Spring概述与结构】1.2 Spring模块与结构

上一节:【第1章 Spring概述与结构】1.1 Spring起源与概述 基于Java Beans的配置管理,采用IOC的原理,特别是对依赖注入技术的使用。这些都用来减少各组件间对实施细则的相互依赖性。 一个核...

陶邦仁
2015/05/21
0
0
spring2.0-2.5-3.0变化

忽然间想知道spring2.0到2.5 再到3.0的变化,就到网上搜索一下。方便查看而已 2.5的新特性 Spring2.5rc1发布了,一直想知道它葫芦里卖什么药,以下是文档里的change.log 1. JDK版本: JDK至...

dengzhangtao
2010/12/06
0
1
spring安全框架Security(一)

现在很多企业和开发团队都使用了SSH2(Struts 2 +Spring 2.5 +Hibernate)框架来进行开发, 我们或许已经习惯了强大的Spring Framework 全局配置管理,不可否认,Sping是一个很优秀的开源框架...

尚浩宇
2015/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
48分钟前
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部