使用JSF作为Spring MVC的视图技术

新手上路,请多包涵

我目前正在实施一个小型的 Spring MVC PoC,我想使用 JSF 作为视图技术,因为我公司的大多数人都习惯了带有 Primefaces 环境的 J2EE。

Spring MVC 3 是否支持 JSF,或仅支持 JSP?我已经阅读了多篇混合两者的文章。

我的需要是创建一个吸引人的用户界面。有没有一种简单的方法可以使用 Spring MVC 和 JSP 作为视图技术来做到这一点?

我们的应用程序在多个页面中使用日程表/日历。它基本上是一个时间管理APP

原文由 Astronaut 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 762
1 个回答

你犯了一个概念上的错误。 JSF 不是一种视图技术。 JSF 是一个 MVC 框架。与 Spring MVC 完全一样,尽管它们具有不同的意识形态; JSF 是基于组件的 MVC,而 Spring MVC 是基于请求的 MVC。因此他们是完全的竞争者。你不能混合它们。你应该选择其中之一。相反,JSP 和 Facelets 是真正的视图技术。自 Java EE 6(2009 年 12 月)起,JSP 被 弃用 并被 Facelets (XHTML) 取代作为 JSF 的默认视图技术。

您可以将 Spring MVC 与 JSP 视图技术结合 使用。您还可以将 Spring MVC 与 Facelets 视图技术(以及 许多其他 技术)结合使用。但是您不能将 Spring MVC 与 JSF 组件一起使用,更不用说与像 PrimeFaces 这样的 JSF 组件库一起使用了。 JSF 输出组件可能工作,但 JSF 输入组件根本不起作用。 Spring MVC 已经有自己的 <form:xxx> 输入标签。即使您混合使用它们,您最终也会在一个混杂且混乱的代码库中获得两个框架的一半功能。这没有任何意义。如果您只想使用与 PrimeFaces 相同的 UI,只需获取 jQuery UI 即可。这也正是 PrimeFaces 在幕后使用的东西。 PrimeFaces 是一个基于 jQuery 的 JSF 组件库。

从另一方面来说,将 Spring IoC/DI 与 Spring MVC 混淆也可能很好。 Spring IoC/DI 又 可以 与 JSF 一起使用。您可以将 JSF 托管 bean 设施( @ManagedBean 和朋友)替换为 Spring 托管 bean 设施( @Component 和朋友),通常唯一的目的是为了使用 @Autowired 在 JSF 支持 bean 中。但仅此而已。 JSF MVC 框架生命周期、JSF 组件和视图技术保持不变。与此等效的标准 Java EE 将使用 CDI (和 EJB )。

同样的故事也适用于 Spring Security。您可以将它与 JSF 一起使用,但是您不应该遵循 Spring Security + Spring MVC 目标文档/示例来配置它,而只能遵循 Spring Security + JSF 的。请注意,只有当您将 JSF 托管 bean 设施替换为 Spring 托管 bean 设施时,Spring Security 对业务操作的约束才有效。因此,这仍然需要如前一段所述的“在 JSF 中集成 Spring”。与这一切等效的标准 Java EE 将通过 — 中的条目使用 容器管理的安全性(JAAS/JASPIC) — web.xml <security-constraint> 中的条目。

同样的故事也适用于 Spring WebFlow。您还只需要确保您使用的是最新版本的 Spring WebFlow,因为旧版本在与多个 JSF 组件库一起使用时会导致 冲突。此外,自 JSF 2.2 以来,新的 Faces Flows 功能作为标准 Java EE API 的一部分被引入,从而基本上使 Spring WebFlow 变得多余。

然后是 Spring Boot。这在 Java EE 中没有直接等效项。 Spring Boot 基本上使您能够使用带有 main() 方法的普通 Java 应用程序类“以简单和抽象的方式”执行 Java EE 应用程序。如果没有 Spring Boot,这肯定是可能的(否则 Spring Boot 永远不会存在),只是在配置方面需要做更多的工作,因为您必须根据其文档考虑特定于服务器的详细信息。例如: UndertowJetty

回到 JSF 和 Spring MVC,如果真的有必要,您可以在同一个 Web 应用程序中安全地同时运行 Spring MVC 和 JSF,但它们不会在服务器端互操作。它们将完全独立运行。如果 JSF 生成的 HTML 页面中的某些 JavaScript 碰巧在同一 Web 应用程序中调用基于 Spring 的 REST Web 服务调用,那么它们最多会在客户端相互接触。但是那个 Spring Web 服务不需要/必须知道任何关于 JSF 的信息来做出相应的响应。与 Spring REST web 服务等效的标准 Java EE 是 JAX-RS

即将推出的 Java EE 8 将基于 JSF 和 Spring MVC 的经验教训,带来一个新的基于请求的 MVC 框架,命名为“ MVC ”,从而取代 Spring MVC 并提供 JSF 的标准替代方案。

也可以看看:

原文由 BalusC 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题