angular java_Angular JS的Java起源:Angular vs JSF vs GWT

angular java

超级英雄的Javascript框架需要一个良好的起源故事。 让我们尝试将其修补在一起,同时介绍在企业Java世界中使用Angular JS以及Angular在MVC上的应用。

这篇文章将讨论以下主题,并以一个示例结尾:

  • Angular JS的Java起源
  • Angular vs JSF
  • Angular vs GWT
  • Angular vs jQuery
  • MVC(或MVW)的角度分析
  • MVC中的M –范围
  • MVC中的V –指令
  • MVC中的C –控制器

Angular JS的起源

Angular正在成为在企业环境中开发Web应用程序的首选框架,传统上,后端是用Java构建的,而前端则是基于Java / XML的框架(如JSF或GWT)构建的。

随着Java开发人员经常生活在Spring / Hibernate世界中,我们可能想知道基于依赖注入,基于脏检查的MVC框架如何设法从服务器跳转到我们的浏览器,并发现这是一个有趣的巧合。

角背后的故事

事实证明,相似之处并非巧合,因为Angular的根源是Google的Java开发人员开发的,他们认为使用Java(特别是GWT)构建前端应用程序的效率不高。

这些是Angular开发人员关于Angular起源的一些重要报价,最近在Javascript Jabber Podcast上此处的脚本链接):

我们在GWT上构建了一些东西,而我的工作效率却变得非常沮丧。

我们可以比在GWT中构建应用程序(Google反馈)快得多。

因此,这意味着Angular由全职的Java GWT开发人员有效地创建,以回应他们对Java框架限制前端开发生产力的看法。

JSF还是GWT还是要走的路?

尽管使用两种截然不同的方法,但是JSF和GWT的主要目标之一是通过允许在Java / XML世界中完成Web开发来抽象至少一部分Web。

但是似乎在当今HTML5浏览器中,像JSF / GWT这样的框架比它们最初试图抽象的基础平台要复杂得多。

尽管可以使它们正常工作,但问题是:以什么代价?

底层的浏览器技术通常会泄漏给开发人员,最终最终无论如何都必须了解HTML,CSS和Javascript,才能实现许多现实世界的要求。

这使开发人员想知道为什么没有这么多的约束和抽象的中间层就不能直接使用浏览器技术,因为最后实际上并没有摆脱它们的麻烦。

实际上,浏览器技术比任何Java框架都更简单,更广泛且文档更丰富。

JSF和GWT的历史背景

首先必须意识到JSF / GWT是如何诞生的:创建它们是为了在已经存在以Java / XML内置企业后端的场景中使用,并且需要重用同一组企业开发人员来构建也是前端。

从项目管理的角度来看,乍看起来直到今天仍然有意义。

同样从历史角度来看,JSF / GWT是在上下文中创建的,该上下文中的浏览器是一个比今天更加古怪的平台,并且可用的开发人员工具更少。

因此,该框架的目标是至少抽象一些浏览器技术,以使其能够被更多的开发人员使用。

Angular vs JSF

十年前,在Ajax出现在Web开发领域的同时,JSF或多或少地出现了。 JSF的最初版本并不是在考虑Ajax的情况下设计的,而是作为一个完整的页面请求/响应模型来使用的。

在此模型中,内存中存在代表用户界面的类似于DOM的组件树,但该树仅存在于服务器端。

然后,服务器View会来回转换为HTML,CSS和Javascript,将浏览器主要视为呈现平台,没有状态且对所发生的事情的控制有限。

在将页面发送给用户之前,通过一组称为Renderers的特殊类将服务器的View表示形式转换为HTML,CSS和Javascript来生成页面。

JSF如何工作?

然后,用户将与页面进行交互并通常通过HTTP POST发送回一个动作,然后通过JSF Controller触发服务器端生命周期,该生命周期将还原视图树,将新值应用于视图并验证它们,然后进行更新域模型,调用业务逻辑并提供新视图。

然后,该框架在JSF 2中进行了演变,以支持本机Ajax和无状态Web开发,但是仍然可以从服务器端模型在浏览器中生成HTML的主要方法。

Angular与JSF相比如何

主要的设计差异是在Angular中,模型,视图和控制器从服务器移至浏览器本身。

在Angular中,不应将浏览器技术视为要避免或隐藏的东西,而是要在其全部功能范围内使用的东西,以构建更类似于Swing胖客户端而不是网页的东西。

