JSF 2.0的缺点?老实说,如果你没有基本的Web开发(HTML/CSS/JS,服务器端与客户端,等等)和基本的Java Servlet API(请求/响应/会话,转发/重定向,等等)的扎实背景知识,除了相对陡峭的学习曲线,没有什么严重的缺点会出现在你的脑海中。JSF在当前的发行版中仍然需要摆脱它在早期获得的负面形象,在早期有几个严重的缺点。
JSF 1.0(2004 年 3 月)
这是最初的版本。它在核心和性能领域都充斥着你不想知道的bug。您的web应用程序并不总是像您直观地期望的那样工作。作为开发者的你会哭着跑开。
JSF 1.1(2004 年 5 月)
This was the bugfix release. The performance was still not much improved. There was also one major disadvantage: you can't inline HTML in the JSF page flawlessly. All plain vanilla HTML get rendered before the JSF component tree. You need to wrap all plain vanilla in <f:verbatim> tags so that they get included in the JSF component tree. Although this was as per the specification, this has received a lot of criticism. See also a.o. JSF/Facelets: why is it not a good idea to mix JSF/Facelets with HTML tags?
JSF 1.2 (2006 年 5 月)
This was the first release of the new JSF development team lead by Ryan Lubke. The new team did a lot of great work. There were also changes in the spec. The major change was the improvement of the view handling. This not only fully detached JSF from JSP, so one could use a different view technology than JSP, but it also allowed developers to inline plain vanilla HTML in the JSF page without hassling with <f:verbatim> tags. Another major focus of the new team was improving the performance. During the lifetime of the Sun JSF Reference Implementation 1.2 (which was codenamed Mojarra since build 1.2_08, around 2008), practically every build got shipped with (major) performance improvements next to the usual (minor) bugfixes.
The only serious disadvantage of JSF 1.x (including 1.2) is the lack of a scope in between the request and session scope, the so-called conversation scope. This forced developers to hassle with hidden input elements, unnecessary DB queries and/or abusing the session scope whenever one want to retain the initial model data in the subsequent request in order to successfully process validations, conversions, model changes and action invocations in the more complex webapplications. The pain could be softened by adopting a 3rd party library which retains the necessary data in the subsequent request like MyFaces Tomahawk <t:saveState> component, JBoss Seam conversation scope and MyFaces Orchestra conversation framework.
Another disadvantage for HTML/CSS purists is that JSF uses the colon : as ID separator character to ensure uniqueness of the HTML element id in the generated HTML output, especially when a component is reused more than once in the view (templating, iterating components, etc). Because this is an illegal character in CSS identifiers, you would need to use the \ to escape the colon in CSS selectors, resulting in ugly and odd-looking selectors like #formId\:fieldId {} or even #formId\3A fieldId {}. See also How to use JSF generated HTML element ID with colon ":" in CSS selectors? However, if you're not a purist, read also By default, JSF generates unusable ids, which are incompatible with css part of web standards.
JSF 1也是如此。x没有随Ajax工具一起发布。并不是真正的技术劣势,但由于当时的Web 2.0炒作,它变成了功能劣势。Exadel很早就引入了Ajax4jsf,经过多年的深入开发,成为JBoss RichFaces组件库的核心部分。另外一个组件库也附带了内置Ajax功能,最著名的是ICEfaces。
在JSF 1.2生命周期的一半左右,引入了一种新的基于XML的视图技术:Facelets。这在JSP之上提供了巨大的优势,特别是在模板方面。
JSF 2.0(2009 年 6 月)
这是第二个主要的发行版,Ajax是流行词汇。有很多技术和功能上的变化。JSP被Facelets取代,成为默认的视图技术,而Facelets被扩展为使用纯XML创建自定义组件(所谓的复合组件)的功能。另见为什么从JSF2.0开始,Facelets比JSP更受欢迎作为视图定义语言?
Ajax powers were introduced in flavor of the <f:ajax> component which has much similarities with Ajax4jsf. Annotations and convention-over-configuration enhancements were introduced to kill the verbose faces-config.xml file as much as possible. Also, the default naming container ID separator character : became configurable, so HTML/CSS purists could breathe relieved. All you need to do is to define it as init-param in web.xml with the name javax.faces.SEPARATOR_CHAR and ensuring that you aren't using the character yourself anywhere in client ID's, such as -.
Last but not least, a new scope was introduced, the view scope. It eliminated another major JSF 1.x disadvantage as described before. You just declare the bean @ViewScoped to enable the conversation scope without hassling all ways to retain the data in subsequent (conversational) requests. A @ViewScoped bean will live as long as you're subsequently submitting and navigating to the same view (independently of the opened browser tab/window!), either synchronously or asynchronously (Ajax). See also Difference between View and Request scope in managed beans and How to choose the right bean scope?
Although practically all disadvantages of JSF 1.x were eliminated, there are JSF 2.0 specific bugs which might become a showstopper. The @ViewScoped fails in tag handlers due to a chicken-egg issue in partial state saving. This is fixed in JSF 2.2 and backported in Mojarra 2.1.18. Also passing custom attributes like the HTML5 data-xxx is not supported. This is fixed in JSF 2.2 by new passthrough elements/attributes feature. Further the JSF implementation Mojarra has its own set of issues. Relatively a lot of them are related to the sometimes unintuitive behaviour of <ui:repeat>, the new partial state saving implementation and the poorly implemented flash scope. Most of them are fixed in a Mojarra 2.2.x version.
大约在JSF 2.0时代,引入了基于jQuery和jQuery UI的PrimeFaces。它成为了最流行的JSF组件库。
JSF 2.2(2013 年 5 月)
随着JSF 2.2的引入,HTML5成为了流行词,尽管技术上它只在所有较旧的JSF版本中得到支持。请参见JavaServer Faces 2.2和HTML5支持,为什么XHTML仍然被使用。JSF 2.2最重要的新特性是支持自定义组件属性,从而打开了一个可能性的世界,比如自定义无表单选按钮组。
除了特定于实现的错误和一些“恼人的小问题”,比如无法在验证器/转换器中注入EJB(在JSF 2.3中已经修复了),JSF 2.2规范中并没有真正的主要缺点。
基于组件的MVC vs基于请求的MVC
Some may opt that the major disadvantage of JSF is that it allows very little fine-grained control over the generated HTML/CSS/JS. That's not JSF's own, that's just because it's a component based MVC framework, not a request (action) based MVC framework. If a high degree of controlling the HTML/CSS/JS is your major requirement when considering a MVC framework, then you should already not be looking at a component based MVC framework, but at a request based MVC framework like Spring MVC. You only need to take into account that you'll have to write all that HTML/CSS/JS boilerplate yourself. See also Difference between Request MVC and Component MVC.
参见:
JSF、Servlet和JSP之间的区别是什么?(只是为了了解基础知识)
使用JSF开发无表CSS布局(关于JSF的另一个误区)
JSF vs纯HTML/CSS/JS/jQuery(当JSF是错误的选择时)
web应用程序中的设计模式(说明MVC背后的思想)