现实生活中的应用程序中的Java Server Faces


JavaServer Faces(JSF)是用于在Java Enterprise Edition平台(JavaEE)中构建基于Web的应用程序的当前前端技术。

在本文中,我们将讨论在构建可用于生产环境的JSF应用程序时应考虑的要求和建议,包括开发环境的设置和准备,原型和设计,开发和故障排除以及性能调整。

一,背景 在1998年以及Java EE(J2EE)的早期阶段,Sun Microsystems实施了对Web应用程序的第一个支持,即Java Servlets。Servlet是围绕处理HTTP请求和使用Java类在服务器端生成动态HTML内容的概念设计的。

与当时的可用技术(例如CGI,Perl,PHP和ASP)相比,Java Servlet是一种非常干净的方法。尽管它广受欢迎,但是对于大多数Web应用程序来说,当在Java类内部生成相对较大的HTML标记的需求变得迫切时,它已开始变得不切实际。

这导致在1999年创建了一种新的标准技术JavaServer Pages(JSP),该技术颠倒了在Java类内部生成动态HTML标记的概念,改为使用scriptlet在HTML页面内部编写Java代码。

JSP和Servlet在一起已有一段时间了,它们已经在所有级别的应用程序中狂野地实现了。大多数应用程序的设计都使Servlet用于业务逻辑,而JSP用于动态视图处理。这是基于“模型-视图-控制器”(MVC)设计模式的。

但是,在此类应用程序中,存在许多耗时且由应用程序开发人员手动处理的技术要求,例如:MVC,绑定(即,将用户界面输入组件链接到服务器端字段),输入验证,模板(即UI设计布局和视图的封装),页面导航和工作流,复合UI组件等。这导致了许多框架和API由3创建第三政党组织,社区和供应商来解决这些问题。最受欢迎的是:Apache Struts,Tiles,Tapestry和Spring MVC。

2004年,Sun决定从头开始采用一种新的Web技术,以包括大多数Web应用程序必需的所有必需功能,以及基于组件和事件驱动的Web应用程序的现代化概念,并且是JSF 1.0,然后是2006年的1.1和1.2。

由于缺乏成熟度,IDE集成和社区支持以及严重的性能和安全性问题,因此JSF 1.2的实现速度没有其前代产品(JSP和Servlets)快。

后来,在2009年,JSF 2.0包含许多新特性和增强功能,包括宣布的Facelets(3宣布第三作为一个模板引擎党雅各Hookom在2005年展开图的语言),并在JSP,AJAX支持默认的视图声明语言,GET请求支持等。后来,JSF 2.1发行了。当前,最新的可用版本是2.2,自2013年以来已发布。

二。现实应用程序中的JavaServer Faces 从一开始就设计JSF时就考虑了快速应用程序开发(RAD)。它具有良好的社会支持,以及3个的一大套房RD第三方组件(例如,PrimeFaces)。但是,在基于标准软件开发生命周期(SDLC)的所有阶段中,构建基于JSF的应用程序仍涉及许多详细任务。有些任务已经包含在JSF标准执行,而其他由3支持第三党。这些分类如下:

  1. 项目准备和环境设置。
  2. 页面原型和设计。
  3. 开发调试。
  4. 性能调优。

尽管安全性是一个非常重要的主题,但是我们决定不将其包含在本文中,因为它涉及许多标准,规范和技术(例如Servlet Spec。JAAS,OWASP和Spring Security),而这些标准,规范和技术均与安全性没有直接关系。 JSF。我们可能会在以后的文章中更详细地讨论安全性方面。

