各种Java Web框架的优缺点是什么?

85

我在考虑使用Java创建自己的网站,并试图决定使用哪个框架。然而,快速搜索Java框架返回了50多个可供选择的选项!

我的网站一开始只是为了自己的乐趣而建,但如果它变得受欢迎,它应该具有一些可扩展性,或者至少能够为此重新设计。

这些流行框架之间的主要区别是什么?是否存在某些情况下一个框架明显优于其他框架?例如,高流量企业应用程序与低流量小应用程序之间的区别。我还想知道是否有些框架比其他框架更容易学习和使用。

是否有人有使用这些框架的经验并能给出推荐?这么多选择只是提醒我们尽可能避免使用基于Java的Web开发吗?


在某种程度上,这就像是说“快速搜索工具返回50多个可供选择的选项;我应该选择锤子、螺丝刀还是钳子?”然而,通过子问题,这是一个不错的“好的主观”问题。 - Pops
像往常一样,“有趣”的问题和答案非常有用(我刚刚订购了关于Wicket的书,谢谢大家),但整个帖子因为不具建设性而被关闭。“这个问题可能会”——只是一个干巴巴的事实,没有任何推测,多么讽刺啊…… - greenoldman
24个回答

59

我曾广泛使用过Tapestry 3WicketEchoJSF。 我非常建议您查看它们并选择最适合您的方式和工作习惯的框架。

在它们中,对我来说最舒适的是Wicket,因为组件构建的轻量化以及页面模板的简单性。如果您正在使用自己的数据库代码而不是Hibernate或其他框架,则更加如此(我从未完全满意Wicket Hibernate或Spring Integration)。

Echo非常适合您如果您不介意用Java编写所有的布局。我知道现在已经有所不同了,但我仍然认为该产品的市场比较狭窄。它们似乎每个主要版本都会改变开发模式。

Tapestry是一个很棒的产品,但是它在开发模式上显然与其他框架非常不同,因为它主要由一位大佬引领。Howard Lewis Ship无疑非常聪明,但我对他们每个版本都忘记向后兼容的决定感到失望。尽管如此,对于您的需求来说,这可能并不重要,而且我总是发现Tapestry的产品非常令人愉悦。

JSF已经发布多年了,但仍然感觉像是一个Struts的开发者为解决所有Struts的问题而构建的东西。并没有真正理解Struts的所有问题。虽然该产品显然非常灵活,但它仍然有一种未完成的感觉。我使用它并对它有些喜爱,希望未来能有更好的发展。我认为下一个版本(2.0)将在JEE6中发布,它将通过新的模板语法(类似于Facelets)和简化的组件模型(自定义组件仅需1个文件...终于)实现真正的进步。

当然,还有许多小型框架和工具,它们各自拥有自己的追随者(Velocity用于基本需要,原生JSPs,Struts等)。我个人偏好组件导向的框架。

最后,我建议只需看看Tapestry、Wicket和JSF,并选择最适合您的那个。您很快就会发现一种方式适合您。


如果你的Web应用程序是基于内容的,比如论坛系统,我建议你使用GWT和Ext-js。
如果你的Web应用程序更像一个桌面应用程序,比如ERP终端,我建议你使用ZK、Echo3、Vaddin和GWT。
我不会建议任何JSF解决方案,因为除了“它是JEE标准”这个事实外,我发现没有使用它们的好处。
- Zanyking
1
@Zanyking - 如果你的论坛需要SEO,我认为你会发现GWT很困难。 - jsight
3
JSF 可能对于一个网站来说过于繁琐,相反我会选择更加高效的框架来开发...开发应该保持有趣,而JSF不是为了“有趣”而建立的 :) - HeDinges
1
Tapestry、Wicket、JSF和Echo都是面向组件的,而GWT、Ext-js和Vaadin则是面向JavaScript的。别忘了看看所有精彩的“经典”MVC框架,如Spring MVC、Play框架、Grails和Stripes。它们与前者有非常不同的编程模型,但拥有其他优点(这就是为什么有这么多框架——不同的目的、需求和口味需要不同的工具)。 - DaGGeRRz

39

我最喜欢的是Spring框架。2.5版本的Spring MVC非常酷,有新的注释、约定优于配置等功能。

如果你只是做一些超级简单的事情,也可以尝试使用常规的Servlet API,不必使用框架。


1
点赞提到使用常规的Servlet API来处理简单事务。 - lsiu
1
我会避免使用任何“web mvc”框架,原因在《Wicket In Action》的(免费)第一章中有概述。此外,除非您有一个单页面应用程序或者想要从头开始编写自己的框架,否则我会避免直接使用Servlet API。 - Eelco
3
我也喜欢春天,但我发现只有在编写大型应用程序时才能充分利用所有配置。 - Leonard Ehrenfried
1
几乎没有使用注释来进行配置。 - bpapa
1
@bpapa 这些注解只是将配置放置在您的Java类中,而不是XML文件中。 - Steven

25

我建议使用面向组件的Wicket框架。它允许您使用纯Java代码编写Web应用程序,您可以将POJOs用作所有组件的模型,而无需处理庞大的XML配置文件。

在我发现Wicket并看到Web应用程序开发有多简单之前,我已经成功地使用Struts开发了一款在线银行应用程序!


17

最近我开始使用 Stripes Framework。如果你正在寻找一种基于请求的框架,易于使用,但不会限制你在做什么方面的话,我强烈推荐它。

它类似于Struts,但远远超越了它。甚至有一些插件项目,可以让你用非常少的配置来使用 Hibernate 或 JPA。