Angular并没有强制要求这样做,但是服务器通常只有很少甚至没有状态,并且主要通过REST服务提供JSON。

Javascript在JSF中有多重要?

JSF对Javascript的采用似乎是该语言是JSF库开发人员需要知道的,但通常不是应用程序开发人员。

最广泛的JSF库Primefaces内部包含数千行Javascript代码,这是基于jQuery的前端小部件的,但是基于Primefaces的项目在应用程序代码本身上通常很少甚至没有Javascript。

尽管如此,为了在Primefaces中进行自定义组件开发,了解Javascript和jQuery很重要,但是通常只有一小部分应用程序团队需要了解它。

Angular vs GWT

随着GWT的到来,第二代在浏览器上进行Java Web开发。 在GWT中,模型,视图和控制器也被移动到浏览器中,就像在Angular中一样。

主要区别在于处理Javascript的方式:GWT提供了Java到Javascript编译器,将Javascript视为客户端字节码执行引擎。

在此模型中,开发完全是用Java进行的,并且通过构建过程将代码编译为Javascript并在浏览器中执行。

GWT采用HTML和CSS

在GWT中,尽管向用户提供了XML名称空间以布局至少一些页面主要块,但HTML和CSS并不意味着对开发人员完全隐藏。

当达到表单级别时,将提供一个HtmlPanel ,以允许直接用HTML和CSS构建页面。 在JSF中,这也是可行的,尽管在这两种框架中,通常开发人员都试图通过最大程度地使用XML名称空间来避免使用HTML和CSS。

为什么要使用Javascript进行翻译?

GWT在某些方面与Angular并没有太大不同:它是浏览器中的MVC,其中Javascript是一种翻译目标,而不是应用程序开发语言。

这种移植的主要目标是再次使用同样构建后端的同一开发人员团队,并抽象化浏览器怪癖。

GWT面向对象的方法有帮助吗?

GWT编程模型意味着从面向对象的角度查看网页:在程序中,该页面被视为互连对象而不是文档的网络。

文档和元素的概念被框架隐藏了,但是事实证明,这种额外的间接访问级别虽然很熟悉,但最终没有那么有用,并且比其他任何东西都更容易妨碍开发人员。

是否需要额外的抽象层?

事实是,页面和元素的概念已经足够简单和强大,因此它们不需要多余的抽象层。

通过页面的面向对象抽象,开发人员通常不得不通过无数类来调试它,以进行简单的事情,例如查找在何处添加或删除简单CSS类或将元素包装在div中。

Super Dev Mode可以提供帮助,但感觉像对象的整个GWT层次结构,Java到Javascript编译器以及几种调试模式以及浏览器和IDE插件生态系统都比最初要隐藏的东西要复杂得多。 :网络。

Angular vs jQuery

同时,在Javascript领域中,同时出现了一种解决浏览器差异的新方法:可以创建Javascript库的想法,该库提供了一个适用于所有浏览器的通用API。

该库将在运行时检测浏览器并在内部调整所使用的代码,以便在所有浏览器中都可以得到相同的结果。

由于该库不需要浏览器的怪癖知识,因此使用起来会简单得多,并且可以吸引更广泛的开发基础。

在这些库中,最成功的是jQuery,它主要是页面处理库,但这并不意味着它是MVC框架。

Java世界中的jQuery

jQuery仍然是最受欢迎的JSF框架的客户端基础:Primefaces。 Angular和jQuery之间的主要区别在于jQuery中没有Model或Controller的概念,而是直接对文档进行操作。

如果使用jQuery,则会编写很多类似的代码(例如Primefaces Javascript autocomplete小部件中的示例):