1)项目准备和环境设置 创建新的JSF应用程序时,需要许多配置,库和设置,其中包括:

  1. JSF库(即API和实现)仅在编译期间存在,因为它已与任何符合Java EE的应用服务器捆绑在一起。但是,像Jetty和Tomcat这样的Servlets容器不是这种情况,在这些容器中,JSF库应该捆绑在项目类路径中,这又会引起可移植性问题。
  2. WEB-INF文件夹中存在web.xml(尽管自2009年servlets 3.0规范以来它已成为可选)。

  3. Web.xml必须包含以下配置:

  4. JSF Servlet。
  5. 映射JSF页面。
  6. 对servlet进行编码以解决编码问题(在Tomcat和Jetty的情况下)。
  7. 设置项目模式。
  8. 将“ JSF时区”设置为系统时区。
  9. 通过设置兼容模式来处理视图过期的异常。
  10. Beans.xml必须添加CDI支持,并且在servlet容器的情况下,必须将CDI API和实现(焊接)添加到项目类路径中。

2)页面原型和设计 过去,创建应用程序原型是一项简单的任务,可以由业务分析师(BA)使用任何建模工具(例如Microsoft Visio)完成,因为传统台式机和老式Web应用程序的设计期望并不高。但是,随着网页设计和用户体验的新趋势(包括响应式,轻型,扁平和地铁设计)的出现,这种情况已发生了巨大变化。由于用户界面设计已成为许多软件项目中授予标准的主要因素之一,因此这种趋势导致需要在项目的早期阶段甚至有时在授予之前就构建完整的应用程序原型。

在JSF应用程序中,可以使用以下三个选项之一来完成此操作:

  1. 纯JSF组件和主题:这被认为是实现原型的最简单方法。但是,这种方法限制了JSF开发人员完全依赖于当前可用的组件和主题,与HTML5现代主题相比,这些组件和主题的选项受到限制并且被认为是重量级的,并且缺乏新趋势的支持。而且,由于Java开发人员的人工成本比Web设计人员的成本高,因此这将导致项目成本增加。此外,这将使应用程序与组件库高度耦合,这将导致高昂的维护成本(即PrimeFaces对话框组件在4.0和5之间进行更改)。这也将使替换另一个组件成为一个巨大的挑战,

  2. 具有Web设计者定制支持的纯JSF组件: 尽管在设计中可以使用一些次要的自定义选项可能会很好,但是在这种情况下,网页设计人员的参与不会有太大帮助,这是许多挑战的原因。首先,自定义主题并覆盖其样式不是很灵活,这也不是一件容易的事。其次,这是一个非常耗时的过程,无法保证结果。第三,显然缺少支持这种定制的设计工具,这是使该选项对设计人员不推荐和不友好的主要因素之一。使用Facelets作为声明语言将无法解决问题,因为将JSF组件用于所有内容仍然会从标准JSF语法中产生相同的输出,并且它们与组件的耦合仍然很高。

  3. 纯HTML 5: 这将是对应用程序进行原型设计的最经济有效的方法。使用纯HTML5,我们可以更快地获得结果。此外,可以使用可用的设计框架和库(例如Bootstrap)轻松完成现代设计。应用现成的网页设计模板也是可能且实用的。在这种方法中,HTML5将用于整个设计,而JSF组件将仅用于绑定输入组件。

3)开发与调试 JSF的设计旨在包括现代Web应用程序以实现RAD方法所需的许多技术要求,其中包括:

  1. 通过视图和托管Bean的模型视图控制器(MVC)。
  2. 使用表达式语言(EL)在用户界面组件和服务器端对应组件之间自动绑定。
  3. 内置模板引擎(Facelets)
  4. 导航和工作流程管理(Navigation rules)
  5. 现成的用户界面组件。
  6. 输入字段的内置验证(Validators)
  7. 数据类型的内置转换(Converters)
  8. 透明的AJAX支持 尽管JSF是建立在较高的抽象水平和花哨的功能列表上的,这些功能从理论上讲将减少开发时间,但它的代价是昂贵的:调试,故障排除和性能,尤其是缺少工具和IDE的支持。

这主要是由两个原因引起的:(1)复杂的Web应用程序的客户端代码的复杂性(大多数现代Web应用程序就是这种情况),以及(2)JSF规范和实现的局限性,这将在后面的第11页中讨论。这个文件。

