Java Server Faces 2.0的主要缺点是什么?

时间:2010-09-02 04:54:36

标签: asp.net-mvc jsf jsf-2

昨天我看到了一个关于Java Server Faces 2.0的演示文稿,虽然我目前是一个快乐的ASP.NET MVC / jQuery开发人员,但它看起来确实令人印象深刻。我最喜欢JSF的是大量支持AJAX的UI组件,这些组件似乎比ASP.NET MVC更快,特别是在AJAX重型站点上。集成测试看起来也很不错。

由于演示文稿只强调了JSF的优点,我也想听听另一方面的意见。

所以我的问题是:

  • Java Server Faces 2.0的主要缺点是什么?
  • 什么可能使JSF开发人员考虑使用ASP.NET MVC而不是JSF?

13 个答案:

答案 0 :(得分:455)

答案 1 :(得分:52)

在与JSF合作5年后,我认为我可以加2美分。

两个主要JSF 缺点:  

      
  1. 大学习曲线。 JSF很复杂,这是正确的。   
  2. 组件性质。基于组件的框架试图隐藏Web的真实性质,它带来了大量的复杂性和灾难(比如在近5年内不支持JSF中的GET)。  
    恕我直言,隐藏开发者的HTTP请求/响应是一个巨大的错误。根据我的经验,每个基于组件的框架都会为Web开发添加抽象,而抽象会导致不必要的开销和更高的复杂性。  

我想到的次要缺点:  

     
  1. 默认情况下,对象的ID由其父项ID组成,例如form1:button1。  
  2. 没有简单的方法来评论错误页面的片段。标记<ui:remove>需要语法正确的内容,无论如何都要解析。   
  3. 低质量的第三方组件,例如在继续之前,请勿在{{1​​}}方法中检查isRendered()。  
  4. 融入LESS&amp; Sencha很难。  
  5. 与REST不兼容。  
  6. 对于UX设计人员来说并不那么容易,因为即用型组件有自己的CSS样式,需要覆盖。

别误会我的意思。作为一个组件框架,版本2中的JSF非常好,但它仍然是基于组件的,并且总是会...

请看看Tapestry,Wicket的低人气和经验丰富的JSF开发人员的低热情(更有意义的是)。 相比之下,看看Rails,Grails,Django,Play的成功!框架 - 它们都是基于行动的,不要试图隐藏网络上的程序员真实请求/响应无状态性

对我而言,这是JSF的主要劣势。恕我直言JSF可以适合某种类型的应用程序(内联网,表单密集型),但对于现实生活中的 web 应用程序来说,这不是一个好方法。

希望它可以帮助某些人选择与前端有关的选择。

答案 2 :(得分:24)

想到一些缺点:

  1. JSF是一个基于组件的框架。 这具有固有的限制 与顺从有关 组件的模型。
  2. AFAIK JSF仅支持POST,所以如果你想在某个地方获得GET 做一个普通的servlet / JSP。
  3. 大多数组件尝试提供域等抽象 关系数据库和前端 JavaScript,很多时候这些 抽象是“漏洞”,很难调试。
  4. 这些抽象可能是初级开发人员或不熟悉某个特定领域的人(如前端JavaScript)的良好起点,但很难对性能进行优化,因为涉及多个层次,而且大多数人使用它们几乎不了解幕后发生的事情。
  5. 通常与JSF一起使用的模板机制与Web desigers的工作方式无关。 JSF的WYSIWYG编辑器是原始的,无论如何,您的设计师将为您提供您需要花费多年时间转换的HTML / CSS。
  6. EL表达式之类的东西没有静态检查,编译器和IDE都没有很好地找到错误,所以你最终会遇到在运行时必须捕获的错误。这对于像Ruby或PHP这样的动态类型语言来说可能没问题,但是如果我必须承受Java生态系统的庞大膨胀,我就要求为我的模板打字。
  7. 总结一下:使用JSF保存的时间,从避免编写JSP / servlet / bean样板代码开始,你将花费x10来使其扩展并完全按照你的要求进行操作希望它能做到。

答案 3 :(得分:18)

对我来说,JSF 2.0的最大缺点是不仅是JSF的学习曲线,而是为了让它做有用的工作而必须使用的组件库。考虑一下您所处理的规格和标准数量惊人,以确保精通:

  • 各种形式的HTML。不要假装你不需要知道它。
  • HTTP - 当您无法弄清楚发生了什么时,您必须打开Firebug并查看。为此你需要知道这一点。
  • CSS - 喜欢或不喜欢。它真的不是那么糟糕,至少有一些不错的工具。
  • XML - JSF可能是你在这个程度上使用命名空间的第一个地方。
  • Servlet规范。迟早你会在这个包中调用方法。除此之外,你必须知道你的Facelets如何变成XHTML或其他什么。
  • JSP(主要是因为你知道为什么你在JSF中不需要它)
  • JSTL(再次,主要是为了应对遗留框架)
  • 表达语言(EL)的各种形式。
  • ECMAScript,JavaScript或其他任何您想要称之为的内容。
  • JSON - 即使你不使用它,你也应该知道这一点。
  • AJAX。我会说JSF 2.0可以很好地隐藏这个,但是你仍然需要知道发生了什么。
  • DOM。以及浏览器如何使用它。见ECMAScript。
  • DOM事件 - 一个独立的主题。
  • Java持久性架构(JPA),如果您希望您的应用拥有任何后端数据库。
  • Java本身。
  • JSEE,当你在它时。
  • 上下文依赖注入规范(CDI)及其与JSF 2.0冲突的方式
  • JQuery - 我希望看到你没有它而相处。

