你还在疯狂地使用JSF吗?
Java-Server-Faces是一种被许多人低估的网络技术。这是为什么呢?如果你还在使用JSF,你真的是疯了吗?
JSF是 Java-Server-Faces的缩写 *,*它是一种被很多人低估的网络技术。我想知道这到底是为什么。如果你还在使用JSF,你是不是真的疯了?我不这么认为,我将分享我的一些想法。
规范
首先,JSF是一个规范,与JSF通常被比较的所有其他技术相比,这是一个重要的优势。该规范是一个开放的过程,多年来伴随着许多开发人员,为网络应用程序定义了一个通用的坚实标准。这个规范过程最近在Eclipse基金会中进行,它制定了遵循非常高质量标准的规则。这是最大的优势之一,因为它保证了你的Web应用程序是建立在一个坚实的核心之上。当然,其他网络框架也有庞大的社区,但往往是由一家公司代表,并不总是考虑到开发者的利益。谷歌的Angular只是一个例子。
基于服务器的框架
但是回到JSF。为什么JSF有时被嘲笑为过时的技术?我个人在2001年开始使用JSF的早期阶段。所以它显然是一个老技术。而且我也是一个老的开发者;-)。在此期间,许多其他的网络框架已经发展起来。它们中的许多都是基于JavaScript的,并遵循在浏览器中运行的单页范式(SPA)。其想法是将应用逻辑移到浏览器中,以使应用更快。这个想法是在不是每个人都对JSF感到满意的时候出现的,而JavaScript则是在这个时候兴起的。Java Server Faces--顾名思义--相反,是一个基于服务器的框架。这意味着应用逻辑是在服务器上执行的。而这也是我们有很大区别的地方。在当时,减少服务器上的负载是一个有效的论点。当然,这在今天也应该是一个理想的目标。但是用这个作为反对JSF的论据的人,往往也是那些对无服务器功能大加赞赏的人。因此,我认为我们今天不应该把基于服务器的框架视为一个愚蠢的想法。
自成一体的微服务
基于服务器的网络框架具有一些优势。通过这种方式,应用逻辑和业务逻辑可以轻松耦合。这在Jakarta EE内实现,主要通过CDI、EJB和JPA。这些技术是JSF组件的后端。Jakarta EE对层的分离提供了非常清晰的理解,JSF无缝地适合这个概念。服务器端的实现也对客户端隐藏了应用细节。相比之下,在JavaScript SPA中,应用逻辑的大部分在浏览器中通常不受保护,这在某些情况下会有安全风险。
因此,在服务器端渲染应用逻辑使负责后端和前端部分的开发者更容易。这导致了一个事实,即在许多情况下可以更快地开发应用程序。从微服务架构的角度来看,JSF应用程序符合自包含服务的原则。这是一种在微服务架构中常用的模式。
简单性
由于JSF经常被称为复杂和笨拙,我最近想知道这是否是真的。我将我的一个Vue.js SPA迁移到JSF 4.0,并比较了所产生的代码的复杂性。所以最后,我想用一个例子来说明JSF的简单性。(注意:我在这里并没有将JavaScript代码与Java进行比较)
在JavaScript框架中,你通常通过附加标签将你的HTML标签与一些代码绑定:
<!-- Vue.js -->
<input type="text"
name="userwebsite"
v-model="userwebsite"
placeholder="enter your website">
Your Website is: <span>{{api}}</span>
SPA框架会解析标签(v-model)并从你用JavaScript编写的模型中放置正确的值。它还绑定了输入字段以跟踪你的模型的变化。
JSF的对应部分看起来没有什么不同:
<!-- JSF -->
<h:inputText value="#{userController.website}"
pt:placeholder="enter your website" />
Your Website is: <h:outputText value="#{userController.website}" />
在这里,你也将你的模型值绑定到输入字段或输出文本。但是代码在服务器端是用Java执行的,这通常等于你的后端代码是用Java写的,对于SPA也是如此。
Ajax是由JavaScript Web框架开箱即用的。所以你通常不需要关心它。在上面的例子中,当输入的值发生变化时,span,a标签会自动更新。
在JSF中,你也使用Ajax,但你对它的行为方式有更多控制。你可以简单地用f:ajax标签包围你的页面的一部分来获得同样的行为:
<!-- JSF -->
<f:ajax>
<h:inputText value="#{userController.website}"
pt:placeholder="enter your website" />
Your Website is: <h:outputText value="#{userController.website}" />
<f:ajax>
另一个例子是链接。在一个JavaScript框架中,当用户点击一个元素时,你再次使用一种标签来启动渲染生命周期:
<!-- Vue.js -->
<li class="nav-item" v-on:click="showSection('search')">
<label>Search</label>
</li>
showSection ,在你的JavaScript代码中实现一些业务逻辑,负责处理数据和改变布局。
JSF也没有什么不同:
<!-- JSF -->
<li class="nav-item">
<h:link outcome="search" >
<label>Search</label>
</li>
h:link 标签从后端加载一个名为'search.xhtml'的新页面,其中包含新的布局。所有的模型绑定都是在后台处理的。对于用户来说,行为上没有任何区别。
所以你可以从标记中看到,并没有太大的区别,编写JSF前端并不像基于JavaScript的Web框架那样复杂。
我个人的结论是,JSF给了我一个更清晰、更一致的概念,让我在一个框架内编写代码。后台逻辑和应用程序设计结合在一起,形成了一种模式,也被称为独立的微服务。
对我来说,即使对现代网络应用来说,这也是一个有效的概念。而在服务器端计算应用逻辑,一点也不疯狂。
有了JSF 4.0版本,你会发现一个现代的、精心设计的Web技术被嵌入到最新的Jakarta EE 10框架中。