尽管JSF自2004年以来就已经可用,但是它仍然缺少许多技术功能和特性,这使得构建和调试JSF应用程序成为一个巨大的挑战。一些挑战包括:

  1. 使用<head>标记而不是<h:head>引起的设计问题
  2. 如果没有被<h:f​​orm>标记包围,则命令的无作用
  3. 缺少AJAX请求的异常处理。
  4. 列表数据类型的转换器。
  5. 视图过期异常的处理
  6. 在包含文件和复合组件内部使用<html>标记进行定义,这可能会导致非标准的HTML DOM结构。
  7. 复杂CSS文件中的资源参考(例如,在CSS资源中定义新的字体样式)
  8. 使用Java类构建复合组件的复杂性(Facelets在构建复合组件方面做得很好;但是,需要使用Java类创建它才能使用面向对象的方法创建参数化和自定义的复合组件)。 为了克服这些问题,许多JSF开发人员不得不使用3级党的解决方案和解决方法(例如,全方位面)。但是,使用非标准库和API会导致严重的可维护性问题(例如,从Omnifaces版本1.x升级到2.x以使CDI成为必需的依赖项)。

4)性能调优 JSF具有一些可用于性能调优的配置,包括刷新周期和项目阶段上下文参数,但是如上所述,尽管JSF的设计是基于较高的抽象级别和众多精美功能,但它包括许多功能。严重的性能问题,包括:

在JSF组件树中包括所有静态资源(图像,CSS和JavaScript)的开销。 缺少应保留一段时间的用户界面资源的标准和透明缓存功能,并且避免对组件树中的每个请求(例如动态页面页眉,动态页脚和动态菜单)在JSF树中进行处理。 三,推荐建议 为了实现使JSF技术成为针对不同级别的应用程序的基于Web的应用程序开发的选择的目标,我们建议对JSF进行以下增强:

  1. 将JSF API和实现包括在Servlet容器规范中,以实现更好的可移植性。
  2. 实现JSF应用程序的“零配置”概念
  3. 通过在视图中的标签和实际组件之间创建一种新的映射方法,减少应用程序和实际JSF UI组件之间的耦合,应将其创建到JSF组件树中。这还将解决不带h前缀的视图中的head和body标签的问题。
  4. 缺省情况下,应限制对JSF视图页面的直接访问,以避免将JSF源代码公开给客户端。
  5. 图片,CSS和JavaScript资源的使用应通过标准HTML标签(而非服务器端)完成。但是,上下文路径问题应该由框架透明地处理。
  6. 名称空间定义应在服务器端动态处理,无需在每个页面上重复它。
  7. Servlet的默认编码应为UTF-8。
  8. 创建一个更好的机制来更好地进行JSF分析(开发,测试或生产),而无需编辑web.xml,因为在大多数情况下,它会被滥用并且变得难以维护。
  9. 并且应该使用所见即所得方法(例如.NET和Visual-Studio方法)开发IDE支持。 另外,在使用哪些已经被一些3做过三次方(例如OmniFaces和PrimeFaces)将增加一个很大的值(例如高速缓存,转换器和异常处理)。

IV。Smart-Web 基于上述约束,局限性以及从针对具有不同可伸缩性级别(例如,小型,中型和企业级)的不同领域(例如政府,银行和教育)构建JSF项目中学到的经验教训,我开始了Smart-Web(开放式)源项目,其中包含上述大多数建议。 https://www.smart-api.com/frameworks/smart-eis1/jk-faces/

结论 尽管JSF已经实现开发用于构建企业级Web应用程序的快速应用程序的目标已经有10多年了,但是从分析到开发的整个软件项目阶段,开发人员都需要面对许多复杂的步骤和约束。最终的实现。其中一些问题是由第三方库处理的,有些是在应用程序级别处理的,还有一些仍未解决。

我们已经提出了一些新特性和动作,这些特性和动作将在JSF的未来发行版中加以考虑。


原文链接:http://codingdict.com