现在,一旦完成,您就可以继续使用专有规范,即您将在此过程中选择的组件库和提供程序库:

  • PrimeFaces(我选择的组件库)
  • RichFaces的
  • MyFaces的
  • ICEFaces的
  • EclipseLink(我的JPA提供商)
  • 休眠
  • 焊接

不要忘记容器!以及所有这些配置文件:

  • GlassFish(2,3等)
  • 的JBoss
  • Tomcat的

所以 - 这样做很容易吗?当然,只要您想要做的只是最简单的交互的最基本的网页,JSF 2.0是“简单的”。

简单地说,JSF 2.0是当今软件领域中存在的最复杂,最麻烦的混合技术混合体。我想不出任何我宁愿使用的东西。

答案 4 :(得分:12)

  1. 缺乏经验的开发人员通常会创建速度非常慢且代码难以维护且难以维护的应用程序。它起初看起来很简单,但如果你想编写好的程序,实际上需要一些学习上的投资。
  2. 至少在开始时你会经常“卡住”某些问题并且会花更多的时间在互联网上阅读balusc帖子而不是实际工作:)过了一会儿它会越来越少,但它仍然会令人讨厌
  3. 当您发现问题不是由于您缺乏知识/错误而是实际上是一个错误时,更令人讨厌。 Mojarra(是?)非常错误,另一层组件增加了更多问题。 Richfaces是有史以来最大的废话软件:)不知道它现在是如何在版本4.我们有Primefaces更好,但你仍然会遇到错误或缺乏功能,尤其是更奇特的组件。现在您需要为Primefaces更新付费。所以我会说它的马车,但它变得更好,特别是在2.2版本修复了规格的一些问题。框架越来越成熟,但仍然远非完美(也许myfaces更好?)。
  4. 我觉得它不是特别灵活。通常,如果你需要非常定制的东西,并且没有任何组件可以做到这一点 - 那将会有点痛苦。我再次从平均开发人员的角度谈论 - 有截止日期,快速阅读教程和搜索堆栈溢出的问题,因为没有时间去学习它是如何工作的:)通常一些组件似乎“几乎”你需要的东西,但是不完全有时你可能会花太多时间让它做你想做的事情:)在评估是否更好地创建自己的或折磨现有组件时需要小心。实际上,如果你正在创造一些非常独特的东西,我不会推荐JSF。
  5. 所以简而言之,我的缺点是:复杂性,不是非常顺利的开发进度,错误,不灵活。

    当然也有优点,但那不是你问的。无论如何,这是我对框架的经验,其他人可能会有不同的意见,所以最好的方法是尝试一段时间,看看它是否适合你(只是更复杂的东西 - 不是天真的例子 - JSF真的在那里闪耀:)恕我直言最好的用例JSF是业务应用程序,如CRM等......

答案 5 :(得分:11)

“JSF将输出您无法控制或更改的视图层HTML和JavaScript,而无需进入Controller代码。”

实际上,JSF为您提供了灵活性,您可以使用标准/第三方组件,也可以创建自己的组件,您可以完全控制所呈现的内容。使用JSF 2.0创建自定义组件只需要一个xhtml。

答案 6 :(得分:9)

我们用JSF开发了一个示例项目(这是一个为期三周的研究,所以我们可能会失去一些东西!)

我们尝试使用核心jsf,如果需要组件,我们使用PrimeFaces。

该项目是一个带导航的网站。单击菜单时,应通过ajax加载每个页面。

