昨天我看了一个关于Java Server Faces 2.0的演示,它看起来确实令人印象深刻,尽管我现在是一个快乐的ASP。asp.net MVC / jQuery开发。我最喜欢JSF的地方是它有大量支持ajax的UI组件,这使得开发比使用ASP要快得多。NET MVC,特别是在ajax较多的站点上。集成测试看起来也很不错。
由于这个演示只强调了JSF的优点,所以我也想听听其他方面的情况。
所以我的问题是:
Java Server Faces 2.0的主要缺点是什么?
什么会使JSF开发人员考虑使用ASP。NET MVC而不是JSF?
在使用JSF工作了5年之后,我认为我可以添加我的2分。
Two major JSF drawbacks:
Big learning curve. JSF is complex, that's just true.
Its component nature. Component-based framework tries to hide the true nature of the Web, which comes with a huge amount of complications and disasters (like not supporting GET in JSF within almost 5 years).
IMHO hiding HTTP Request/Response from the developer is an enormous mistake. From my experience, every component-based framework adds abstraction to the Web development, and that abstraction results in unnecessary overhead and higher complexity.
And minor drawbacks that come to my mind:
By default ID of the object is composed of its parents' ids, for example form1:button1.
No easy way to comment-out incorrect page's fragment. Tag <ui:remove> needs syntactically correct content which is parsed anyway.
Low quality 3rd party components which e.g. don't check isRendered() inside processXxx() method before continuing.
Incorporating LESS & Sencha is hard.
Doesn't play well with REST.
Not so easy for UX designers, because ready-to-use components have their own CSS styles, that need to be overwritten.
不要误会我的意思。作为一个组件框架,JSF在版本2中确实很好,但它仍然是基于组件的,而且永远是……
请看看Tapestry、Wicket的低人气以及有经验的JSF开发人员的低热情(这是更有意义的)。
作为对比,看看Rails、Grails、Django、Play!框架——它们都是基于动作的,不会试图向程序员隐藏真实的请求/响应和web的无状态特性。
对我来说,这是JSF的主要缺点。恕我直言,JSF可以适合某些类型的应用程序(内部网、表单密集型),但对于现实生活中的web应用程序来说,它不是一个好方法。
希望它能帮助一些人做出关于前端的选择。
评论我过去几个月的Primefaces/JSF体验:
如果你可以使用“现成的”组件,我想这并不可怕。
然而,当你走到外面并需要定制ui时,它就不能很好地发挥作用。-例如,我们需要在项目中使用Twitter的bootstrap。(不是primefaces bootstrap)。
现在我们的页面工作如下:
页面加载。
用户与具有ajax功能的Primefaces交互
Bootstrap的javascript绑定中断
我们运行额外的javascript来重新绑定所有内容
JSF避免编写javascript的承诺变成了编写比不使用Primefaces时更多的javascript——而javascript是用来修复Primefaces破坏的。
这是一个时间消耗器——除非你再次使用现成的东西。当不得不与Selenium一起工作时,也非常丑陋(Primefaces)。这些都是可以做到的,但是时间有限。
如果你和UX/设计团队一起工作,并且需要快速迭代UI,你可以通过学习jquery/编写直接的HTML来节省时间,或者查看react/angular。
For me the biggest shortcoming of JSF is poor support for programmatically (dynamically) generated pages.
If you want to construct your page (create page component model) dynamically from java code. For example if you are working on WYSIWYG web page constructor. Adequate documentation of this use case in not generally available. There are many points where you have to experiment and development is quiet slow. Many things just don't work how you would expect. But generally its possible hack it somehow.
Good thing is that it's not problem in philosophy or architecture of JSF. It's simply not elaborated enough (as far as I know).
JSF 2带来了组合组件,这将使组件开发变得容易,但是它们对动态(编程式)构造的支持非常差。如果你克服了动态组合组件构造的复杂且几乎没有文档的过程,你会发现如果你把几个组合组件嵌套得稍微深一点,它们就会停止工作,抛出一些异常。
但是JSF社区似乎意识到了这个缺点。你可以从这两个bug中看到,他们正在研究这个
http://java.net/jira/browse/JAVASERVERFACES-1309
http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-599
至少在谈论规范时,JSF 2.2的情况会更好。
在使用JSF工作了5年之后,我认为我可以添加我的2分。
Two major JSF drawbacks:
Big learning curve. JSF is complex, that's just true.
Its component nature. Component-based framework tries to hide the true nature of the Web, which comes with a huge amount of complications and disasters (like not supporting GET in JSF within almost 5 years).
IMHO hiding HTTP Request/Response from the developer is an enormous mistake. From my experience, every component-based framework adds abstraction to the Web development, and that abstraction results in unnecessary overhead and higher complexity.
And minor drawbacks that come to my mind:
By default ID of the object is composed of its parents' ids, for example form1:button1.
No easy way to comment-out incorrect page's fragment. Tag <ui:remove> needs syntactically correct content which is parsed anyway.
Low quality 3rd party components which e.g. don't check isRendered() inside processXxx() method before continuing.
Incorporating LESS & Sencha is hard.
Doesn't play well with REST.
Not so easy for UX designers, because ready-to-use components have their own CSS styles, that need to be overwritten.
不要误会我的意思。作为一个组件框架,JSF在版本2中确实很好,但它仍然是基于组件的,而且永远是……
请看看Tapestry、Wicket的低人气以及有经验的JSF开发人员的低热情(这是更有意义的)。
作为对比,看看Rails、Grails、Django、Play!框架——它们都是基于动作的,不会试图向程序员隐藏真实的请求/响应和web的无状态特性。
对我来说,这是JSF的主要缺点。恕我直言,JSF可以适合某些类型的应用程序(内部网、表单密集型),但对于现实生活中的web应用程序来说,它不是一个好方法。
希望它能帮助一些人做出关于前端的选择。