为什么应该避免JSF

长期以来,对我来说,JSF只是另一个我不太在乎的Web框架。 这改变了。 在被迫使用了几个月之后,我认为在几乎所有情况下,这都是重大的项目风险。 在这里,我提出此判决的理由。

UI和处理逻辑的纠缠不清。 官方教程声称以下有关JSF的好处 :

Java Server Faces技术的最大优点之一是,它为Web应用程序的行为和表示提供了清晰的分隔。

情况恰恰相反。 Facelets是JSF的首选呈现技术,乍一看就像普通的模板技术一样,例如老式的JSP或Thyme Leaf 。 但是,如果您近距离看,恐惧会变得很明显。 在构造HTML的同一位置,您还将逻辑放置在操作上应更新UI的哪些部分。 我的书中明显违反关注点分离原则。

更好的是, 立即属性可以改变服务器端的生命周期! 如果这还不够,则可以根据使用的标签以不同的方式进行处理。 你不能做这样的事情。

它尝试抽象您不能抽象的内容。 除了一些奇怪的情况,Web应用程序的客户端和服务器位于相当不同的计算机上,并通过某种网络分隔开来。 由此得出一个简单的事实:客户端与服务器之间的通信缓慢且不可靠。 JSF试图抽象化客户端和服务器的分离。 它以难以控制的方式处理后端上的所有内容,从而在客户端和服务器之间进行疯狂的通信。 结果是,由于使用了JSF,各种故障场景都将突然出现。 对我来说,最烦人的就是这个:如果您打开一个JSF页面,比方说一个简单的搜索页面,等待一个小时,然后单击“提交”按钮,您将得到一个异常,因为服务器端状态已过期。 WAT? 为什么琐碎的搜索页面的服务器状态没有任何意义? (是的,我知道您可以使用最新版本的JSF更改该行为,但是它仍然是JSF设计的工作方式。)尽管从EJB开始,每个人都学到了以下知识:如果您想对事实进行抽象,如果应用程序有两个部分,是否在同一台计算机上运行,​​您必须假设它们不在同一台计算机上。 其他所有问题都隐藏了问题,直到问题变得如此之大,以至于您可以在早餐中吃掉您的项目。

使事情变得复杂和复杂,从一开始就很容易。 万维网的体系结构很简单 。 简单含义:它由一小部分概念组成,且交互作用有限。 这就是它取得如此广泛成功的原因。 对于初学者来说,如何使用它来实现某些功能也不是一件容易的事。 我相信我们大多数人都记得他们第一次尝试在没有会话状态的情况下实现购物车之类的东西。 但是几乎所有这些问题的解决方案都是众所周知的,也是众所周知的。 您所需要的只是一点阅读,而您所获得的是对如何解决此类问题的深刻概念理解。 同样,基础非常简单:您将请求发送到URL,并使用HTTP动词发送一些标头和内容。 然后您用一些包含链接和一些标题的资源进行回复。 而且您在服务器会话中没有状态。 使负载平衡和故障转移变得相当简单。 使可添加书签的网址变得无关紧要。 使您的网站可零成本搜索。 使网站易于访问。 允许用户根据需要使用其后退按钮,历史记录和标签。 拥有精美的URL变得微不足道

将其与JSF的生命周期模型进行比较:用户提交请求的页面将与服务器端的模型同步,然后验证,转换,生成和处理提交的值。 如上所述,事物发生的顺序,如果发生的话,则完全由隐藏在伪装为标记的文档中的XML标签控制。 除了几乎没有人正确理解所有这些内容( BalusC似乎是唯一的可用于Interweb的语言 )之外,它还对您的应用程序产生以下影响:URL变得丑陋。 您将看到源资源的URL,而不是您正在查看的资源的URL,因此使这些URL像在膝盖上的门把手一样有用。 与缓存,故障转移,负载平衡等相同。

当然,您可以在这里使用一些约定以及那里的其他库来修复它。 当然,当您从事物品破碎业务时,哪种方案才是最合理的选择,所以人们必须为修理它而付费。 我个人更喜欢帮助解决实际问题。