该网站有两个用例:

  1. 带网格的页面。网格是通过ajax加载的,应该支持排序和分页
  2. 三步向导页面。每个页面都有客户端验证(用于简单验证)和服务器端ajax基础验证(用于复杂验证)。任何服务器异常(来自服务层)都应显示在向导的同一页面上,而不导航到下一页。
  3. 我们发现:

    1. 您需要使用omniFaces中的一些hack来修复JSF视图状态。当您通过ajax在彼此中包含页面时,JSF状态将被破坏。这似乎是JSF中的一个错误,可能会在下一个版本中修复(不在2.3中)。
    2. JSF Flow无法正常使用ajax(或者我们无法使其工作!)我们尝试使用primeface向导组件,但客户端验证似乎不受支持,并且意味着它不是标准的JSF流标准。
    3. 当使用jqGird等一些jQuery组件时,你需要加载JSON结果,然后建议你使用纯servlet,JSF将不会为你做任何事情。因此,如果您使用这些组件,则您的设计将无法适用于JSF。
    4. 我们尝试在ajaxComplete完成ajax时执行一些客户端脚本,我们发现PF 4已经实现了自己的ajax事件。我们有一些jQuery组件,我们需要更改他们的代码。
    5. 如果您将上述示例更改为非Ajax 项目(或至少减少ajax项目),您将不会遇到很多上述问题。

      我们将研究总结为:

        

      JSF在完全ajax基础网站上效果不佳。

      当然,我们在JSF中发现了很多很好的功能,这些功能在某些项目中可能非常有用,所以请考虑您的项目需求。

      请参阅JSF技术文档以查看JSF的优势,在我看来,JSF的最大优势是来自@BalusC的完整和巨大的支持; - )

答案 7 :(得分:9)

我根本不是Java Server Faces专家。但恕我直言,主要的缺点是它的服务器端。我厌倦了学习和使用服务器端Web表示层框架,如ASP.NET Web Forms,ASP.NET MVC,Java Server Faces,Struts,php框架和ruby on rails框架。我告别了所有人,我向Angularjs和TypeScript问好。我的表示层在浏览器上运行。如果由运行php或ASP.NET的Windows IIS提供服务,或者它是由运行在Linux上的Apache Web服务器提供服务,则无关紧要。我只需要学习一个适用于所有地方的框架。

只是我的两分钱。

答案 8 :(得分:6)

评论我最近几个月的Primefaces / JSF经历:

  • 如果您可以使用“现成的”组件,我想这并不可怕。
  • 但是,只要您走出去并需要自定义用户界面,它就无法正常播放。 - 例如,我们需要在我们的项目中使用Twitter的引导程序。 (不是primefaces bootstrap)。
    • 现在我们的页面工作如下:
      • 页面加载。
      • 用户与具有ajax功能的Primeface进行交互
      • Bootstrap的javascript绑定中断
      • 我们运行额外的javascript来重新绑定所有内容

JSF避免编写javascript的承诺变成了编写更多的javascript,而不是使用Primefaces - 并且javascript来修复Primefaces破坏的内容。

这是一个时间下沉 - 除非你再次使用“现成的”东西。当与Selenium合作时,也非常丑陋(Primefaces)。这一切都可以完成 - 但同样 - 只有那么多时间。

如果您正在与UX /设计团队合作并且需要快速迭代UI,那么一定要避免这种情况 - 您可以通过学习jquery /编写直接HTML来节省时间 - 或者查看react / angular。

答案 9 :(得分:5)

对我来说,JSF的最大缺点是对以编程方式(动态)生成的页面的支持不足 如果要从java代码动态构建页面(创建页面组件模型)。例如,如果您正在使用WYSIWYG网页构造函数。通常不提供此用例的充分文档。有很多方面你需要进行实验,开发速度很慢。许多事情根本无法实现。但一般来说它可能以某种方式破解它 好的是,它在JSF的哲学或架构中不是问题。它根本没有详细说明(据我所知)。

JSF 2带来了复合组件,它应该使组件开发变得容易,但它们对动态(程序化)构造的支持非常差。如果您克服了动态复合组件构造的安静复杂且几乎未记录的过程,您会发现如果将较少的复合组件嵌套得更深,它们会停止工作,抛出一些例外。

但似乎JSF社区意识到了这个缺点。正如你从这两个错误中看到的那样,他们正在研究这个问题 http://java.net/jira/browse/JAVASERVERFACES-1309
http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-599

至少在我们谈论规范的情况下,JSF 2.2的情况应该会更好。

答案 10 :(得分:1)

JSF有许多优点,问题是处于劣势,让我在其上添加几点。

在实施Web项目的实际场景中,您需要密切关注以下因素。

  • 您的团队中是否有足够的高级成员可以提出最佳建议 适合每种情况的控件?
  • 您是否有足够的带宽来容纳初始学习曲线?

  • 您的团队中是否有足够的专业知识可以审核JSF 东西由开发商生产?

如果您的答案是“否”&#39;对于这些问题,您最终可能会进入不可维护的代码库。

答案 11 :(得分:0)

JSF只有一个缺点:在开始“JSF”开发之前,你应该清楚地了解Web开发,核心java和前端架构。

如今“新”JavaScript框架只是尝试复制/粘贴“JSF”基于组件的模型。

答案 12 :(得分:0)

在所有“主流”框架中,如Spring MVC,Wicket,Tapestry等,Java EE及其复合组件的JSF是最精细的表示层和面向组件的技术。与HybridJava提供的解决方案相比,它有点麻烦和不完整。