this.itemtip = $('<div id="' + this.id + 
'_itemtip" class="ui-autocomplete-itemtip 
ui-state-highlight ui-widget 
ui-corner-all ui-shadow"></div>')
.appendTo(document.body);

如我们所见,Primefaces开发人员本身需要了解HTML,CSS和Javascript,尽管许多应用程序开发人员都使用提供的XML标记来包装前端小部件,并将其视为黑盒。

这种类型的代码使人想起最初使用Java开发编写的代码,当时Servlet API出现了,但还没有任何JSP:

out.println(" " + message + "");

Angular允许的是将模型与视图分离,然后将两者与控制器松散地粘合在一起。

Angular JS采用MVC(或MVW)

Angular将自己定位为MVW框架-模型,视图,任意。 这意味着它承认模型的明确分离,该模型可以是特定于View的模型,而不必是域模型。

在Angular中,模型只是POJO –普通的旧Javascript对象。

Angular还承认存在View,该View以声明方式绑定到Model。 该视图只是HTML,带有用于模型和用户交互绑定的某些特殊表达语言,以及称为指令的可重用组件构建机制。

它还承认需要将模型和视图粘合在一起,但是它确实将此元素命名为“ Wathever”。 在MVC中,此元素是Controller,在MVP中是Presenter,等等。

最小角度示例

让我们看一下MVC的三个元素,并通过使用一个最小的交互式乘法示例来查看它们在Angular中的对应关系,这里它在jsFiddle中运行

如您所见,一旦两个因素发生变化,结果就会立即更新。 在诸如JSF或GWT之类的系统中执行此操作将需要大量工作。

在JSF和GWT中看起来像什么?

在JSF中,例如在Primefaces中,这意味着必须编写一个小的jQuery插件或例程来添加交互式乘法功能,创建facelet模板,声明facelet标签并将其添加到标签库中,等等。

在GWT中,这将意味着引导示例应用程序,创建UI绑定程序模板,向这两个字段添加侦听器或设置编辑器框架等。

增强开发人员的生产力

我们可以看到Angular JS开发人员提高生产力的意义,因为完整的Angular版本如下,只需几分钟即可编写:

<div ng-app="Calculator" ng-controller="CalculatorCtrl">
    <input type="text" ng-model="model.left"> * 
    <input type="text" ng-model="model.right"> = 
    <span>{{multiply()}}</span>
</div>
 
angular.module('Calculator', [])
    .controller('CalculatorCtrl', function($scope) {
        $scope.model = {
            left: 10,
            right: 10
        };
 
        $scope.multiply = function() {
            return $scope.model.left * 
                    $scope.model.right;
        }
    });

因此,让我们从M开始研究此示例代码的MVC设置。

MVC中的M –角度范围

Angular中的模型只是一个简单的Javascript对象。 这是模型对象,被注入到范围内:

$scope.model = {
    left: 10,
    right: 10
};

将模型注入到合并范围中会对其进行脏检查,以便将模型中的任何更改立即反映回视图。 在上面的示例中,编辑因子输入框会触发脏检查,从而触发乘法的重新计算,并立即反映在结果中。

MVC中的V –增强HTML

Angular中的视图只是用特殊的表达式语言(例如multiply()字段的定义multiply()注释HTML。 在这种情况下,HTML实际上充当客户端模板,可以拆分为可重用HTML组件,称为“指令”。

MVC中的C –角度控制器

CalculatorCtrl是示例应用程序的控制器。 它在渲染视图之前初始化模型,并通过定义乘法函数充当视图和模型之间的粘合剂。

控制器通常在模型上定义触发事件驱动代码的观察者。

结论

看来,用Java和Javascript进行多语种开发对于企业开发的未来是一个可行的选择,而Angular是关于如何构建企业应用程序的主要观点。

它带来的简单性和开发速度对前端Java开发人员具有吸引力,无论如何,前端Java开发人员在某种程度上已经需要处理HTML,CSS和通常的Javascript。

因此,一个有吸引力的选择似乎是,一部分企业应用程序代码将开始使用Angular而不是Java用Javascript编写,但是只有未来几年才能证明这一点。

使用Angular的另一种方式

另一种可能性是,Angular被诸如JSF之类的框架内部使用,作为内部实现机制。

例如,见这个职位从Primefaces项目的领导:

我已经计划添加内置的js mvc框架支持,可能会有些角。

因此,有可能将Angular用作技术的实现机制,这些技术将遵循使应用程序开发人员的体验尽可能保持基于Java和XML的方式。

似乎可以肯定的是,作为应用程序MVC框架或基于Java / XML框架的内部细节的Angular似乎很慢,但可以肯定地使其进入企业Java世界。

相关链接:

Angular的一个很棒的在线资源: egghead.io Angular课 ,一系列由John Lindquist( @johnlindquist )进行的最少5分钟的视频讲座。

翻译自: https://www.javacodegeeks.com/2014/07/the-java-origins-of-angular-js-angular-vs-jsf-vs-gwt.html

angular java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值