阻碍可测试性:我不能说大多数框架,但可以将Spring MVC与JSF进行比较。 让我告诉你这一点:如果有人告诉你JSF可以很好地测试,那么他可能不知道自动测试。 使用JSF,您可以使用单元测试来测试后端bean。 您可以通过将应用程序部署到服务器上并使用Selenium来测试整个UI。 基本上就是这样。

以防万一您想知道还有什么可以测试:在浏览器中加载页面的静态版本并使用硒进行测试,以便测试客户端UI行为。 测试您生成的标记,而无需启动功能完备的应用程序服务器。 测试属性/参数到bean方法的映射。 在不引导整个应用程序的情况下测试您生成的标记。 使用Spring MVC以及可能使用许多其他合理的服务器端框架,而使用JSF,这一切都是完全可能的。

再说一次:我知道有许多问题的修复程序,但是最简单的修复程序是> 不要使用JSF

翻译自: https://www.javacodegeeks.com/2014/11/why-you-should-avoid-jsf.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML知识点总结之img、scirpt、link标签

<img>元素 使用<img>可以在网页插入一个图片&#xff0c;但实际上<img>标签并不会在网页中直接插入图像&#xff0c;而是从网页上链接图像。 <img>的主要属性 &#xff08;1&#xff09;src属性&#xff1a;图片的路径。 &#xff08;2&#xff09;alt…

更多 Kinect for Windows 项目揭示

虽然Kinect for Windows的发布不过才过去一个月而已&#xff0c;但是到目前为止这个Xbox 360游戏设备辅助产品似乎已经赶上了一些商业企业项目了。其中包括一个让机器人自动购物车成为现实的项目。在Microsoft Power and Utilities博客 的一篇博文中&#xff0c;微软列举了一些…

CSS3的常用属性(一)

选择器 属性选择器&#xff08;通过标签属性来选择&#xff09; E[attr]&#xff1a; 表示只要元素<E>存在属性attr就能被选中 如&#xff1a; div[class]E[attrval]&#xff1a; 表示元素<E>存在属性attr的值等于val&#xff0c;即可被选中 如&#xff1a; di…

问题集锦

1、viewpager 用到了ViewPager&#xff0c;Android5.0.1&#xff0c;却额外在Build Path中引入了v4jar包&#xff0c;并且在“Order and Export”中勾选了此jar包&#xff0c;编译时出现错误&#xff1a; [2014-09-28 23:49:30 - Dex Loader] Unable to execute dex: Multiple …

ImageField,FileField上传文件命名问题

django 的models.ImageFiled,FileField有属性upload_to&#xff0c;该属性是指定将文件上传到服务器的位置&#xff0c;及存储在哪个文件夹下&#xff0c;你可以很方便甚至很少的代码就可以实现文件上传操作了。 但是默认的存储的文件名是没有改变的&#xff0c;也就是说所存储…

Spring靴子战争包装

Spring Boot建议在构建期间使用嵌入式容器&#xff08;tomcat或码头&#xff09;创建一个可执行jar&#xff0c;并在运行时将此可执行jar作为独立进程使用。 但是&#xff0c;通常将应用程序部署到外部容器上是很常见的&#xff0c;Spring Boot提供了打包应用程序的方式&#x…

递归函数

递归函数实在一个函数通过名字调用自身的情况下构成的。 1 window.onload function() {2 var a factorial;3 factorial null;4 alert(a(4));5 };6 7 /**8 * 叠乘9 * param {叠乘的基数} num n 10 * return {叠乘结果} n*(n-1)*(n-2)*...*1 11 */…

正则表达式及测试工具

1. 正则表达式 正则表达式&#xff1a;一种匹配文本中的字符序列的字符模式。在很多文本编辑器或其他工具里&#xff0c;正则表达式通常被用来检索或替换那些符合某种模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。 一个正则表达式就是由普通字符&…

CCD与CMOS摄像头的区别