虽然有很多好的框架,但我听说 Wicket 也是一个不错的选择,但我没有使用过。


16

虽然我自己还没尝试过,但我认为

http://www.playframework.org/

具有很大的潜力...

作为一个来自php和classic asp的人,这是我第一次听说一个听起来很有前途的java web框架...


2
今天我在StackOverflow上已经第五次看到“我没有用过,但我推荐Play”的评论,这真是有趣。 - Marko

11

更新:Tapestry 5.2已经发布,因此它不是被放弃的,之前似乎是这样的。我的经验是在Tapestry 4上,而不是5,所以可能会有所不同。随着多年的经验,我的观点已经改变了;我修改了这篇文章以反映这一点。

我不能再像以前一样推荐Tapestry。虽然Tapestry 5似乎有很大的改进,但我对Tapestry的主要问题并不在于平台本身;而是与背后的人有关。

历史上,每个Tapestry的主要版本升级都远远超出了预期的向后兼容性破坏程度。这似乎是由于结合了需要重写的新编码技术或技术所致。

Howard Lewis Ship(Tapestry的主要作者)确实是一位杰出的开发者,但我不能说我喜欢他对Tapestry项目的管理。Tapestry 5的开发几乎是在Tapestry 4发布后立即开始的。据我所知,Ship几乎完全将自己致力于此,把Tapestry 4交给其他贡献者,我觉得他们没有Ship那么能干。在从Tapestry 3到Tapestry 4的痛苦转换之后,我感到自己几乎被抛弃了。

当然,随着Tapestry 5的发布,Tapestry 4成为了传统产品。如果升级路径不是如此残酷,我就不会有问题 again.。因此,现在我们的开发团队处于相当尴尬的位置:我们可以继续使用基本上被放弃的Web平台(Tapestry 4),进行可怕的升级到Tapestry 5,或者放弃Tapestry并使用另一个平台重写应用程序。这些选项都不是非常吸引人。

Tapestry 5据说是为了从现在开始减少更新破坏而编写的。一个很好的例子就是页面类:在之前的版本中,页面类源于Tapestry提供的一个基础类;这个类中不兼容的API更改是导致大量向后兼容性问题的原因。在Tapestry 5中,页面是普通的POJOs,通过注释在运行时进行增强。只要注释的契约得到维护,Tapestry的更改就不会影响页面类。

如果这是正确的,那么使用Tapestry 5编写新应用程序可能会取得良好的效果。但就我个人而言,我不想再次将手放在火上。


更新:随着时间的推移,Tapestry项目似乎已经被放弃了。自2009年4月以来,没有Tapestry 5版本发布,而Tapestry 4在他们的JIRA中仍有大量未解决的错误,自'08以来也没有更新。因此,我不能再推荐Tapestry作为Web应用程序框架的可行选择。 - Robert J. Walker
Tapestry并没有被放弃。Tapestry5分支相当活跃,其中5.1是稳定的选择,而5.2即将推出。 - Timo Westkämper
你说得对。事实上,Tapestry 5.2已经发布了。我已经更新了帖子,以反映我对Tapestry的更新看法。 - Robert J. Walker

9
< p > 免责声明:我在Vaadin(以前是IT Mill)工作

如果您正在进行RIA相关的工作,您可能想看看Vaadin。它是一个开源的面向UI的AJAX框架,对我来说使用起来很不错(我自己来自PHP背景)。

有一个案例研究比较了在Icefaces和Vaadin中完成相同应用程序的情况(即具有相同功能集的两个应用程序)。简而言之,它说明UI开发速度快得多。

尽管该研究托管在公司的维基上,但我可以保证它是客观、真实和真实的,尽管我不能强迫您相信我。


+1 这个框架被重新命名为 vaadin(之前是 ITMill)。我必须说,vaadin 是一个非常漂亮的 Web 框架,完全基于 Java,没有其他语言。我发现它非常高效。 - fmucar

7
经过长时间的测试和尝试,我发现最适合我的技术方案是:
  • Spring MVC 用于表示层和控制器层(不使用 Spring Webflow,因为我的流程基于 ajax)

  • jQuery 用于所有客户端功能

  • Spring Security 用于安全方面

  • Hibernate / JPA2

  • Jetty 用于连续性(comet)

学习曲线陡峭,花了一个月的时间,但现在我很满意。
我还想提一下,我差点放弃 Java 相关的所有东西,转而学习 Scala/LIFT。就我而言,与切割边缘的 web 开发相关的 Java 的所有内容(comet、异步通信、安全性(是的,即使使用 Spring Security!))仍然有些不太完美(请通过证据来证明我是错的!)。对我来说,Scala/LIFT 更像是一个更开箱即用、全能的解决方案。
我最终决定不选择 Scala 的原因是:
  • 作为项目负责人,我必须考虑人力资源,Java 开发人员比 Scala 开发人员更容易找到

  • 对于我的团队中的大多数开发人员来说,Scala 的函数概念虽然很好,但很难理解

祝好 Er

这是非常好的东西。选择Spring MVC是个不错的选择,保持安全(和明智)的一面。 - Victor Ionescu

5
我的选择是Wicket!

5
我也听说过Spring Framework很不错。总的来说,我对大多数Java web框架的印象并不好(尤其是Struts)。
对于一个简单的应用程序,我肯定会考虑使用“原始”的servlet和JSP,并不担心采用框架。如果servlet编写得很好,那么将来在应用程序变得更加复杂时,迁移到框架应该是很简单的。

1
如果Servlet编写得很好,那么+1。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接