ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

我的需要是创建一个吸引人的 UI。有没有一种简单的方法来使用 Spring MVC 和 JSP 作为视图技术?

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


B
BalusC

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

您可以将 Spring MVC 与 JSP view technology 一起使用。您还可以将 Spring MVC 与 Facelets view technology(和 many others)一起使用。但是您不能将 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 一起usable。您可以用 Spring 托管 bean 工具(@Component 和朋友)替换 JSF 托管 bean 工具(@ManagedBean 和朋友),通常唯一的目的是为了在 JSF 支持 bean 中使用 @Autowired。但就是这样。 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 等效项将通过 web.xml 中的 <security-constraint> 条目使用 container managed security (JAAS/JASPIC)。

同样的故事也适用于 Spring WebFlow。您还只需确保您使用的是最新版本的 Spring WebFlow,因为旧版本在与多个 JSF 组件库一起使用时会导致 conflicts。此外,从 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 将带有一个新的基于请求的 MVC 框架,命名为“MVC”,基于 JSF 和 Spring MVC 的经验,从而取代 Spring MVC 并提供 JSF 的标准替代方案。

也可以看看:

Java EE 到底是什么?

请求 MVC 和组件 MVC 的区别

Java Server Faces 2.0 的主要缺点是什么?

当 UI 可以由 CSS、HTML、JavaScript、jQuery 实现时,JSF 需要什么?

什么时候需要或方便地使用 Spring 或 EJB3 或同时使用它们?

Spring JSF 集成:如何在 JSF 托管 bean 中注入 Spring 组件/服务?

为什么从 JSF2.0 开始,Facelets 优于 JSP 作为视图定义语言?


过去,我曾将 JSF 与 Primefaces 一起使用。我读了几篇混合了两者的文章。我需要的是一种快速而干净的方式来拥有一个带有漂亮 UI 的应用程序。您会选择使用带有 jQuery 的 facelets 还是使用组件库并从 Spring MVC 转移到使用 JSF?
对不起,我不能。我对你一无所知。只要选择一个你认为/觉得最适合你自己的知识、具体功能要求和时间空间/截止日期等的。如果是我,我会选择 JSF 并在一周内准备好。原因很简单,因为我从来没有真正使用过 Spring + Spring MVC,而且需要几个月的时间才能正确地学习/掌握它。你的情况当然不一样。你不能问别人一个个人/主观的问题,你自己可以回答得最好。顺便说一句,Stack Overflow 是一个错误的地方征求意见。
确实,只是想获得专家的建议。以前只用过JSF,想以后还会继续用,放弃Spring MVC。我只是没有时间学习它,而是我会使用 JSF,但我的经验也非常有限,几个月而且只有一个非常小的项目。
@BalusC 阅读所有链接(初始)的完整答案需要一整天。但它消除了所有的疑虑。非常感谢!!
哇,这篇文章消除了很多关于 spring + JSF 组合的疑虑,还有很多其他问题!谢谢。
M
M. Deinum

Spring MVC 和 JSF 并没有真正混合。您可以将 JSF 用于与视图相关的内容,并让 Spring 管理和连接支持的(服务、daos 等)。但是尝试将@Controllers 与JSF 页面相匹配并不是一件很好的事情(除此之外,两者都是基于组件的不同堆栈请求)。

要将 Spring 与 JSF 集成,您需要将 SpringBeanFacesELResolver 添加到 faces-config.xml。这将从 Springs 应用程序上下文中查找 bean。为此,您必须使用纯 JSF 注释而不是基于 CDI 的注释。


我的想法是基于这篇文章 itcuties.com/j2ee/jsf-2-spring-3-example-the-registration-app 但是我会使用 JSF 的唯一原因是因为它是 Primefaces 之类的组件库,我如何使用纯 Spring MVC 来做同样的事情?
查找一些 JavaScript 库并为日历创建一些客户端组件。但是如前所述,您仍然可以在 Spring 之上使用 JSF,但不能拥有 Spring MVC。
事实上,我混淆了这两个概念。感谢您的回复!
M
Manoj Gupta

Spring Webflow 可以在这里提供帮助。查看此示例项目。 https://github.com/spring-projects/spring-webflow-samples/tree/master/primefaces-showcase


你把问题弄反了。此外,JSF 2.2 已经为此提供了 @FlowScoped