首先说一下在闭路电视监控中摄像机的CCD 和CMOS 的结构&#xff0c;ADC的位置和数量是最大的不同。简单的说&#xff0c;CCD每曝光一次&#xff0c;在快门关闭后进行像素转移处理&#xff0c;将每一行中每一个像素&#xff08;pixel&#xff09;的电荷信号依序传入“缓冲器”中…

Java注释教程– ULTIMATE指南(PDF下载)

编者注&#xff1a;在本文中&#xff0c;我们提供了全面的Java注释教程。 Java中的注释是一项主要功能&#xff0c;每个Java开发人员都应该知道如何使用它们。 我们在Java Code Geeks上提供了许多教程&#xff0c;例如创建自己的Java注释 &#xff0c; 带有自定义注释的Java注…

Jquery获取DOM绑定事件

获取到当前正在执行的事件&#xff1a; $(#testDive).bind(click, function(event){alert(event: event.type)}); 获取所有绑定事件&#xff1a; $._data(document.getElementById(testDive), events); 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

laravel中的自定义函数的加载和第三方扩展库加载

一.自定义公共函数 1. 创建文件 app/Helpers/functions.php 2. 修改项目 composer.json 3.运行composer dump-auto 4.OK&#xff0c;然后你就可以在任何地方用到 app/Helpers/functions.php 中的函数了。 二.添加第三方扩展库 1.确定你要放第三方库的目录&#xff0c;比如还是刚…

Java EE 8发生了什么?

Java EE 8的工作进展顺利。 是时候赶上了&#xff01; 无需费力就可以潜入… 不要忘记Java EE 7….. 围绕三个重要主题 HTML 5对齐–用于WebSocket的Java API&#xff08;JSR 356&#xff09;&#xff0c;JSON处理&#xff08;JSR 353&#xff09;&#xff0c;JAX-RS 2.0&…

HDU 1312 Red and Black

这题就是比较水的一道搜索题了&#xff0c;BFS跟DFS都能做&#xff0c;直接看代码吧&#xff01; AC code&#xff1a; View Code 1 #include <iostream> 2 #define MAX 50 3 using namespace std; 4 int w, h; 5 char map[MAX][MAX]; 6 int dir[][2] {{0, 1}, {1, 0},…

HTML5新增属性学习笔记

1、form属性 表单内的从属元素&#xff0c;可以写在表单外部。可以通过指定元素的form属性来声明元素所属表单。form的属性值为表单的id。 1 <form id"testForm"> 2 <input type"text"> 3 </form> 4 <textarea form"testFo…

Unity3D笔记十七 Unity3D生命周期

一个游戏组件的脚本有一个生命周期——一开始实例化&#xff0c;直到结束实例被销毁。在这期间&#xff0c;他们有时候处于激活状态&#xff0c;有时候处于非激活状态&#xff1b;对于活动&#xff0c;对用户有时候可见&#xff0c;有时候不可见 本文主要讨论常见脚本的的生命周…

自适应堆大小

在改进我们的测试平台以改进Plumbr GC问题检测器的同时 &#xff0c;我最终编写了一个小型测试用例&#xff0c;我认为这对于更广泛的读者来说可能很有趣。 我追求的目标是测试JVM在eden&#xff0c;survivor和Tenured空间之间如何分割堆方面的自适应性。 测试本身正在成批生成…

.Net对SQL数据库的web备份

基于B/S模式下的&#xff0c;数据库远程备份&#xff0c;备份成功后可下载到本地 1 protected void ButtonDataBackup_Click(object sender, EventArgs e) 2 { 3 string newname "数据库名" DateTime.Now.Year.ToString() DateTime.Now.Month.ToStri…

ajax向后台传递数组

$.ajax({traditional: true//这个设置为true&#xff0c;data:{"steps":["qwe","asd","zxc"]}会转换成stepsqwe&stepsasd&... }); 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

错误笔记

1、user_name a and password b时&#xff0c;无法打印到这个节点&#xff0c;原因是 a "yajuan" b 123456时 a 为字符串类型&#xff0c;b为数字类型&#xff0c;类型不同“且”的关系不成立。导致if 节点失败 转载于:https://www.cnblogs.com/wangyajuanjuan…