JSF 2.0的缺点?老实说,除了您对基本的Web开发(HTML / CSS / JS,服务器端与客户端等)和基本Java Servlet API(请求/响应/会话)没有扎实的背景知识以外,相对的学习曲线比较陡峭,转发/重定向等),就不会出现严重的不利影响。JSF当前版本仍然需要摆脱早期获得的负面印象,在此期间存在一些严重的缺点。
JSF 1.0(2004年3月)
这是最初的版本。您不希望知道的核心和性能方面的错误使它杂乱无章。您的Web应用程序并非总是能如您所愿地工作。作为开发人员,您会大哭一场。
JSF 1.1(2004年5月)
这是错误修正版本。性能仍然没有太大提高。还有一个主要缺点:您不能完美地在JSF页面中内联HTML。所有普通的原始HTML都在 JSF组件树之前呈现。您需要将所有普通香草包装在<f:verbatim>
标签中,以便它们包含在JSF组件树中。尽管这是按照规范进行的,但这引起了很多批评。另请参见JSF / Facelets:为什么将JSF / Facelets与HTML标记混合不是一个好主意?
JSF 1.2(2006年5月)
这是Ryan Lubke领导的新JSF开发团队的第一个版本。新团队做了很多出色的工作。规格也有变化。主要变化是视图处理的改进。这不仅使JSF与JSP完全分离,因此可以使用与JSP不同的视图技术,而且还允许开发人员在JSF页面中内嵌普通的HTML,而不会产生<f:verbatim>
标签麻烦。新团队的另一个主要重点是提高绩效。在Sun JSF参考实现1.2的生命周期内(自2008年左右的build 1.2_08起,它的代号为Mojarra),几乎每个构建都在(通常)(次要)错误修复之后交付了(主要)性能改进。
JSF 1.x(包括1.2)的唯一严重缺点是在请求范围和会话范围之间缺乏范围,即所谓的对话范围。每当有人想要在后续请求中保留初始模型数据以成功处理验证,转换,模型更改和操作调用时,这迫使开发人员不得不为隐藏的输入元素,不必要的数据库查询和/或滥用会话范围而烦恼。复杂的Web应用程序。可以通过采用第三方库来减轻这种痛苦,该库在后续请求中保留了必要的数据,例如MyFaces Tomahawk <t:saveState>
组件,JBoss Seam对话范围和MyFaces Orchestra。 对话框架。
HTML / CSS纯粹主义者的另一个缺点是,JSF使用冒号:
作为ID分隔符来确保id
生成的HTML输出中HTML元素的唯一性,尤其是当组件在视图中多次重复使用(模板,迭代组件等)时。 。由于这是CSS标识符中的非法字符,因此您需要\
在CSS选择器中使用来转义冒号,从而导致外观丑陋和奇怪的选择器#formId\:fieldId {}
,甚至甚至#formId\3A fieldId {}
。另请参见如何在CSS选择器中将JSF生成的HTML元素ID与冒号“:”一起使用?但是,如果您不是纯粹主义者,则也请阅读默认情况下,JSF会生成无法使用的ID,这些ID与Web标准的CSS部分不兼容。
而且,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更优选作为视图定义语言?
在<f:ajax>
组件的风格方面引入了Ajax功能,该功能与Ajax4jsf有很多相似之处。引入了注释和约定优于配置的增强功能,以尽可能地消除详细faces-config.xml
文件。同样,默认的命名容器ID分隔符:
也可以配置,因此HTML / CSS纯粹主义者可以放心使用。所有你需要做的是将其定义为init-param
在web.xml
与名称javax.faces.SEPARATOR_CHAR
,你是不是自己使用的角色在任何地方的客户端ID的,比如和确保-
。
最后但并非最不重要的一点是,引入了一个新的范围,即视图范围。如前所述,它消除了JSF 1.x的另一个主要缺点。您只需要声明Bean @ViewScoped
即可启用对话范围,而无需花费所有方法在后续(对话)请求中保留数据。@ViewScoped
只要您随后以同步或异步方式(Ajax)提交并导航到同一视图(独立于打开的浏览器选项卡/窗口!),就可以使用Bean。另请参见托管bean中的View和Request作用域之间的区别和如何选择正确的bean作用域?
尽管实际上消除了JSF 1.x的所有缺点,但是仍有一些JSF 2.0特定的错误可能成为热门。将@ViewScoped
在标签处理失败是由于部分国家储蓄鸡-蛋的问题。此问题在JSF 2.2中已修复,在Mojarra 2.1.18中已向后移植。同样不支持传递自定义属性,例如HTML5data-xxx
。在JSF 2.2中,此问题已通过新的直通元素/属性功能修复。此外,JSF的实现Mojarra有其自身的问题。相对而言,它们中的许多都与有时不直观的行为<ui:repeat>
,新的部分状态保存实现以及Flash范围实现不佳有关。其中大多数已在Mojarra 2.2.x版本中修复。
在JSF 2.0时代左右,基于jQuery和jQuery UI引入了PrimeFaces。它成为最受欢迎的JSF组件库。
JSF 2.2(2013年5月)
随着JSF 2.2的引入,尽管从技术上讲,所有较旧的JSF版本都支持HTML5,但HTML5却被用作流行语。另请参阅JavaServer Faces 2.2和HTML5支持,为什么仍在使用XHTML。JSF 2.2最重要的新功能是对自定义组件属性的支持,从而开辟了无限可能,例如自定义无表单选按钮组。
除了特定于实现的错误和一些“烦人的小事情”(例如无法将Java注入验证器/转换器(已在JSF 2.3中修复))之外,JSF 2.2规范并没有真正的主要缺点。
基于组件的MVC与基于请求的MVC
有些人可能会选择JSF的主要缺点是,它几乎不对生成的HTML / CSS / JS进行细粒度的控制。那不是JSF自己的,仅仅是因为它是基于组件的 MVC框架,而不是基于请求(动作)的 MVC框架。如果在考虑MVC框架时对HTML / CSS / JS的高度控制是您的主要要求,那么您应该已经不是在研究基于组件的MVC框架,而是在基于请求的MVC框架(例如Spring MVC)。您只需要考虑必须自己编写所有HTML / CSS / JS样板文件。另请参见请求MVC和组件MVC之间的区别。
也可以看看: